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 相关文章推荐
用于自动添加Digg This!按钮的JavaScript
Dec 23 Javascript
jquery实现文本框数量加减功能的例子分享
May 10 Javascript
超级给力的JavaScript的React框架入门教程
Jul 02 Javascript
jQuery+CSS3实现仿花瓣网固定顶部位置带悬浮效果的导航菜单
Sep 21 Javascript
Vue 父子组件、组件间通信
Mar 08 Javascript
轻松理解JavaScript闭包
Mar 14 Javascript
JS实现禁止高频率连续点击的方法【基于ES6语法】
Apr 25 Javascript
web前端页面生成exe可执行文件的方法
Feb 08 Javascript
利用Console来Debug的10个高级技巧汇总
Mar 26 Javascript
javaScript强制保留两位小数的输入数校验和小数保留问题
May 09 Javascript
Vue 动态路由的实现及 Springsecurity 按钮级别的权限控制
Sep 05 Javascript
Vue 实现可视化拖拽页面编辑器
Feb 01 Vue.js
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数字游戏 计算24算法
2012/06/10 PHP
php 验证码(倾斜,正弦干扰线,黏贴,旋转)
2013/06/29 PHP
PHP错误和异长常处理总结
2014/03/06 PHP
ThinkPHP路由详解
2015/07/27 PHP
javascript中的对象和数组的应用技巧
2007/01/07 Javascript
十个优秀的Ajax/Javascript实例网站收集
2010/03/31 Javascript
JavaScript游戏之是男人就下100层代码打包
2010/11/08 Javascript
js字符编码函数区别分析
2011/12/28 Javascript
在JavaScript中使用NaN值的方法
2015/06/05 Javascript
基于Layer+jQuery的自定义弹框
2020/05/26 Javascript
js鼠标经过tab选项卡时实现切换延迟
2017/03/24 Javascript
node.js+jQuery实现用户登录注册AJAX交互
2017/04/28 jQuery
jQuery:unbind方法的使用详解
2017/08/14 jQuery
jQuery动态添加.active 实现导航效果代码思路详解
2017/08/29 jQuery
js 实现在2d平面上画8的方法
2018/10/10 Javascript
在 Vue-CLI 中引入 simple-mock实现简易的 API Mock 接口数据模拟
2018/11/28 Javascript
关于vue-cli 3配置打包优化要点(推荐)
2019/04/22 Javascript
解决前后端分离 vue+springboot 跨域 session+cookie失效问题
2019/05/13 Javascript
简述ES6新增关键字let与var的区别
2019/08/23 Javascript
js实现旋转木马轮播图效果
2020/01/10 Javascript
原生JS实现弹幕效果的简单操作指南
2020/11/10 Javascript
python中迭代器(iterator)用法实例分析
2015/04/29 Python
python简单实现旋转图片的方法
2015/05/30 Python
详解 Python中LEGB和闭包及装饰器
2017/08/03 Python
Python3正则匹配re.split,re.finditer及re.findall函数用法详解
2018/06/11 Python
python得到单词模式的示例
2018/10/15 Python
python如何实现复制目录到指定目录
2020/02/13 Python
python logging.basicConfig不生效的原因及解决
2020/02/20 Python
Python标准库:内置函数max(iterable, *[, key, default])说明
2020/04/25 Python
Canvas实现放大镜效果完整案例分析(附代码)
2020/11/26 HTML / CSS
工程概预算专业毕业生求职信
2013/10/04 职场文书
保安部任务及岗位职责
2014/02/25 职场文书
开展批评与自我批评发言稿
2014/10/16 职场文书
2015年妇联工作总结范文
2015/04/22 职场文书
2019班干部竞选演讲稿范本!
2019/07/08 职场文书
Golang并发工具Singleflight
2022/05/06 Golang