Vue表单类的父子组件数据传递示例

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

<!-- 父组件 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>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

<!-- 子组件 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、传递引用类型数据

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

还是先看代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

<!-- 父组件 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>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

<!-- 子组件 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 也得是一个对象。

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

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

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
ics/618191877)

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 14
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值