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 相关文章推荐
JQuery 动态扩展对象之另类视角
May 25 Javascript
javascript中数组的concat()方法使用介绍
Dec 18 Javascript
用js判断输入是否为中文的函数
Mar 10 Javascript
jQuery的:parent选择器定义和用法
Jul 01 Javascript
动态载入js提高网页打开速度的方法
Jul 04 Javascript
Angular.js去除页面中显示的空行方法示例
Mar 30 Javascript
vue+element-ui实现表格编辑的三种实现方式
Oct 31 Javascript
微信小程序页面间传值与页面取值操作实例分析
Apr 30 Javascript
jQuery+ajax实现批量删除功能完整示例
Jun 06 jQuery
vuex 实现getter值赋值给vue组件里的data示例
Nov 05 Javascript
Vue+Node实现商品列表的分页、排序、筛选,添加购物车功能详解
Dec 07 Javascript
JS求解两数之和算法详解
Apr 28 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
使用zend studio for eclipse不能激活代码提示功能的解决办法
2009/10/11 PHP
PHP数学运算函数大汇总(经典值得收藏)
2016/04/01 PHP
PHP云打印类完整示例
2016/10/15 PHP
PHP+Ajax 检测网络是否正常实例详解
2016/12/16 PHP
python进程与线程小结实例分析
2018/11/11 PHP
javascript针对DOM的应用分析(二)
2012/04/15 Javascript
jquery实现类似EasyUI的页面布局可改变左右的宽度
2020/09/12 Javascript
浅谈javascript 归并方法
2015/01/21 Javascript
vue中子组件向父组件传递数据的实例代码(实现加减功能)
2018/04/20 Javascript
微信小程序自定义音乐进度条的实例代码
2018/08/28 Javascript
vue如何安装使用Quill富文本编辑器
2018/09/21 Javascript
js删除数组中某几项的方法总结
2019/01/16 Javascript
JavaScript数组、json对象、eval()函数用法实例分析
2019/02/21 Javascript
NodeJs之word文件生成与解析的实现代码
2019/04/01 NodeJs
微信小程序wx.request的简单封装
2019/11/13 Javascript
JS前端面试必备——基本排序算法原理与实现方法详解【插入/选择/归并/冒泡/快速排序】
2020/02/24 Javascript
Vue检测屏幕变化来改变不同的charts样式实例
2020/10/26 Javascript
可用于监控 mysql Master Slave 状态的python代码
2013/02/10 Python
Using Django with GAE Python 后台抓取多个网站的页面全文
2016/02/17 Python
Python外星人入侵游戏编程完整版
2020/03/30 Python
Python虚拟环境virtualenv的安装与使用详解
2017/05/28 Python
Python使用Pickle库实现读写序列操作示例
2018/06/15 Python
Scrapy 配置动态代理IP的实现
2020/09/28 Python
Pytorch1.5.1版本安装的方法步骤
2020/12/31 Python
selenium如何定位span元素的实现
2021/01/13 Python
Python爬虫定时计划任务的几种常见方法(推荐)
2021/01/15 Python
python-jwt用户认证食用教学的实现方法
2021/01/19 Python
微信浏览器左上角返回按钮拦截功能
2017/11/21 HTML / CSS
利用HTML5画出一个坦克的形状具体实现代码
2013/06/20 HTML / CSS
美国在线购物频道:Shop LC
2019/04/21 全球购物
英国网上超市:Ocado
2020/03/05 全球购物
What's the difference between Debug and Trace class? (Debug类与Trace类有什么区别)
2013/09/10 面试题
客运企业隐患排查工作方案
2014/06/06 职场文书
党校毕业心得体会
2014/09/13 职场文书
2014个人反腐倡廉思想汇报
2014/09/15 职场文书
农村党员对照检查材料
2014/09/24 职场文书