详解vue父子组件关于模态框状态的绑定方案


Posted in Javascript onJune 05, 2019

日常开发中经常遇到的一个场景,父组件有很多操作,需要弹窗,例如:

<template>
  <div class="page-xxx">
    //点击打开新增弹窗
    <button>新增</button>
    //点击打开编辑弹窗
    <button>编辑</button>
    //点击打开详情弹窗
    <button>详情</button>
    <Add :showAdd="false"></Add>
    <Edit :showEdit="false"></Edit>
    <Detail :showDetail="false"></Detail>
  </div>
</template>

子组件:

<div class="page-add">
  <el-dialog :visible="dialogVisible" @close="handleClose"></el-dialog>
</div>
<script>
export default {
  data() {
    return {
      dialogVisible: false,
    }
  },
  methods: {
    handleClose(val) {
      this.dialogVisible= false
    },
  },
}
</script>

如何实现子组件和父组件模态框状态的同步

方案一:使用.sync 修饰符

父组件:

<template>
  <div class="page-xxx">
    //点击打开新增弹窗
    <button @click="show = true">新增</button>
    <Add :show.sync="show"></Add>
  </div>
</template>

子组件:

<div class="page-add">
  <el-dialog:visible="dialogVisible" @close="handleClose"></el-dialog>
</div>
<script>
export default {
  props: {
    show: {
      type: Boolean
    }
  },
  watch: {
    show(value) {
      this.dialogVisible= value
    }
  },
  data() {
    return {
      dialogVisible: false,
    }
  },
  methods: {
    handleClose(val) {
      this.$emit('update:show', false);
    },
  },
}
</script>

方案二:使用v-model

父组件:

<template>
  <div class="page-xxx">
    //点击打开新增弹窗
    <button @click="show = true">新增</button>
    <Add v-model="show"></Add>
  </div>
</template>

子组件:

<div class="page-add">
  <el-dialog :visible="dialogVisible" @close="handleClose"></el-dialog>
</div>
<script>
export default {
  props: {
    show: {
      type: Boolean
    }
  },
  watch: {
    show(value) {
      this.dialogVisible= value
    }
  },
  data() {
    return {
      dialogVisible: false,
    }
  },
  methods: {
    handleClose(val) {
      this.$emit('input', false)
    },
  },
}
</script>

computed OR watch ?

对于上面的两种方案,子组件内部还可以使用计算属性的写法

computed
export default {
  props: {
    show: {
      type: Boolean
    }
  },
  computed: {
    dialogVisible: {
      get() {
        return this.show
      },
      set(value) {
        return this.$emit('input', value)
      },
    },
  },
  methods: {
    handleClose(val) {},
  },
}

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

Javascript 相关文章推荐
Javascript 两个窗体之间传值实现代码
Sep 25 Javascript
jQuery实现列表自动循环滚动鼠标悬停时停止滚动
Sep 06 Javascript
input链接页面、打开新网页等等的具体实现
Dec 30 Javascript
浅析JavaScript中的变量复制、参数传递和作用域链
Jan 13 Javascript
jQuery取得iframe中元素的常用方法详解
Jan 14 Javascript
Bootstrap简单表单显示学习笔记
Nov 15 Javascript
jQuery图片拖动组件Dropzone用法示例
Jan 17 Javascript
Vue中的作用域CSS和CSS模块的区别
Oct 09 Javascript
webpack开发环境和生产环境的深入理解
Nov 08 Javascript
Vue拖拽组件列表实现动态页面配置功能
Jun 17 Javascript
VSCode 添加自定义注释的方法(附带红色警戒经典注释风格)
Aug 27 Javascript
ajax jquery实现页面某一个div的刷新效果
Mar 04 jQuery
JS中实现浅拷贝和深拷贝的代码详解
Jun 05 #Javascript
优雅的处理vue项目异常实战记录
Jun 05 #Javascript
原生JS使用Canvas实现拖拽式绘图功能
Jun 05 #Javascript
Node.js 路由的实现方法
Jun 05 #Javascript
JS实现动态添加外部js、css到head标签的方法
Jun 05 #Javascript
JS函数动态传递参数的方法分析【基于arguments对象】
Jun 05 #Javascript
jQuery操作cookie的示例代码
Jun 05 #jQuery
You might like
PHP的ASP防火墙
2006/10/09 PHP
PHP多线程抓取网页实现代码
2010/07/22 PHP
PHP游戏编程25个脚本代码
2011/02/08 PHP
php中使用$_REQUEST需要注意的一个问题
2013/05/02 PHP
php使用curl访问https示例分享
2014/01/17 PHP
Windows2003下php5.4安装配置教程(Apache2.4)
2016/06/30 PHP
php自定义扩展名获取函数示例
2016/12/12 PHP
PHP CURL采集百度搜寻结果图片不显示问题的解决方法
2017/02/03 PHP
JavaScript的面向对象方法以及差别
2008/03/31 Javascript
JavaScript 继承详解 第一篇
2009/08/30 Javascript
JavaScript CSS修改学习第一章 查找位置
2010/02/19 Javascript
基于jQuery的图片左右无缝滚动插件
2012/05/23 Javascript
JavaScript基本编码模式小结
2012/05/23 Javascript
使用jQuery插件创建常规模态窗口登陆效果
2013/08/23 Javascript
Javascript实现检测客户端类型代码封包
2015/12/03 Javascript
前端性能优化及技巧
2016/05/06 Javascript
jQuery Validate验证表单时多个name相同的元素只验证第一个的解决方法
2016/12/24 Javascript
Node.js 异步异常的处理与domain模块解析
2017/05/10 Javascript
详解React-Native全球化多语言切换工具库react-native-i18n
2017/11/03 Javascript
Webpack 4如何动态切割JS注入文件名详解
2019/07/09 Javascript
layui使用表格渲染获取行数据的例子
2019/09/13 Javascript
[02:09:59]火猫TV国士无双dota2 6.82版本详解(下)
2014/09/29 DOTA
[02:26]2016国际邀请赛8月3日开战 中国军团出征西雅图
2016/08/02 DOTA
python操作字典类型的常用方法(推荐)
2016/05/16 Python
tensorflow学习教程之文本分类详析
2018/08/07 Python
使用memory_profiler监测python代码运行时内存消耗方法
2018/12/03 Python
Python re 模块findall() 函数返回值展现方式解析
2019/08/09 Python
详解mac python+selenium+Chrome 简单案例
2019/11/08 Python
django正续或者倒序查库实例
2020/05/19 Python
Vans(范斯)德国官网:美国南加州的原创极限运动潮牌
2017/05/02 全球购物
27个经典Linux面试题及答案,你知道几个?
2014/03/11 面试题
yy婚礼主持词
2014/03/14 职场文书
商场促销活动策划方案
2014/08/18 职场文书
党员批评与自我批评总结
2014/10/15 职场文书
2014年银行年终工作总结
2014/12/19 职场文书
大学运动会加油稿
2015/07/22 职场文书