Vue2.0利用 v-model 实现组件props双向绑定的优美解决方案

 更新时间:2017年03月13日 14:54:43   作者:tangolivesky  
本篇文章主要介绍了Vue2 利用 v-model 实现组件props双向绑定的优美解决方案,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。

在项目中开始使用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。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • ElementUI表格中添加表头图标悬浮提示

    ElementUI表格中添加表头图标悬浮提示

    本文主要介绍了ElementUI表格中添加表头图标悬浮提示,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • vue递归实现树形组件

    vue递归实现树形组件

    这篇文章主要为大家详细介绍了vue递归实现树形组件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • vue 权限管理几种实现方法

    vue 权限管理几种实现方法

    本文主要介绍了vue 权限管理几种实现方法,权限需要前后端结合,前端尽可能的去控制,更多的需要后台判断,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • Vue项目中实现带参跳转功能

    Vue项目中实现带参跳转功能

    最近做了一个手机端系统,其中遇到了父页面需要携带参数跳转至子页面的问题,现已解决,下面分享一下实现过程,感兴趣的朋友一起看看吧
    2021-04-04
  • 详解vue中localStorage的使用方法

    详解vue中localStorage的使用方法

    这篇文章主要介绍了详解vue中localStorage的使用方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • Vue中保存用户登录状态实例代码

    Vue中保存用户登录状态实例代码

    本篇文章主要介绍了Vue中保存用户登录状态实例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。、
    2017-06-06
  • vue-cli 打包使用history模式的后端配置实例

    vue-cli 打包使用history模式的后端配置实例

    今天小编就为大家分享一篇vue-cli 打包使用history模式的后端配置实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09
  • 基于vue3+threejs实现可视化大屏效果

    基于vue3+threejs实现可视化大屏效果

    本文主要主要讲述对threejs的一些api进行基本的封装,在vue3项目中来实现一个可视化的3d项目,包含了一些常用的功能,场景、灯光、摄像机初始化,模型、天空盒的加载,以及鼠标点击和悬浮的事件交互,感兴趣的朋友可以参考下
    2023-06-06
  • Vue双向绑定原理及实现方法

    Vue双向绑定原理及实现方法

    Vue双向绑定是指数据模型和视图之间的数据同步,通过Object.defineProperty()方法实现数据劫持,利用观察者模式实现数据更新和视图更新的自动同步,实现方式包括指令、计算属性、v-model等,优化方法包括使用虚拟DOM、合理使用computed和watch等
    2023-04-04
  • vue.js实现只弹一次弹框

    vue.js实现只弹一次弹框

    本篇文章通过代码实例给大家详细讲述了一个vue的实例,实现只弹一次弹框功能,一起学习分享下。
    2018-01-01

最新评论