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

简介

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. 蓝桥杯——代表团出访——C++

    问题描述: X星球要派出一个5人组成的观察团前往W星. 其中: A国最多可以派出4人. B国最多可以派出2人. C国最多可以派出2人. D国最多可以派出1人. E国最多可以派出1人. F国最多可以派出 ...

  2. Kotlin基础(三)类、对象和接口

    类.对象和接口 一.定义类的继承结构 一)Kotlin中的接口 Kotlin的接口与Java8中相似,它们可以包含抽象方法的定义以及非抽象方法的实现,但它们不能包含任何状态. interface Cl ...

  3. LeetCode(122. 买卖股票的最佳时机 II)

    问题描述 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参与多笔交易(你 ...

  4. [CF1039D]You Are Given a Tree

    [CF1039D]You Are Given a Tree 题目大意: 给定一棵\(n(n\le10^5)\)个节点的树.对于每一个正整数\(k(1\le k\le n)\),求最多能找出多少条包含\ ...

  5. windows提交代码到git仓库

    进入git bash git config --global user.name '仓库名' git config --global user.email '2531099@163.com' git ...

  6. 回文检测 [USACO Training Section 1.3]

    题目描述 据说如果你给无限只母牛和无限台巨型便携式电脑(有非常大的键盘),那么母牛们会制造出世上最棒的回文.你的工作就是去寻找这些牛制造的奇观(最棒的回文). 在寻找回文时不用理睬那些标点符号.空格( ...

  7. Centos 7 安装配置

    修改网卡 最小化安装没有安装vim,暂时使用vi 进入到network-scripts 目录 [root@node1 ~]# cd /etc/sysconfig/network-scripts/ [r ...

  8. Yii2 数据搜索类 PostSearch

    数据搜索类 PostSearch /** * @Purpose : 添加 authorName 属性,使属性和搜索表单相对应 * @return array */ public function at ...

  9. git clone 报错

    1,问题 Cloning into 'project-name'... ssh: Could not resolve hostname gerrit.firewinggames.com: nodena ...

  10. Linux进程管理学习资料

    下面是一些Linux进程管理相关的资料. 博客 Process Creation(一) Process Creation(二) 进程切换分析(1):基本框架 进程切换分析(2):TLB处理 When ...