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 document.compatMode兼容性
Feb 23 Javascript
javascript实现输出指定行数正方形图案的方法
Aug 03 Javascript
省市区三级联动下拉框菜单javascript版
Aug 11 Javascript
JavaScript操作class和style样式代码详解
Feb 13 Javascript
js友好的时间返回函数
Aug 24 Javascript
动态JavaScript所造成一些你不知道的危害
Sep 25 Javascript
JavaScript之RegExp_动力节点Java学院整理
Jun 29 Javascript
js中DOM事件绑定分析
Mar 18 Javascript
关于在vue 中使用百度ueEditor编辑器的方法实例代码
Sep 14 Javascript
微信小程序实现预览图片功能
Oct 22 Javascript
Node.js操作系统OS模块用法分析
Jan 04 Javascript
JS+php后台实现文件上传功能详解
Mar 02 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
用ODBC的分页显示
2006/10/09 PHP
php学习笔记 PHP面向对象的程序设计
2011/06/13 PHP
提高PHP性能的编码技巧以及性能优化详细解析
2013/08/24 PHP
jquery 列表双向选择器之改进版
2013/08/09 Javascript
JQuery页面的表格数据的增加与分页的实现
2013/12/10 Javascript
node.js中的fs.utimes方法使用说明
2014/12/15 Javascript
浅谈JavaScript中的作用域和闭包问题
2015/07/07 Javascript
jquery-tips悬浮提示插件分享
2015/07/31 Javascript
JavaScript数据结构与算法之栈与队列
2016/01/29 Javascript
JS实现登录页面记住密码和enter键登录方法推荐
2016/05/10 Javascript
Bootstrap导航条可点击和鼠标悬停显示下拉菜单的实现代码
2016/06/23 Javascript
JavaScript中Array对象用法实例总结
2016/11/29 Javascript
Bootstrap中glyphicons-halflings-regular.woff字体报404错notfound的解决方法
2017/01/19 Javascript
Node.js和Express简单入门介绍
2017/03/24 Javascript
Vue.js 十五分钟入门图文教程
2018/09/12 Javascript
layui实现把数据表格时间戳转换为时间格式的例子
2019/09/12 Javascript
NodeJS开发人员常见五个错误理解
2020/10/14 NodeJs
vue+iview使用树形控件的具体使用
2020/11/02 Javascript
[01:21]DOTA2 新英雄 森海飞霞
2020/12/18 DOTA
Python中List.count()方法的使用教程
2015/05/20 Python
浅谈python中的面向对象和类的基本语法
2016/06/13 Python
python下10个简单实例代码
2017/11/15 Python
Python使用requests发送POST请求实例代码
2018/01/25 Python
使用Pandas对数据进行筛选和排序的实现
2019/07/29 Python
html5教你做炫酷的碎片式图片切换 (canvas)
2017/07/28 HTML / CSS
HTML5 weui使用笔记
2019/11/21 HTML / CSS
6PM官网:折扣鞋、服装及配饰
2018/08/03 全球购物
党课学习思想汇报
2014/01/02 职场文书
计算机专业应届生求职信
2014/04/06 职场文书
南京青奥会口号
2014/06/12 职场文书
优秀团员事迹材料2000字
2014/08/20 职场文书
群众路线表态发言材料
2014/10/17 职场文书
建党伟业电影观后感
2015/06/01 职场文书
北京青年观后感
2015/06/15 职场文书
关于法制教育的宣传语
2015/07/13 职场文书
2016年大学生党员承诺书
2016/03/24 职场文书