虚位以待(AD)
虚位以待(AD)
首页 > 网页特效 > JavaScript > Vue表单类的父子组件数据传递示例

Vue表单类的父子组件数据传递示例
类别:JavaScript   作者:码皇   来源:互联网   点击:

本篇文章主要介绍了Vue表单类的父子组件数据传递示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

使用Vue.js进行项目开发,那必然会使用基于组件的开发方式,这种方式的确给开发和维护带来的一定的便利性,但如果涉及到组件之间的数据与状态传递交互,就是一件麻烦事了,特别是面对有一大堆表单的页面。

在这里记录一下我平时常用的处理方式,这篇文章主要记录父子组件间的数据传递,非父子组件主要通过Vuex处理,这篇文章暂时不作说明。

与文档里给的方案一样,父组件向子组件传递数据主要通过 props,子组件向父组件传递数据主要通过触发器 $emit(),只是在用法上会有些不同。

1、传递基本类型数据

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

先看个例子:

    <!-- 父组件 parent.vue --><template> <div class="parent"> <h3>问卷调查</h3> <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"> <h3>问卷调查</h3> <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 还是处于使用的阶段,对其底层的东西了解还不够,我也好想读读源码,但总只是想想.....大家觉得有什么不妥的地方尽管说,大家相互交流交流。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

您可能感兴趣的文章:

  • 使用Vue动态生成form表单的实例代码
  • 详解vue表单——小白速看
  • Vue.js 表单控件操作小结
  • Vue.js实现可配置的登录表单代码详解
  • vue axios 表单提交上传图片的实例
  • Vue.js自定义事件的表单输入组件方法
  • Vue+ElementUI实现表单动态渲染、可视化配置的方法
  • vue中动态绑定表单元素的属性方法
  • Vue 表单控件绑定的实现示例
  • vue自动化表单实例分析
相关热词搜索: vue父子组件传递数据 vue js父子组件的传递