Vue表单类的父子组件数据传递示例_vue.js_脚本之家

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

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

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

1、传递基本类型数据

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

先看个例子:

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

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

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

1

2

3

4

5

6

7

8

data () {

 return {

  parentObject: {

   child_1_obj: {},

   child_2_obj: {},

  }

 }

}

这是在父组件里定义的数据,当然名字不会这样取了。

结尾

也没什么说的了,对 Vue 还是处于使用的阶段,对其底层的东西了解还不够,我也好想读读源码,但总只是想想.....大家觉得有什么不妥的地方尽管说,大家相互交流交流。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/248869.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jmeter-【JSON Extractor】-响应结果中三级key取值

一、请求返回样式 二、取第三个option 三、查看结果 转载于:https://www.cnblogs.com/Nancy-Lee/p/10938758.html

Day5:python之函数(3)

一、函数默认值参数 内置函数&#xff1a; input&#xff08;&#xff09;、print&#xff08;&#xff09;、int&#xff08;&#xff09; 常用模块&#xff1a; 1、列表生成式 s [1,2,3,4,5,6,7,8] for i in s:print(i1) res [ i1 for i in s] res [str(i) for i in s]prin…

vue路由传参的三种基本方式 - 流年的樱花逝 - SegmentFault 思否

现有如下场景&#xff0c;点击父组件的li元素跳转到子组件中&#xff0c;并携带参数&#xff0c;便于子组件获取数据。 父组件中&#xff1a; <li v-for"article in articles" click"getDescribe(article.id)"> methods&#xff1a; 方案一&#…

Rust从入门到放弃(1)—— hello,world

安装及环境配置 特点&#xff1a;安全&#xff0c;性能&#xff0c;并发rust源配置RLS安装cargo rust管理工具&#xff0c;该工具可以愉快方便的管理rust工程 #!/bin/bash mkdir learn cd learn cargo init ## 该命令会在当前目录下初始化一个## 目录下会出现一个Cargo.toml文…

牛客33-tokitsukaze and Number Game(数论)

题目描述 tokitsukaze又在玩3ds上的小游戏了&#xff0c;现在她遇到了难关。 tokitsukaze得到了一个整数x&#xff0c;并被要求使用x的每一位上的数字重新排列&#xff0c;组成一个能被8整除的数&#xff0c;并且这个数尽可能大。 聪明的你们请帮帮可爱的tokitsukaze&#xff0…

手摸手,带你用vue撸后台 系列一(基础篇) - 掘金

完整项目地址&#xff1a;vue-element-admin 系列文章&#xff1a; 手摸手&#xff0c;带你用 vue 撸后台 系列一&#xff08;基础篇&#xff09;手摸手&#xff0c;带你用 vue 撸后台 系列二(登录权限篇)手摸手&#xff0c;带你用 vue 撸后台 系列三 (实战篇)手摸手&#xf…

21、python基础学习-new_three_menu

1 #!/usr/bin/env python2 #__author: hlc3 #date: 2019/5/294 5 menu {6 北京: {7 海淀: {8 五道口: {9 soho: {}, 10 网易: {}, 11 google: {} 12 }, 13 中关村: { 14 …

文献笔记(十六)

一、基本信息 标题&#xff1a;一种基于 C 语言访问 MySQL 数据库的研究 时间&#xff1a;2016 出版源&#xff1a;贵州轻工职业技术学院 领域分类&#xff1a;数据库与信息管理 作者&#xff1a;唐林 副教授&#xff0c; 研究方向&#xff1a; 计算机应用 二、研究背景 相关工…

webpack+vue+mui学习心得

引入mui 1.不需要npm安装; 直接从官方下载丢进来 2.那就是全局引用了; 没错,就是index.html里直接引入,当然也可以main.js引入,随意啦! so easy 3.找到webpack.base.conf.js,在module与plugins之间插入以下代码: 4.这样就可以在项目里面直接用了.然就是mui与vue-router及点…

[java设计模式简记] 观察者模式(Observer-Pattern)

观察者模式(Observer-Pattern) 数据主体拥有需要数据的对象的数据&#xff0c;并且数据改变时需要数据的对象要及时知道 意图&#xff1a; 定义对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都得到通知并被自动更新。主要…

【ARTS】01_04_左耳听风-20181203~1209

ARTS&#xff1a; Algrothm: leetcode算法题目Review: 阅读并且点评一篇英文技术文章Tip/Techni: 学习一个技术技巧Share: 分享一篇有观点和思考的技术文章Algorithm Single Number https://leetcode.com/problems/single-number/ 1&#xff09;problem Given a non-empty arra…

vue项目(webpack+mintui),使用hbuilder打包app - 小小人儿大大梦想 - 博客园

一、配置config/index.js 本人没有配置index.js文件&#xff0c;就开始进行了打包&#xff0c;结果最终效果是页面空白&#xff0c;解决了空白&#xff0c;接着底部图标&#xff08;我是用的阿里巴巴图片&#xff09;资源找不到。所以配置这步比较重要。 &#xff08;1&#…

caffe介绍

转载于:https://www.cnblogs.com/Artimis-fightting/p/10945099.html

python-mysql 基础知识记录

cursor.fetchone() 与 cursor.fetchall() 如果查询结果为空&#xff0c;前者返回 None&#xff0c;后者返回[] 此时如用 len() 函数计算长度&#xff0c;前者报错&#xff0c;后者返回0 转载于:https://www.cnblogs.com/ZuoAn-xieyang/p/10097230.html

微服务之consul(一) - 诗码者 - 博客园

一、概述 consul是google开源的一个使用go语言开发的服务发现、配置管理中心服务。内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案&#xff0c;不再需要依赖其他工具&#xff08;比如ZooKeeper等&#xff09;。服务部署简单&#x…

C#动态加载dll,dll目录指定

<?xml version"1.0"?><configuration><startup> <supportedRuntime version"v4.0" sku".NETFramework,Versionv4.0"/></startup> <runtime> <assemblyBinding xmlns"urn:schemas-microsoft-com:a…

RestFramework之认证组件

一、认证组件的介绍 对于认证&#xff0c;我们一般有三种方式&#xff0c;即cookie, session,token, cookie,是将信息存放在客户端(浏览器上)&#xff0c;信息不安全&#xff1b;session,把信息放在服务器数据库中&#xff0c;但是要是信息量较大&#xff0c;对服务器的压力就会…

图解基于 Node.js 实现前后端分离 - CSDN博客

因为会上出了个意外&#xff0c;ppt图片全部丢失&#xff0c;只好对着白板跟大家交流了半个多小时。由于我做演讲不喜欢写太多的文字&#xff0c;没有图片的情况下讲漏了一些内容。这篇文章是我在会上分享内容对照ppt进行地整理。 基本介绍 首先从一个重要的概念“模板”说起…

java基础之XML

目录 java基础之XML1. XML解析概述2. DOM4J介绍2.1 常用包2.2 内置元素2.2 Element类2.3 Attribute类2.4 常用操作3. 代码演示3.1 DOM4J读取xml文件3.2 DOM4J创建xml文件3.2 DOM4J修改xml文件java基础之XML XML是一种通用的数据交换格式,它的平台无关性、语言无关性、系统无关性…

CF176E Archaeology(set用法提示)

题目大意&#xff1a; 给一棵树&#xff0c;每次激活或熄灭一个点&#xff0c;每次问这些点都联通起来所需的最小总边权 分析&#xff1a; 若根据dfs序给所有点排序&#xff0c;为$v1,v2,v3....vk$&#xff0c;那么答案就是$(dis(v1,v2)dis(v2,v3)...dis(vk-1,vk)dis(vk,v1))/2…