注意: 子组件不能直接修改prop过来的数据,会报错

方案一:

  1. 用data对象中创建一个props属性的副本

  2. watch props属性 赋予data副本 来同步组件外对props的修改

  3. watch data副本,emit一个函数 通知到组件外

HelloWorld组件代码如下:(代码里面有相应的注释)

<template><div class="hello"><h1 v-show="visible">测试显示隐藏</h1><div @click="cancel">点我点我</div></div>
</template><script>
export default {name: 'HelloWorld',props: {value: {type: Boolean,default:false}},data () {return {visible: false}},watch:{value(val) {this.visible = val;},// 只有这一步 才触发父组件的方法 由父组件的 paretnVisibleChange 方法去改变父组件的数据visible(val) { this.$emit("paretnVisibleChange",val); } },// 子组件修改的只能是子组件 本身的data数据methods:{cancel(){this.visible = !this.visible;}},
// 注意这段代码 为了同步父组件的数据mounted() {if (this.value) {this.visible = true;}}
}
</script>
<style scoped></style>

父组件代码如下:

<template><div id="app"><HelloWorld :value = 'visible' @paretnVisibleChange="visibleChange" /></div>
</template><script>
import HelloWorld from './components/HelloWorld'export default {name: 'App',components: {HelloWorld},data () {return {visible: true}},methods:{// 父子组件就是靠的这个方法改变数据的visibleChange(val){this.visible = val;}}
}
</script>

方案一 的缺点就是 父组件必须有个 visibleChange 这样的方法,有点累赘。

这时候 想到了 v-model 

因为

<input v-model = 'someThing'>

是下面这段代码的语法糖

<input :value = 'someThing'  @input = 'someThing = $event.target.value'>

也就是说 v-mode 自带了 一个改变父组件的方法 类似方案一的   paretnVisibleChange

但是使用 v-model 的时候 需要注意两点:

1. 子组件要接受  value  属性

2. value改变时 要触发input 事件

方案二:

HelloWorld 子组件的代码如下;

  <div class="hello"><h1 v-show="visible">测试显示隐藏</h1><div @click="cancel">点我点我</div></div>
</template><script>
export default {name: 'HelloWorld',props: {value: {type: Boolean,default:true}},data () {return {visible: false}},watch:{value(val) {this.visible = val;},// 子组件 改变的就是这段代码visible(val) {this.$emit("input",val);}},methods:{cancel(){this.visible = !this.visible;}},mounted() {if (this.value) {this.visible = true;}}
}
</script>

父组件代码如下:(父组件省去了 paretnVisibleChange 方法)

<template><div id="app"><HelloWorld v-mode = 'visible'/></div>
</template><script>
import HelloWorld from './components/HelloWorld'export default {name: 'App',components: {HelloWorld},data () {return {visible: true}}
}
</script>

方案三:

vue 2.3.0之后新增了 .sync 属性 使用方法跟 v-model  类似 具体 请参考 : https://cn.vuejs.org/v2/guide/components-custom-events.html#sync-修饰符

下面我写了一个简单的sync 的使用实例:

父组件的代码如下:

<liis="DragCompent"v-for="(item, index) in layoutItem":item="item"v-model="cloneLeftItemText":leftDragItemIsDraged.sync = 'leftDragItemIsDraged':key="index"></li>

子组件的代码如下:

props: {leftDragItemIsDraged: {type: Boolean,default: false}},
watch:{leftDragItemIsDraged(val) {this.thisLeftDragItemIsDraged = val;
},
thisLeftDragItemIsDraged(val){this.$emit('update:leftDragItemIsDraged', val)
}
}

效果如下:

Vue实现组件props双向绑定解决方案相关推荐

  1. Vue2 利用 v-model 实现组件props双向绑定的优美解决方案

    在项目中开始使用vue2来构建项目了,跟 vue1 很大的一处不同在于2 取消了props 的双向绑定,改成只能从父级传到子级的单向数据流,初衷当然是好的,为了避免双向绑定在项目中容易造成的数据混乱. ...

  2. vue 自定义组件 v-model双向绑定、 父子组件同步通信

    父子组件通信,都是单项的,很多时候需要双向通信.方法如下: 1.父组件使用:msg.sync="aa"  子组件使用$emit('update:msg', 'msg改变后的值xxx ...

  3. vue自定义组件实现双向绑定

    场景: 我们比较常用的父子组件之间的交互方式: 父组件通过props将数据流入到子组件: 子组件通过$emit将更新后的数组发送的父组件: 今天,我们通过另一种方式实现交互,参考input框的v-mo ...

  4. 【笔记】vue父子组件数据双向绑定(v-model、prop.aync)

    文章目录 一.v-model 1.最简写法 2.可自定义属性名的写法(2.2.0+) 3.多绑 二..sync [自定义组件的 v-model - Vue.js 中文文档]:(https://vuej ...

  5. vue自定义组件数据双向绑定,获取vue自定义组件input框输入的值

    1.首先创建一个自定义组件 Vue.component('test-component',{template:`<div id="el"><input @inpu ...

  6. vue 父子组件传值 双向绑定

    父组件: <template> //:content , @content 中的:@一个是v-bind 一个是v-on的写法. //:content="detail" ...

  7. 【Vue】—数据的双向绑定v-model

    [Vue]-数据的双向绑定v-model

  8. 15 Vue中子组件样式的绑定和行内样式模版编写

    [基础]模板样式绑定2-进阶 场景 子组件的样式绑定 如何区分父子组件 子组件使用样式的小坑 行内样式的编写 场景 这篇文章继续学习Vue的模板样式绑定.上篇文章你已经对Vue中的样式绑定有一个基本了 ...

  9. Vue之数据的双向绑定

    在vue中实现数据双向绑定的核心在于v-model 示例: <input type="text" name=" " v-model="userN ...

最新文章

  1. MYSQL修改配置,允许远程访问
  2. Windows 08 R2_组策略
  3. 电脑svchost进程占用内存
  4. POJChallengeRound2 Guideposts 【单位根反演】【快速幂】
  5. Ajax响应处理数据的三种格式(主要使用gson包)
  6. zabbix的agent端的主动模式关键三个参数
  7. ubuntu下安装RabbitVCS(失败记录)
  8. mybatis使用拦截器显示sql,使用druid配置连接信息
  9. R语言爱好者必备——R语言速查表(高清版可下载)
  10. 安装xDroid一直提示无法执行二进制文件:可执行文件格式错误,怎么办
  11. 2022新阅读:nmn有用吗?nmn注意事项有哪些?
  12. java amr音频转码_jave: 音频转码工具,主要用于将微信语音 amr 格式转换为 mp3 格式以便在 html5 的 audio 标签中进行播放...
  13. ORACLE数据库日期更新到时分秒格式
  14. 从zotero文献集中批量导出PDF的方法
  15. Ceph Cache Tier
  16. java的博_小博老师解析Java核心技术 ——I/O流
  17. java中abstract怎么使用
  18. 数据库基础:IndexedDB
  19. loam中imu消除重力加速度的数学推导
  20. Python 经纬度,偏航角,距离计算

热门文章

  1. mysql 8.0数据备份恢复_MySQL 8.0 增强逻辑备份恢复工具介绍-爱可生
  2. mysql编写函数 求1 n 偶数之和,编写求1 2 3 - n的函数.在main函数中调用该函数
  3. 内存泄漏java例子_一次线上Java应用内存泄漏分析实例
  4. java jai create 方法_使用JAI扩展Java Image的功能
  5. golang延时_golang 实现延迟消息原理与方法
  6. python播放在线音乐_Python实现在线音乐播放器
  7. 服务器自动挂载硬盘,Linux硬盘分区及开机自动挂载
  8. 二阶偏微分方程组 龙格库塔法_有限单元法(Finite Element Method)实现声波方程模拟(Part 2)...
  9. opencv相机标定和人头姿态估计案例
  10. 第97:一文读懂协方差与协方差矩阵