vue-自定义组件传值的实例讲解


Posted in Javascript onSeptember 18, 2018

项目中,我们经常会遇到自定义组件传值的问题,方法很多种,但是原理很简单,下述文档总结实际项目中使用的传值方式。

父组件传递给子组件某一值,子组件内会修改该值,然后父组件需要获取新值

在 Vue 中,父子组件的关系可以总结为 prop 向下传递,事件向上传递。父组件通过 prop给子组件下发数据,子组件通过事件给父组件发送消息。

自定义组件传值

vue-自定义组件传值的实例讲解

常规prop-event

父组件

<prop-event-value :address="address" @update="val => address = val" key="4"></prop-event-value>

<script>
import propEventValue from './components/prop-event-value.vue'
export default {
 name: 'app',
 components: {
 propEventValue
 },
 data() {
 return {
  address: ''
 }
 }
}
</script>

子组件

<template>
 <div>
  <p>prop-event</p>
  <label for="address">地址</label>
  <input type="text" id="address" v-model="tempAddress">
 </div>
</template>

<script>
 export default {
 name: 'prop-event',
 props: ['address'],
 data() {
  return {
  tempAddress: this.address
  }
 },
 watch: {
  tempAddress(newVal) {
  this.$emit('update', newVal)
  }
 }
 }
</script>

需要注意:不要直接在子组件内操作父组件的内容

组件实例的作用域是孤立的。每次父组件更新时,子组件的所有 prop 都会更新为最新值。这意味着不能 (也不应该) 在子组件的模板内直接引用父组件的数据。如果你这么做了,Vue 会在控制台给出警告。

export default {
 name: 'prop-event',
 props: ['address'],
 watch: {
 address(newVal) {
  this.$emit('update', newVal)
 }
 }
}

如将上述代码替换子组件,内容会报错!

vue-自定义组件传值的实例讲解

修饰符.sync

父组件

<my-sync-value :address.sync="address" key="5"></my-sync-value>

<script>
import mySyncValue from './components/my-sync-value.vue'
export default {
 name: 'app',
 components: {
 mySyncValue
 },
 data() {
 return {
  address: ''
 }
 }
}
</script>

子组件

<template>
 <div>
 <p>my-sync</p>
 <label for="address">地址</label>
 <input type="text" id="address" v-model="tempAddress">
 </div>
</template>

<script>
 export default {
 name: 'my-sync',
 props: ['address'],
 data() {
  return {
  tempAddress: this.address
  }
 },
 watch: {
  tempAddress(newVal) {
  // 必须是这个update:address
  this.$emit('update:address', newVal)
  }
 }
 }
</script>

prop-update:[prop]语法糖,与prop-event对比的优势:父组件无需监听事件@update="val => address = val",自动监听update:[prop]事件。

双向数据绑定v-model

所以要让组件的 v-model 生效,它应该 (从 2.2.0 起是可配置的):

接受一个 value prop

在有新的值时触发 input 事件并将新值作为参数

父组件

<my-vmodel-value v-model="address" key="6"></my-vmodel-value>

<script>
import myVmodelValue from './components/my-vmodel-value.vue'
export default {
 name: 'app',
 components: {
 myVmodelValue
 },
 data() {
 return {
  address: ''
 }
 }
}
</script>

子组件

<template>
 <div>
 <p>my-vmodel</p>
 <label for="address">姓名</label>
 <input type="text" id="address" v-model="tempAddress">
 </div>
</template>

<script>
 export default {
 name: 'my-vmodel',
 props: ['value'],
 data() {
  return {
  tempAddress: this.value
  }
 },
 watch: {
  tempAddress(newVal) {
  // 必须是input
  this.$emit('input', newVal)
  }
 }
 }
</script>

prop-input语法糖,父组件v-model默认监听input事件

需要注意,这里必须触发input事件,当然也可以自定v-model属性值和事件,请参照自定义组件的v-model

vuex

通过store传值,这里后续单独讲述vuex。

单向数据流

上述已经提及,在子组件内部改变 prop,Vue会在控制台给出告警。但经常开发周静,我们很容易忍不住修改prop中的数据,如:

Prop 作为初始值传入后,子组件想把它当作局部数据来用;

Prop 作为原始数据传入,由子组件处理成其它数据输出。

对这两种情况,正确的应对方式是:

问题1:定义一个局部变量,并用 prop 的值初始化它:

props: ['initialCounter'],
data: function () {
 return { counter: this.initialCounter }
}

问题2:定义一个计算属性,处理 prop 的值并返回:

props: ['size'],
computed: {
 normalizedSize: function () {
 return this.size.trim().toLowerCase()
 }
}

特别需要注意:在 JavaScript 中对象和数组是引用类型,指向同一个内存空间,如果 prop 是一个对象或数组,在子组件内部改变它会影响父组件的状态。

以上这篇vue-自定义组件传值的实例讲解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery获取地址栏参数插件(模仿C#)
Oct 26 Javascript
jquery 学习之二 属性(html()与html(val))
Nov 25 Javascript
基于PHP+Jquery制作的可编辑的表格的代码
Apr 10 Javascript
JQUERY1.6 使用方法四 检测浏览器
Nov 23 Javascript
侧栏跟随滚动的简单实现代码
Mar 18 Javascript
display和visibility的区别示例介绍
Feb 26 Javascript
JS获取文件大小方法小结
Dec 08 Javascript
jQuery打字效果实现方法(附demo源码下载)
Dec 18 Javascript
微信小程序页面开发注意事项整理
May 18 Javascript
Angular2的管道Pipe的使用方法
Nov 07 Javascript
js中int和string数据类型互相转化实例
Jan 16 Javascript
利用JS如何获取form表单数据
Dec 19 Javascript
vuex actions传递多参数的处理方法
Sep 18 #Javascript
微信小程序搭建(mpvue+mpvue-weui+fly.js)的详细步骤
Sep 18 #Javascript
详解关于Vue2.0路由开启keep-alive时需要注意的地方
Sep 18 #Javascript
Vue中 key keep-alive的实现原理
Sep 18 #Javascript
vue服务端渲染页面缓存和组件缓存的实例详解
Sep 18 #Javascript
从Vuex中取出数组赋值给新的数组,新数组push时报错的解决方法
Sep 18 #Javascript
vue服务端渲染添加缓存的方法
Sep 18 #Javascript
You might like
PHP中读取照片exif信息的方法
2014/08/20 PHP
php使用mysqli向数据库添加数据的方法
2015/03/20 PHP
PHP连接操作access数据库实例
2015/03/30 PHP
php 可变函数使用小结
2018/06/12 PHP
PHP7导出Excel报ERR_EMPTY_RESPONSE解决方法
2019/04/16 PHP
thinkphp5.1框架模板赋值与变量输出示例
2020/05/25 PHP
jquery中ajax学习笔记3
2011/10/16 Javascript
当json键为数字时的取值方法解析
2013/11/15 Javascript
关闭浏览器时提示onbeforeunload事件
2013/12/25 Javascript
textarea焦点的用法实现获取焦点清空失去焦点提示效果
2014/05/19 Javascript
5个数组Array方法: indexOf、filter、forEach、map、reduce使用实例
2015/01/29 Javascript
原生Javascript和jQuery做轮播图简单例子
2016/10/11 Javascript
理解javascript中的闭包
2017/01/11 Javascript
JavaScript 总结几个提高性能知识点(推荐)
2017/02/20 Javascript
JavaScript实现审核流程状态的动态显示进度条
2017/03/15 Javascript
微信小程序 数据遍历的实现
2017/04/05 Javascript
javascript流程控制语句集合
2017/09/18 Javascript
ES10 特性的完整指南小结
2019/03/04 Javascript
简述ES6新增关键字let与var的区别
2019/08/23 Javascript
解决layui-open关闭自身窗口的问题
2019/09/10 Javascript
es6中reduce的基本使用方法
2019/09/10 Javascript
JS监听组合按键思路及实现过程
2020/04/17 Javascript
vue实现购物车案例
2020/05/30 Javascript
python DataFrame转dict字典过程详解
2019/12/26 Python
python 写函数在一定条件下需要调用自身时的写法说明
2020/06/01 Python
CSS3改变浏览器滚动条样式
2019/01/04 HTML / CSS
美国在线健康和美容市场:Pharmapacks
2018/12/05 全球购物
影视动画专业个人的自我评价
2013/12/31 职场文书
演讲比赛获奖感言
2014/02/02 职场文书
教师读书活动总结
2014/05/07 职场文书
流动人口婚育证明
2014/10/19 职场文书
先进教师个人总结
2015/02/11 职场文书
孔繁森观后感
2015/06/10 职场文书
感恩教师节主题班会
2015/08/12 职场文书
MySQL 外键约束和表关系相关总结
2021/06/20 MySQL
win10如何开启ahci模式?win10开启ahci模式详细操作教程
2022/07/23 数码科技