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 1.5 &amp; scriptaculous 1.6.1 学习笔记
Sep 07 Javascript
AutoSave/自动存储功能实现
Mar 24 Javascript
编写跨浏览器的javascript代码必备[js多浏览器兼容写法]
Oct 29 Javascript
自定义一个jquery插件[鼠标悬浮时候 出现说明label]
Jun 27 Javascript
jQuery版仿Path菜单效果
Dec 15 Javascript
Javascript基础教程之变量
Jan 18 Javascript
JavaScript中document.forms[0]与getElementByName区别
Jan 21 Javascript
JavaScript 继承详解(五)
Oct 11 Javascript
jQuery和JavaScript节点插入元素的方法对比
Nov 18 Javascript
AngularJS实践之使用ng-repeat中$index的注意点
Dec 22 Javascript
获取今天,昨天,本周,上周,本月,上月时间(实例分享)
Jan 04 Javascript
原生JS封装拖动验证滑块的实现代码示例
Jun 01 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获取网卡的MAC地址支持WIN/LINUX系统
2014/04/30 PHP
PHP微信支付开发实例
2016/06/22 PHP
php实现的http请求封装示例
2016/11/08 PHP
PHP常用函数总结(180多个)
2016/12/25 PHP
PHP中Laravel 关联查询返回错误id的解决方法
2017/04/01 PHP
JS 面向对象之神奇的prototype
2011/02/26 Javascript
Jquery EasyUI中弹出确认对话框以及加载效果示例代码
2014/02/13 Javascript
浅析JS中document对象的一些重要属性
2014/03/06 Javascript
JS实现图片无间断滚动代码汇总
2014/07/30 Javascript
JS判断日期格式是否合法的简单实例
2016/07/11 Javascript
vue将单页面改造成多页面应用的方法
2018/11/25 Javascript
vue进入页面时滚动条始终在底部代码实例
2019/03/26 Javascript
express启用https使用小记
2019/05/21 Javascript
使用原生javascript开发计算器实例代码
2021/02/21 Javascript
Python每天必学之bytes字节
2016/01/28 Python
Python3实现并发检验代理池地址的方法
2016/09/18 Python
使用 Python 实现简单的 switch/case 语句的方法
2018/09/17 Python
Python递归函数实例讲解
2019/02/27 Python
pandas 空数据处理方法详解
2019/11/02 Python
聊聊python中的循环遍历
2020/09/07 Python
PyCharm最新激活码(2020/10/27全网最新)
2020/10/27 Python
python+excel接口自动化获取token并作为请求参数进行传参操作
2020/11/10 Python
css3绘制天猫logo实现代码
2012/11/06 HTML / CSS
科尔士百货公司官网:Kohl’s
2016/07/11 全球购物
e路東瀛(JAPANiCAN)香港:日本旅游、日本酒店和温泉旅馆预订
2018/11/21 全球购物
名人珠宝设计师:Melinda Maria Jewelry
2019/03/06 全球购物
银行柜员应聘推荐信范文
2013/11/24 职场文书
物业客服专员岗位职责
2013/11/30 职场文书
2013年学期结束动员演讲稿
2014/01/07 职场文书
初中语文教学反思
2014/02/02 职场文书
群教班子对照检查材料
2014/08/26 职场文书
政法干警核心价值观心得体会
2014/09/11 职场文书
论群众路线学习笔记
2014/11/06 职场文书
公务员个人考察材料
2014/12/23 职场文书
《游戏公平》教学反思
2016/02/20 职场文书
nginx如何将http访问的网站改成https访问
2021/03/31 Servers