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

简介

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. 在notepad++中修改换行符

    在notepad++中编辑时,将按tab键设置为插入4个空格而不是tab字符

  2. [OC] Block的使用

    由ControllerA跳转到controllerB,在controllerB中选择一个参数的值,并将它传回给controllerA. 首先,在controllerB的.h文件中写入: @interf ...

  3. DRF的视图

    DRF的视图 APIView 我们django中写CBV的时候继承的是View,rest_framework继承的是APIView,那么他们两个有什么不同呢~~~ urlpatterns = [    ...

  4. [Python]list.append字典的时候,修改字典会导致list内容变化的问题

    今天写了这样的一段代码,出现了BUG. log_message["EventName"] = "上架->可用" log_message["Eve ...

  5. Tomcat安装与环境变量的配置

    Tomacat的下载  去Tomcat官网下载,我使用的是apache-tomcat-7.0.78的版本. 安装  下载完成之后,我们解压缩到相应的目录.这里我解压缩到d盘下面 1.然后去配置系统的环 ...

  6. 【开源GPS追踪】 之 为何费力不讨好

    GPS追踪,在X宝上一搜一大堆,价格几十到几百层次不齐,为何还要自己开发? 1 对我来说,就是手头有这些硬件资源(GPRS GPS MCU)以及软件资源(VPS),算闲的蛋疼,其实不然,本人工作也很忙 ...

  7. 近年NOIP考点与主要做法

  8. Java 多线程 创建线程的4种方式

    1 继承Thread类,重写run方法.Thread类实现了Runnable接口. 2 实现Runnable接口,重写run方法.相比于继承Thread类,可以避免单继承的缺陷和实现资源共享. 举例: ...

  9. Java 消除过期的对象引用

    内存泄漏的第一个常见来源是存在过期引用. import java.util.Arrays; import java.util.EmptyStackException; public class Sta ...

  10. SuperWebSocket与Cocos2dx通信时执行不了命令的问题

    要修改WebSocketSession.cs 中的方法 string IWebSocketSession.GetAvailableSubProtocol(string protocol) { if ( ...