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


Posted in Javascript onJuly 11, 2019

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

如何传递

父组件向子组件在进行传递时,使用的是 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 中的数据。那么当需要向父组件进行某种 反馈 时怎么办呢?

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

  1. 通过自定义事件,子组件调用 this.$emit('事件名', 参数)
  2. 使用 v-model 、组件中 model 选项与 input 事件模拟成 input 控件,对父组件中的值进行更新
  3. .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 子组件与数据传递问题及注意事项 ,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
Javascript MD4
Dec 20 Javascript
Mac/Windows下如何安装Node.js
Nov 22 Javascript
jQuery对Select的操作大集合(收藏)
Dec 28 Javascript
Js实现滚动变色的文字效果
Jun 16 Javascript
angularjs中的e2e测试实例
Dec 06 Javascript
javascript移动开发中touch触摸事件详解
Mar 18 Javascript
jquery 校验中国身份证号码实例详解
Apr 11 jQuery
Vuex和前端缓存的整合策略详解
May 09 Javascript
详解Vue2.0配置mint-ui踩过的那些坑
Apr 23 Javascript
vue框架搭建之axios使用教程
Jul 11 Javascript
vue路由--网站导航功能详解
Mar 29 Javascript
js实现小星星游戏
Mar 23 Javascript
ES6的异步终极解决方案分享
Jul 11 #Javascript
微信小程序的开发范式BeautyWe.js入门详解
Jul 10 #Javascript
实现一个 Vue 吸顶锚点组件方法
Jul 10 #Javascript
vue webpack重写cookie路径的方法
Jul 10 #Javascript
vue登录页面cookie的使用及页面跳转代码
Jul 10 #Javascript
Laravel admin实现消息提醒、播放音频功能
Jul 10 #Javascript
微信小程序把百度地图坐标转换成腾讯地图坐标过程详解
Jul 10 #Javascript
You might like
PHP图像处理类库及演示分享
2015/05/17 PHP
Yii2创建表单(ActiveForm)方法详解
2016/07/23 PHP
PHP使用GD库输出汉字的方法【测试可用】
2016/11/10 PHP
PHP实现的MD5结合RSA签名算法实例
2017/10/07 PHP
google 搜索框添加关键字实现代码
2010/04/24 Javascript
Jquery 获取checkbox的checked问题
2011/11/16 Javascript
jQuery固定浮动侧边栏实现思路及代码
2014/09/28 Javascript
angular.foreach 循环方法使用指南
2015/01/06 Javascript
Zero Clipboard实现浏览器复制到剪贴板的方法(多个复制按钮)
2016/03/24 Javascript
Bootstrap中的表单验证插件bootstrapValidator使用方法整理(推荐)
2016/06/21 Javascript
JS控制页面跳转时未请求要跳转的地址怎么回事
2016/10/14 Javascript
写jQuery插件时的注意点
2017/02/20 Javascript
JS判断微信扫码的方法
2017/08/07 Javascript
封装运动框架实战左右与上下滑动的焦点轮播图(实例)
2017/10/17 Javascript
jQuery实现可以扩展的日历
2020/12/01 jQuery
通过mod_python配置运行在Apache上的Django框架
2015/07/22 Python
Python for Informatics 第11章 正则表达式(一)
2016/04/21 Python
python实现获取Ip归属地等信息
2016/08/27 Python
python的继承知识点总结
2018/12/10 Python
Python开发网站目录扫描器的实现
2019/02/21 Python
django settings.py 配置文件及介绍
2019/07/15 Python
一款纯css3制作的2015年元旦雪人动画特效教程
2014/12/29 HTML / CSS
意大利中国电子产品购物网站:Geekmall.com
2019/09/30 全球购物
Michael Kors英国官网:美国奢侈品品牌
2019/11/13 全球购物
导游实习生自荐书
2014/01/28 职场文书
奥巴马就职演讲稿
2014/05/15 职场文书
大学生毕业求职信
2014/06/12 职场文书
软环境建设心得体会
2014/09/09 职场文书
校园新闻广播稿5篇
2014/10/10 职场文书
2014年世界艾滋病日宣传活动总结
2014/11/18 职场文书
个人租房协议书
2014/11/28 职场文书
2014年电话销售工作总结
2014/12/01 职场文书
语文复习计划
2015/01/19 职场文书
2015年团支部年度工作总结
2015/05/27 职场文书
执行力心得体会范文
2016/01/11 职场文书
Redis 哨兵机制及配置实现
2022/03/25 Redis