温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎么在Vue中实现父子组件的数据传递

发布时间:2021-04-08 17:19:50 来源:亿速云 阅读:159 作者:Leah 栏目:web开发

这篇文章将为大家详细讲解有关怎么在Vue中实现父子组件的数据传递,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

1、传递基本类型数据

当子组件内容较少时,会直接传递基本类型数据,通常为String, Number, Boolean三种。

先看个例子:

<!-- 父组件 parent.vue --> <template>   <div class="parent">     <h4>问卷调查</h4>     <child v-model="form.name"></child>     <div class="">       <p>姓名:{{form.name}}</p>     </div>   </div> </template> <script>   import child from './child.vue'   export default {     components: {       child     },     data () {       return {         form: {           name: '请输入姓名'         }       }     }   } </script>
<!-- 子组件 child.vue --> <template>   <div class="child">     <label>       姓名:<input type="text" :value="currentValue" @input="changeName">     </label>   </div> </template> <script>   export default {     props: {       // 这个 prop 属性必须是 valule,因为 v-model 展开所 v-bind 的就是 value       value: ''     },     methods: {       changeName (e) {         // 给input元素的 input 事件绑定一个方法 changeName          // 每次执行这个方法的时候都会触发自定义事件 input,并且把输入框的值传递进去。         this.$emit('input', e.target.value)       }     }   } </script>

给子组件的 input 事件绑定一个方法 changeName,每次执行这个方法的时候都会触发自定义事件 input,并且把输入框的值传递进去。

父组件通过 v-model 指令绑定一个值,来接收子组件传递过来的数据。但这样只是父组件响应子组件的数据,如果还要子组件响应父组件传递的数据,就需要给子组件定义一个props属性 value,并且这个属性必须是 value,不能写个其它单词。

v-model 其实就是一个语法糖,详情可以参考使用自定义事件的表单输入组件。

2、传递引用类型数据

当子组件里的内容比较多时,比如子组件有多个表单元素,如果还像上面那样给每个表单元素绑定值,那就要写很多重复代码了。所以这个时候通常传递的是一个对象,传值的基本原理不变,不过写法上会有些不同。

还是先看代码:

<!-- 父组件 parent.vue --> <template>   <div class="parent">     <h4>问卷调查</h4>     <child :formData.sync="form"></child>     <div class="">       <p>姓名:{{form.name}}</p>     </div>   </div> </template> <script>   import child from './child.vue'   export default {     components: {       child     },     data () {       return {         form: {           name: '请输入姓名',           age: '21'         }       }     }   } </script>
<!-- 子组件 child.vue --> <template>   <div class="child">     <label>       姓名:<input type="text" v-model="form.name">     </label>     <label>       年龄:<input type="text" v-model="form.age">     </label>     <label>       地点:<input type="text" v-model="form.address">     </label>   </div> </template> <script>   export default {     data () {       return {         form: {           name: '',           age: '',           address: ''         }       }     },     props: {       // 这个 prop 属性接收父组件传递进来的值       formData: Object     },     watch: {       // 因为不能直接修改 props 里的属性,所以不能直接把 formData 通过v-model进行绑定       // 在这里我们需要监听 formData,当它发生变化时,立即将值赋给 data 里的 form       formData: {         immediate: true,         handler (val) {           this.form = val         }       }     },     mounted () {       // props 是单向数据流,通过触发 update 事件绑定 formData,       // 将 data 里的 form 指向父组件通过 formData 绑定的那个对象       // 父组件在绑定 formData 的时候,需要加上 .sync       this.$emit('update:formData', this.form)     }   } </script>

props 是单向数据流,当我们需要对 props 内的属性进行双向绑定时,就需要用到.sync 修饰符,详情请参考.sync 修饰符,这里不做赘述。

这里需要注意的是,vue 中是不能直接修改 props 的,所以如果我们要向父组件传值,还是需要通过修改 data 里的值,prop 只是作为父子之间通话的中间人存在。

另外,如果我们想要预览父组件最开始传的数据,就需要通过 watch 监听 prop 的变化,在子组件初始化的时候就把值传进去。

注意: 我在子组件里把 this.$emit('update:formData', this.form) 放在 mounted 当中的,其原因是为了避免在每个 input 标签的 input 事件中触发自定义事件,但这样写的前提是,父子组件都要共用一个对象。

这也就是上面代码中,父组件中使用 :formData.sync="form" 绑定值时,form 是一个对象,而子组件中的触发自定义事件 this.$emit('update:formData', this.form) ,this.form 也得是一个对象。

这里还需要注意的是,如果有多个子组件使用一个对象,那就要避免这种写法,因为一个组件修改了这个对象的数据,那么其它子组件也就都跟着改变了。

所以我在用的时候都是给每个子组件分配了一个自己的对象,比如:

data () {  return {   parentObject: {    child_1_obj: {},    child_2_obj: {},   }  } }

关于怎么在Vue中实现父子组件的数据传递就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

vue
AI