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 function、指针及内置对象
Feb 19 Javascript
基于jquery的下拉框改变动态添加和删除表格实现代码
Sep 12 Javascript
jquery 查找iframe父级页面元素的实现代码
Aug 28 Javascript
浅析Js(Jquery)中,字符串与JSON格式互相转换的示例(直接运行实例)
Jul 09 Javascript
一个JavaScript变量声明的知识点
Oct 28 Javascript
Angular.JS通过指令操作DOM的方法
May 10 Javascript
微信小程序位置授权处理方法
Jun 13 Javascript
详解在Angular4中使用ng2-baidu-map的方法
Jun 19 Javascript
基于vue+axios+lrz.js微信端图片压缩上传方法
Jun 25 Javascript
es6中使用map简化复杂条件判断操作实例详解
Feb 19 Javascript
微信小程序实现电子签名功能
Jul 29 Javascript
JavaScript+HTML实现学生信息管理系统
Apr 20 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+JS无限级可伸缩菜单详解(简单易懂)
2007/01/02 PHP
PHP递归创建多级目录
2015/11/05 PHP
php查找字符串中第一个非0的位置截取
2017/02/27 PHP
Laravel5.7框架安装与使用学习笔记图文详解
2019/04/02 PHP
js创建一个input数组并绑定click事件的方法
2014/06/12 Javascript
BAT及各大互联网公司2014前端笔试面试题--JavaScript篇
2014/10/29 Javascript
Jquery uploadify上传插件使用详解
2016/01/13 Javascript
jQuery easyui的validatebox校验规则扩展及easyui校验框validatebox用法
2016/01/18 Javascript
JavaScript中Promise的使用详解
2017/02/26 Javascript
浅谈es6语法 (Proxy和Reflect的对比)
2017/10/24 Javascript
动态加载权限管理模块中的Vue组件
2018/01/16 Javascript
小程序实现单选多选功能
2018/11/04 Javascript
详解vue-router导航守卫
2019/01/19 Javascript
利用原生JavaScript实现造日历轮子实例代码
2019/05/08 Javascript
使用 Vue 实现一个虚拟列表的方法
2019/08/20 Javascript
vue实现动态表格提交参数动态生成控件的操作
2020/11/09 Javascript
ubuntu系统下使用pm2设置nodejs开机自启动的方法
2018/05/12 NodeJs
Python3.6使用tesseract-ocr的正确方法
2018/10/17 Python
Django数据库连接丢失问题的解决方法
2018/12/29 Python
opencv实现静态手势识别 opencv实现剪刀石头布游戏
2019/01/22 Python
Python的条件锁与事件共享详解
2019/09/12 Python
python ETL工具 pyetl
2020/06/07 Python
Python中logging日志的四个等级和使用
2020/11/17 Python
用python 绘制茎叶图和复合饼图
2021/02/26 Python
大女孩胸罩:Big Girls Bras
2016/12/15 全球购物
Aurora London官网:奢华、负担得起的皮革手袋
2020/08/01 全球购物
生物医学工程专业学生求职信范文分享
2013/12/14 职场文书
小学教师办公室制度
2014/02/03 职场文书
研修第一天随笔感言
2014/02/15 职场文书
入党自荐书范文
2014/03/09 职场文书
机关作风建设自查报告及整改措施
2014/10/21 职场文书
应届毕业生求职信范文
2015/03/19 职场文书
毕业论文答辩稿范文
2015/06/23 职场文书
高中生社会实践心得体会
2016/01/14 职场文书
python 下载文件的几种方式分享
2021/04/07 Python
PyQt5实现多张图片显示并滚动
2021/06/11 Python