Vue 子组件与数据传递问题及注意事项

时间:2021-05-26

在面对单个组件逻辑复杂需要拆分时,难免会遇到父子组件之间数据传递的问题。那么我们来了解一下在父子组件之间进行数据传递时需要遵循哪些约定,以及要注意哪些问题。

如何传递

父组件向子组件在进行传递时,使用的是prop 特性进行传递。

约定

老规矩, 在使用前我们首先了解应该怎么使用,有哪些约束条件:

  • 子组件的props 中定义要传递的变量名
  • 变量名同组件的命名规范
  • 父组件传值时,需要使用短横线分隔命名
  • 使用v-bind 进行传值

定义

首先在子组件中定义:

// Child.vue

export default { name: 'child' props: ['teamList']}

这里使用了驼峰命名 ,在传值时需注意要转换成短横线分隔命名 。

我们定义了一个teamList 的变量,此时我们就可以在这个组件中通过this 使用这个变量了(同data 中的数据)。

传值

在父组件中进行传值:

<template> <div> <child v-bind:teamList="teamList"></child> </div></template>

父组件中使用v-bind 即可将数据传递下去了。

向子组件传递数据就是这么简单,本质上和data 一样,只是这里单独使用prop 特性将其区分开来。

需要注意的时:

通过prop 特性传递下去的数组是 “单向”绑定的,父组件对数组的更新会影响到子组件。因此并不建议子组件对prop 特性中的值进行修改

Js中在传递对象和数组时传递的时引用!因此:当子组件修改父组件传递下来的对象/数组时会影响到父组件中的状态

这个特性有利有弊,在某些情况下可以通过这种类似hack 的方式来进行处理。

子组件反向传递

上面说到了,并不建议在子组件中修改props 中的数据。那么当需要向父组件进行某种反馈 时怎么办呢?

假设现在我们有一个登录弹出框的组件,通过子组件的方式调用了,当我们登录成功时该如何 通知 父组件做出相应的反应呢?

  • 通过自定义事件,子组件调用this.$emit('事件名', 参数)
  • 使用v-model 、组件中model 选项与input 事件模拟成input 控件,对父组件中的值进行更新
  • .sync 修饰符进行 “双向绑定”
  • 这里只介绍第一种方式,因为后两种方式若羽也没用过几次 o(╯□╰)o

    emit使用约定

    • 事件名的命名规范同组件
    • 父组件在绑定子组件上的自定义事件时,必须完全匹配 事件名,这里不像组件与子组件中使用时是使用的短横线分隔命名 ,而是完全匹配 。

    约定较少,主要注意使用时是和组件不同的,名称需要完全匹配。

    emit使用

    首先我们在子组件中定义事件,说是定义,不如说是调用。因为是子组件直接在某段逻辑中调用的emit :

    // child.vue

    export default { methods: { submit() { this.$emit('submitForm', this.data) } }}

    这里我们定义了调用的自定义事件名称为submitForm ,那么在父组件中使用:

    <!-- parent.vue --><template> <div> <child v-on:submitForm="submit"></child> </div></template><script>export default { methods: { submit(data) { // 处理逻辑 } }}</script>

    可以看到这里在使用时,v-on 绑定的事件名称是submitForm 而不是submit-form 。

    这一点需要注意。

    写在后面

    以上所述是小编给大家介绍的Vue 子组件与数据传递问题及注意事项 ,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
    如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

    声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

    相关文章