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 相关文章推荐
prototype 的说明 js类
Sep 07 Javascript
ajax 同步请求和异步请求的差异分析
Jul 04 Javascript
JavaScript中的noscript元素属性位置及作用介绍
Apr 11 Javascript
JS调试必备的5个debug技巧
Mar 07 Javascript
js实现格式化金额,字符,时间的方法
Feb 26 Javascript
喜大普奔!jQuery发布 3.0 最终版
Jun 12 Javascript
基于Layer+jQuery的自定义弹框
May 26 Javascript
深入理解jQuery.data() 的实现方式
Nov 30 Javascript
Bootstrap导航条的使用和理解3
Dec 14 Javascript
jQuery判断网页是否已经滚动到浏览器底部的实现方法
Oct 27 jQuery
微信小程序 网络通信实现详解
Jul 23 Javascript
微信小程序全选多选效果实现代码解析
Jan 21 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
收音机另类DIY - 纸巾盒做外壳
2021/03/02 无线电
PHP文件锁函数flock()详细介绍
2014/11/18 PHP
laravel容器延迟加载以及auth扩展详解
2015/03/02 PHP
php自动更新版权信息显示的方法
2015/06/19 PHP
Adnroid 微信内置浏览器清除缓存
2016/07/11 PHP
PHP实现的Redis多库选择功能单例类
2017/07/27 PHP
PHP实现随机发扑克牌
2020/04/22 PHP
用jscript实现新建word文档
2007/06/15 Javascript
JavaScript Event学习第十章 一些可替换的事件对
2010/02/10 Javascript
Jquery Ajax学习实例5 向WebService发出请求,返回泛型集合数据的异步调用
2010/03/17 Javascript
JS解决ie6下png透明的方法实例
2013/08/02 Javascript
jQuery的图片滑块焦点图插件整理推荐
2014/12/07 Javascript
node.js中的path.sep方法使用说明
2014/12/08 Javascript
浅析javascript 定时器
2014/12/23 Javascript
移动设备web开发首选框架:zeptojs介绍
2015/01/29 Javascript
基于JavaScript实现手机短信按钮倒计时(超简单)
2015/12/30 Javascript
再谈JavaScript异步编程
2016/01/27 Javascript
javascript正则表达式中分组详解
2016/07/17 Javascript
vue子父组件通信的实现代码
2017/07/09 Javascript
vue中element-ui表格缩略图悬浮放大功能的实例代码
2018/06/26 Javascript
Vue递归组件+Vuex开发树形组件Tree--递归组件的简单实现
2019/04/01 Javascript
vue鼠标悬停事件实例详解
2019/04/01 Javascript
微信小程序制作扭蛋机代码实例
2019/09/24 Javascript
原生js实现日期选择插件
2020/05/21 Javascript
python中循环语句while用法实例
2015/05/16 Python
Windows下使Python2.x版本的解释器与3.x共存的方法
2015/10/25 Python
Python使用lxml模块和Requests模块抓取HTML页面的教程
2016/05/16 Python
python MysqlDb模块安装及其使用详解
2018/02/23 Python
Django 中使用流响应处理视频的方法
2018/07/20 Python
Python字典创建 遍历 添加等实用基础操作技巧
2018/09/13 Python
python-opencv获取二值图像轮廓及中心点坐标的代码
2019/08/27 Python
对python pandas中 inplace 参数的理解
2020/06/27 Python
欧洲当代手工玻璃和瓷器的领先品牌:LSA International
2018/06/03 全球购物
大学生未来职业生涯规划书
2014/02/15 职场文书
2015年秋季开学典礼校长致辞
2015/07/16 职场文书
酒桌上的祝酒词
2015/08/12 职场文书