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


Posted in Javascript onMarch 13, 2017

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

解决方案一

然后开始参考网上和github上的方案等等,发现很多解决方案是这样的

  1. 用data对象中创建一个props属性的副本
  2. watch props属性 赋予data副本 来同步组件外对props的修改
  3. watch data副本,emit一个函数 通知到组件外

这里以最常见的 modal为例子:modal挺合适双向绑定的,外部可以控制组件的 显示或者隐藏,组件内部的关闭可以控制 visible属性隐藏,同时visible 属性同步传输到外部

///modal.vue 组件
<template>
 <div class="modal" v-show="visible">
  <div class="close" @click="cancel">X</div>
 </div>
</template>

<script>
export default {
 name:'modal',
 props: {
  value: {
  type: Boolean,
  default:false
  }
 },

 data () {
 return {
  visible:false
 }
 },
 watch:{
  value(val) {
  console.log(val);
  this.visible = val;
  },
  visible(val) {
  this.$emit("visible-change",val);
  }
 },
 methods:{
 cancel(){
  this.visible = false;
 }
 },
 mounted() {
 if (this.value) {
  this.visible = true;
 }
 }
}
</script>


///调用modal组件
<modal :value="isShow" @visible-change="modalVisibleChange"></modal>

export default {
 name: 'app',
 data () {
 return {
  isShow:true,
 }
 },
 methods:{
  modalVisibleChange(val){
  this.isShow = val;
  }
 }
}

这样就解决了 组件props 双向绑定的问题。 但是这样有一个不是太美观的现象就是 在父级调用 modal组件的时候,还需要写一个 modalVisibleChange 的methods. 总是显得这部分代码是多余的。 特别是写一个让别人用的公共组件,这样调用太麻烦了。能不能不写method来实现props的双向绑定呢,答案是可以的。

优美解决方案

那就是利用 v-model, 在组件内部放置一个 隐藏的input 控件来保存v-model的值,进行双向绑定

改成如下代码:

<template>
 <div class="modal" v-show="visible">
  <div class="close" @click="cancel">X</div>
  <input type="text" :value="value" style='display:none;'>
 </div>
</template>

<script>
export default {
 props: {
  value: {
  type: Boolean,
  default:false
  }
 },

 data () {
 return {
  visible:false
 }
 },
 watch:{
  value(val) {
  console.log(val);
  this.visible = val;
  },
  visible(val) {
  this.$emit('input', val);
  }
 },
 methods:{
 cancel(){
  this.visible = false;
 }
 },
 mounted() {
 if (this.value) {
  this.visible = true;
 }
 }
}
</script>


///调用modal组件

 <modal v-model="isShow"></modal>

export default {
 name: 'app',
 data () {
 return {
  isShow:false
 }
 }
}
</script>

这样调用组件的代码是不是很简洁,其他人员要调用的话,会很轻松,只要设置 isShow 就可以控制 modal 组件的显示或者隐藏,同时 如果是modal 组件内部关闭按钮关闭的,状态也会传到 isShow。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript的变量作用域深入理解
Oct 25 Javascript
用jquery实现学校的校历(asp.net+jquery ui 1.72)
Jan 01 Javascript
Jquery创建层显示标题和内容且随鼠标移动而移动
Jan 26 Javascript
封装好的js判断操作系统与浏览器代码分享
Jan 09 Javascript
jQuery插件slick实现响应式移动端幻灯片图片切换特效
Apr 12 Javascript
jquery动态添加文本并获取值的方法
Oct 12 Javascript
JavaScript输出所选择起始与结束日期的方法
Jul 12 Javascript
vue2单元测试环境搭建
May 24 Javascript
JS实现数组去重,显示重复元素及个数的方法示例
Jan 21 Javascript
vue踩坑记录之数组定义和赋值问题
Mar 20 Javascript
微信JS-SDK实现微信会员卡功能(给用户微信卡包里发送会员卡)
Jul 25 Javascript
Vue中通过Vue.extend动态创建实例的方法
Aug 13 Javascript
jquery实现表单获取短信验证码代码
Mar 13 #Javascript
基于vue2.0+vuex的日期选择组件功能实现
Mar 13 #Javascript
VUE实现日历组件功能
Mar 13 #Javascript
JS正则表达式判断有效数实例代码
Mar 13 #Javascript
又一款MVVM组件 构建自己的Vue组件(2)
Mar 13 #Javascript
jQuery插件HighCharts实现气泡图效果示例【附demo源码】
Mar 13 #Javascript
干货!教大家如何选择Vue和React
Mar 13 #Javascript
You might like
PHP数组的交集array_intersect(),array_intersect_assoc(),array_inter_key()函数的小问题
2011/05/29 PHP
YII CLinkPager分页类扩展增加显示共多少页
2016/01/29 PHP
php中文字符串截取多种方法汇总
2016/10/06 PHP
php+mysql+jquery实现简易的检索自动补全提示功能
2017/04/15 PHP
PHP生成zip压缩包的常用方法示例
2019/08/22 PHP
PHP Beanstalkd消息队列的安装与使用方法实例详解
2020/02/21 PHP
javascript语句中的CDATA标签的意义
2007/05/09 Javascript
JavaScript 数组循环引起的思考
2010/01/01 Javascript
jQuery结合PHP+MySQL实现二级联动下拉列表[实例]
2011/11/15 Javascript
JavaScript的模块化:封装(闭包),继承(原型) 介绍
2013/07/22 Javascript
详解获取jq ul第一个li定位的四种解决方案
2016/11/23 Javascript
微信小程序-横向滑动scroll-view隐藏滚动条
2017/04/20 Javascript
JS学习笔记之数组去重实现方法小结
2019/05/29 Javascript
如何在JavaScript中谨慎使用代码注释
2019/06/21 Javascript
JS实现audio音频剪裁剪切复制播放与上传(步骤详解)
2020/07/28 Javascript
vue项目,代码提交至码云,iconfont的用法说明
2020/07/30 Javascript
微信小程序基于ColorUI构建皮皮虾短视频去水印组件
2020/11/04 Javascript
Flexible.js可伸缩布局实现方法详解
2020/11/13 Javascript
python爬虫框架scrapy实战之爬取京东商城进阶篇
2017/04/24 Python
详谈Python高阶函数与函数装饰器(推荐)
2017/09/30 Python
python实现屏保程序(适用于背单词)
2019/07/30 Python
wxPython实现画图板
2020/08/27 Python
Python爬取你好李焕英豆瓣短评生成词云的示例代码
2021/02/24 Python
Senreve官网:美国旧金山的奢侈手袋品牌
2019/03/21 全球购物
易程科技软件测试笔试
2013/03/24 面试题
现金出纳岗位职责
2014/03/15 职场文书
高中教师评语大全
2014/04/25 职场文书
应聘护士求职信
2014/07/21 职场文书
关于运动会的广播稿(10篇)
2014/09/12 职场文书
出国签证在职证明范本
2014/11/24 职场文书
民事起诉状范文
2015/05/19 职场文书
保留意见审计报告
2015/06/05 职场文书
读书笔记格式
2015/07/02 职场文书
致创业您:正能量激励人心句子(48条)
2019/08/15 职场文书
2019年中学生的思想品德评语集锦
2019/12/19 职场文书
教你怎么用Python实现多路径迷宫
2021/04/29 Python