[本文出自天外归云的博客园]

简介

Vue版本:2.9.6

Element版本:2.4.8

问题描述:子组件对Element中el-select进行封装,父组件中把选中的值selected和所有选项options传给子组件,当子组件中选中的option发生改变时,通知父组件并更新父组件中的selected值

问题本质:在子组件中接收父组件中传递过来的值A,当值A在子组件中发生改变,通知父组件并在父组件中更新值A

代码

1. 父组件中引入并调用子组件,传给子组件fatherSelected和fatherOptions两个变量值,内容如下:

<template>
<div>
<SelectOption :selected.sync="fatherSelected"
:options="fatherOptions"></SelectOption>
</div>
</template> <script>
import { SelectOption } from '@/components/common' export default {
name: 'Father',
data () {
return {
fatherOptions: [{'label': 'lab1', 'value': 'val1', 'id':'id1'}, {'label': 'lab2', 'value': 'val2', 'id':'id2'}],
fatherSelected: ''
}
}
}
</script>

2. 路径'@/components/common'下创建一个index.js文件导出子组件,内容如下:

export { default as SelectOption } from './SelectOption'

3. 子组件,用props定义从父组件接收传参的变量selected和options,内容如下:

<template>
<div class="selectOption">
<el-select v-model="mySelected"
filterable
@change="changeSelected">
<el-option v-for="option in options"
:key="option.id"
:label="option.label"
:value="option.value">
</el-option>
</el-select>
</div>
</template>
<style>
.selectOption {
margin-top: 30px;
}
</style>
<script>
export default {
props: ['selected', 'options'],
data: function () {
return {
mySelected: this.selected
}
},
methods: {
changeSelected: function () {
this.$emit('update:selected', this.mySelected)
}
}
}
</script>

注意事项

1. 子组件中接收父组件的值selected后,一定要保存到子组件作用域中的一个变量mySelected中

2. 当mySelected的值发生改变,@change监听会触发函数changeSelected执行

3. 通过thie.$emit来通知父组件进行update入参selected的值,对应更新父组件中的fatherSelected变量值

4. 对于允许子组件通知并进行改变的值fatherSelected一定要加 ".sync" 处理

5. 特别需要注意的是,假如selected的值在父组件中是异步获取的,还需要在子组件中对父组件的传值props中的selected变量加上watch监听,以便针将父组件中的变量值变化同步到子组件中,把上面的script部分代码更新为下面这段:

<script>
export default {
props: ['selected', 'options'],
data: function () {
return {
mySelected: this.selected
}
},
methods: {
changeSelected: function () {
this.$emit('update:selected', this.mySelected)
}
},
watch: {
selected: function () {
this.mySelected = this.selected
}
}
}
</script>

这样一旦父组件中的值异步更新后,子组件监听到父组件传递的selected变量值发生变化时就会自动更新子组件中的mySelected变量值。注意!手动的改变option的值是触发子组件中的@change事件,而父组件中的传值异步更新并不会触发子组件的@change事件。所以总结如下:

1. @change触发的事件在是在子组件的变量值发生变化时更新给父组件中对应的变量值用的

2. 子组件中的watch变量值是在父组件props的变量值发生变化时更新给子组件用的

Vue父子组件双向数据绑定的更多相关文章

  1. vue 父子组件双向绑定

    vue组件有2大特性: 1.全局组件和局部组件 2.父子组件的数据传递 接下来直接用demo直接看如何传值(静态传值) father.vue <template> <div> ...

  2. vue父子组件状态同步的最佳方式续章(v-model篇)

    大家好!我是木瓜太香!一名前端工程师,之前写过一篇<vue父子组件状态同步的最佳方式>,这篇文章描述了大多数情况下的父子组件同步的最佳方式,也是被开源中国官方推荐了,在这里表示感谢! 这次 ...

  3. vue父子组件之间传值

    vue父子组件进行传值 vue中的父子组件,什么是父组件什么是子组件呢?就跟html标签一样,谁包裹着谁谁就是父组件,被包裹的元素就是子组件. 父组件向子组件传值 下面用的script引入的方式,那种 ...

  4. vue父子组件的传值总结

    久违的博客园我又回来了.此篇文章写得是vue父子组件的传值,虽然网上已经有很多了.写此文章的目的就是记录下个人学习的一部分.接下来我们就进入主题吧! 在开发vue项目中,父子组件的传值是避免不掉的. ...

  5. 【转】vue父子组件之间的通信

    vue父子组件之间的通信 在vue组件通信中其中最常见通信方式就是父子组件之中的通性,而父子组件的设定方式在不同情况下又各有不同.最常见的就是父组件为控制组件子组件为视图组件.父组件传递数据给子组件使 ...

  6. Vue父子组件生命周期

    转载自:https://blog.csdn.net/a8725585/article/details/79092505 vue父子组件钩子函数触发顺序 beforeMount后mounted前构造子组 ...

  7. Angular中父子组件双向绑定传值

    下面为大家展示一个较为简单的ng父子组件双向绑定传值,下面是父组件页面 这个页面的大概功能就是父组件(红色)通过输入框输入内容反映到子组件上进行展示,并且进行了投影, 子组件(橙黄色)通过Input输 ...

  8. vue父子组件传值加例子

    例子:http://element-cn.eleme.io/#/zh-CN/component/form         上进行改的 父传子:用prop:子组件能够改变父组件的值,是共享的,和父操作是 ...

  9. vue 父子组件通信详解

    这是一篇详细讲解vue父子组件之间通信的文章,初始学习vue的时候,总是搞不清楚几个情况 通过props在父子组件传值时,v-bind:data="data",props接收的到底 ...

随机推荐

  1. Adams输出宏代码

    for variable_name=loopobj object_names=.amachinery.* type=macro var set var=filename1 str=(eval(STR_ ...

  2. C语言中存储类别又分为四类:自动(auto)、静态(static)、寄存器的(register)和外部的(extern)。

    除法运算中注意: 如果相除的两个数都是整数的话,则结果也为整数,小数部分省略,如8/3 = 2:而两数中有一个为小数,结果则为小数,如:9.0/2 = 4.500000. 取余运算中注意: 该运算只适 ...

  3. Linux服务部署--Java(二)

    八.Maven安装配置 1. 下载 wget http://mirrors.cnnic.cn/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3. ...

  4. python基础一 ------linux某目录下批量的为特定文件加入可执行权限

    需求: 一个文件夹中有个文件,要求对特定的文件加入可执行权限 某文件系统目录下有一系列文件:    quicksort    graph.py    heap.java    install.sh   ...

  5. 【开源GPS追踪】 之 服务器端opengts安装

    国内大多数GPS追踪/定位 平台都是基于opengts 二次开发的,opengts 是一款开源的gps 跟踪软件. 下面摘自百度百科: OpenGTS ™(“GPS跟踪系统”)是第一个可用的开源项目, ...

  6. 如何提高sql查询速度

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  7. JAVA自学笔记21

    JAVA自学笔记21 1.转换流 由于字节流操作中文不是非常方便,因此java提供了转换流 字符流=字节流+编码表 1)编码表 由字符及其对应的数值组成的一张表 图解: 2)String类的编码和解码 ...

  8. 20180821 Python学习笔记:如何获取当前程序路径

    20180821 Python学习笔记:如何获取当前程序路径 启动的脚本的路径为:D:\WORK\gitbase\ShenzhenHouseInfoCrawler\main.py 当前脚本的路径为:D ...

  9. spring @Transactional 事务注解

    @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.SERIALIZABLE, rollbackFor = ...

  10. NLP 第10章 基于深度学习的NLP 算法