• 猿创征文|vue组件之间的传值


    前言

    目前在做vue的项目,用到了子组件依赖其父组件的数据,进行子组件的相关请求和页面数据展示,父组件渲染需要子组件通知更新父组件的state,父子组件之间的传值一般有三种方法:

    1. 父传子
    2. 子传父
    3. 非父子传值

    注意:

    父子组件的关系可以总结为 prop 向下传递,事件向上传递。父组件通过 prop 给子组件下发数据,子组件通过事件给父组件发送消息。

     接下来,我们会通过实例代码来看的更清晰,理解更容易:

    目录

    前言

    1.父组件向子组件进行传值

     父组件代码:

    子组件代码:

    2.子组件向父组件进行传值

    父组件代码

    子组件代码

    3.非父子组件之间的传值 

    ​编辑

    父组件代码

    子组件代码

    总结


    1.父组件向子组件进行传值

     父组件代码:

    1. <template>
    2. <div>
    3. 父组件:
    4. <el-input v-model="val" style="width:300px" />
    5. <child :value="val" />
    6. </div>
    7. </template>
    8. <script>
    9. import child from './child.vue'
    10. export default {
    11. name: 'Parent',
    12. data() {
    13. return {
    14. val: '我是父组件'
    15. }
    16. },
    17. components: {
    18. child
    19. },
    20. }
    21. </script>

    子组件代码:

    1. <template>
    2. <div class="child">
    3. 子组件: {{ value }}
    4. </div>
    5. </template>
    6. <script>
    7. export default {
    8. name: 'App',
    9. data() {
    10. return {
    11. }
    12. },
    13. props: ['value']
    14. }
    15. </script>
    16. <style scoped>
    17. .child {
    18. margin-top: 20px;
    19. }
    20. </style>

    2.子组件向父组件进行传值

    父组件代码

    1. <template>
    2. <div>
    3. 父组件:
    4. <el-input v-model="val" style="width:300px" />
    5. <child :value="val" @bindMsg='msgFun' />
    6. </div>
    7. </template>
    8. <script>
    9. import child from './child.vue'
    10. export default {
    11. name: 'Parent',
    12. data() {
    13. return {
    14. val: '我是父组件'
    15. }
    16. },
    17. components: {
    18. child
    19. },
    20. methods: {
    21. msgFun(childVal) {
    22. console.log(childVal,'childVal')
    23. this.val = childVal
    24. }
    25. }
    26. }
    27. </script>

    子组件代码

    1. <template>
    2. <div class="child">
    3. 子组件: {{ value }}
    4. <el-button @click="$emit('bindMsg', '我是子组件')">点击改变父组建数据</el-button>
    5. </div>
    6. </template>
    7. <script>
    8. export default {
    9. name: 'App',
    10. data() {
    11. return {
    12. }
    13. },
    14. props: ['value'],
    15. }
    16. </script>
    17. <style scoped>
    18. .child {
    19. margin-top: 20px;
    20. }
    21. </style>

    3.非父子组件之间的传值 

    .sync可以帮我们实现父组件向子组件传递的数据的双向绑定,所以子组件接收到数据后可以直接修改,并且会同时修改父组件的数据

    ref绑定在子组件上,引用的指向就是子组件的实例,父组件可以通过 ref 主动获取子组件的属性或者调用子组件的方法

    父组件代码

    1. <template>
    2. <div>
    3. 父组件:
    4. <el-input v-model="val" style="width:300px" />
    5. <el-button @click="childRefClick">父组件ref点击</el-button>
    6. <child :value="val" @bindMsg='msgFun' :data.sync='data' ref='child' />
    7. </div>
    8. </template>
    9. <script>
    10. import child from './child.vue'
    11. export default {
    12. name: 'Parent',
    13. data() {
    14. return {
    15. val: '我是父组件',
    16. data: ''
    17. }
    18. },
    19. components: {
    20. child
    21. },
    22. methods: {
    23. msgFun(childVal) {
    24. console.log(childVal, 'childVal')
    25. this.val = childVal;
    26. },
    27. childRefClick() {
    28. //ref获取子组件实例的属性和方法
    29. const child = this.$refs.child
    30. console.log(child.name)
    31. child.childBtnClick("调用了子组件的方法")
    32. }
    33. }
    34. }
    35. </script>

    子组件代码

    1. <template>
    2. <div class="child">
    3. 子组件: {{ value }}
    4. <el-button @click="childBtnClick">点击改变父组建数据</el-button>
    5. </div>
    6. </template>
    7. <script>
    8. export default {
    9. name: 'App',
    10. data() {
    11. return {
    12. currenData: {}
    13. }
    14. },
    15. props: ['value', 'data'],
    16. methods: {
    17. childBtnClick(val) {
    18. console.log(val,'val')
    19. this.$emit('bindMsg', val || '我是子组件')
    20. },
    21. },
    22. }
    23. </script>
    24. <style scoped>
    25. .child {
    26. margin-top: 20px;
    27. }
    28. </style>

    非父子组件之间的传值方式还有slot插槽,vuex数据状态管理器等等

    总结

    主要用到了父子组件的传值,props,$emit,ref,sync等方法,父子组件之间的传值,十分常见,只要我们用会了组件之间的传数据的方法,对于前端的组件抽离,性能提升都有很大的好处。

  • 相关阅读:
    Linux命令详解(14)useradd命令
    User 10 must be unlocked for widgets to be available
    ArcGIS Pro SDK (七)编辑 5 编辑已完成事件
    Ceph入门到精通-iptables 限制多个ip 的多个端口段访问
    迄今为止丨ChatGPT最强指令,一个可以让机器人生成机器人的Prompt,价值百万!
    p15~p22基本链表容器和高级链表容器迭代器
    C++ 设计模式 —— 组合模式
    flask使用Flask-Mail实现邮件发送
    【C++】使用ort推理yolov10
    uniapp HBuilder 无法运行微信小程序的问题解决
  • 原文地址:https://blog.csdn.net/weixin_42974827/article/details/126651267