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源码解读之removeClass()方法分析
Feb 20 Javascript
Node.js和MongoDB实现简单日志分析系统
Apr 25 Javascript
jquery实现可自动判断位置的弹出层效果代码
Oct 12 Javascript
AngularJS基础 ng-show 指令简单示例
Aug 03 Javascript
JavaScript中的子窗口与父窗口的互相调用问题
Feb 08 Javascript
Express URL跳转(重定向)的实现方法
Apr 07 Javascript
windows下vue-cli导入bootstrap样式
Apr 25 Javascript
jQuery实现手机号正则验证输入及自动填充空格功能
Jan 02 jQuery
vue.js配合$.post从后台获取数据简单demo分享
Aug 11 Javascript
js回文数的4种判断方法示例
Jun 04 Javascript
vue路由切换之淡入淡出的简单实现
Oct 31 Javascript
jQuery 实现扁平式小清新导航
Jul 07 jQuery
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判断上传的Excel文件中是否有图片及PHPExcel库认识
2013/01/11 PHP
php socket客户端及服务器端应用实例
2014/07/04 PHP
从零开始学YII2框架(二)通过 Composer 安装扩展插件
2014/08/20 PHP
完美解决Thinkphp3.2中插入相同数据的问题
2017/08/01 PHP
跨域表单提交状态的变相判断代码
2009/11/12 Javascript
json的前台操作和后台操作实现代码
2012/01/20 Javascript
JQuery验证工具类搜集整理
2013/01/16 Javascript
JS+ACTIVEX实现网页选择本地目录路径对话框
2013/03/18 Javascript
js模拟select下拉菜单控件的代码
2013/05/08 Javascript
Jquery动态添加及删除页面节点元素示例代码
2014/06/16 Javascript
jQuery使用post方法提交数据实例
2015/03/25 Javascript
javascript实现倒计时跳转页面
2016/01/17 Javascript
vue2中filter()的实现代码
2017/07/09 Javascript
js设置随机切换背景图片的简单实例
2017/11/12 Javascript
Node.js创建Web、TCP服务器
2017/12/05 Javascript
Vue2.0 实现歌手列表滚动及右侧快速入口功能
2018/08/08 Javascript
jQuery选择器之基本选择器用法实例分析
2019/02/19 jQuery
使用easyui从servlet传递json数据到前端页面的两种方法
2019/09/05 Javascript
纯js实现无缝滚动功能代码实例
2020/02/21 Javascript
原生JS实现记忆翻牌游戏
2020/07/31 Javascript
JavaScript数组类型Array相关的属性与方法详解
2020/09/08 Javascript
js重写alert事件(避免alert弹框标题出现网址)
2020/12/04 Javascript
python编程开发之类型转换convert实例分析
2015/11/13 Python
Python实现将MySQL数据库表中的数据导出生成csv格式文件的方法
2018/01/11 Python
python实现指定文件夹下的指定文件移动到指定位置
2018/09/17 Python
Pyqt5如何让QMessageBox按钮显示中文示例代码
2019/04/11 Python
centos+nginx+uwsgi+Django实现IP+port访问服务器
2019/11/15 Python
基于Python计算圆周率pi代码实例
2020/03/25 Python
pandas DataFrame运算的实现
2020/06/14 Python
解析HTML5的存储功能和web SQL的相关操作方法
2016/02/19 HTML / CSS
高级Java程序员面试要点
2013/08/02 面试题
会计电算化个人自我评价
2013/11/17 职场文书
网页设计个人找工作求职信
2013/11/28 职场文书
八达岭长城导游词
2015/01/30 职场文书
总经理助理岗位职责
2015/01/31 职场文书
班主任寄语2015
2015/02/26 职场文书