详解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语言本身谈项目实战
Dec 27 Javascript
用JavaScript和注册表脚本实现右键收藏Web页选中文本
Jan 28 Javascript
JavaScript入门教程 Cookies
Jan 31 Javascript
JS 精确统计网站访问量的实例代码
Jul 05 Javascript
判断及设置浏览器全屏模式
Apr 20 Javascript
JS修改地址栏参数实例代码
Jun 14 Javascript
基于JavaScript实现树形下拉框
Aug 10 Javascript
Angular2使用jQuery的方法教程
May 28 jQuery
js实现加载页面就自动触发超链接的示例
Aug 31 Javascript
详解如何快速配置webpack多入口脚手架
Dec 28 Javascript
如何解决webpack-dev-server代理常切换问题
Jan 09 Javascript
React 全自动数据表格组件——BodeGrid的实现思路
Jun 12 Javascript
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
用javascript控制iframe滚动的代码
2007/04/10 Javascript
JavaScript 开发中规范性的一点感想
2009/06/23 Javascript
window.parent调用父框架时 ie跟火狐不兼容问题
2009/07/30 Javascript
jQuery中:eq()选择器用法实例
2014/12/29 Javascript
jQuery中noConflict()用法实例分析
2015/02/08 Javascript
jQuery选择器总结之常用元素查找方法
2016/08/04 Javascript
Vue.js路由组件vue-router使用方法详解
2016/12/02 Javascript
高效的jQuery代码编写技巧总结
2017/02/22 Javascript
简述vue中的config配置
2018/01/23 Javascript
JQuery元素快速查找与操作
2018/04/22 jQuery
Vue2.X 通过AJAX动态更新数据
2018/07/17 Javascript
Vue filter格式化时间戳时间成标准日期格式的方法
2018/09/16 Javascript
vue单页缓存存在的问题及解决方案(小结)
2018/09/25 Javascript
30分钟快速实现小程序语音识别功能
2018/11/27 Javascript
JavaScript判断对象和数组的两种方法
2019/05/31 Javascript
浅析vue-cli3配置webpack-bundle-analyzer插件【推荐】
2019/10/23 Javascript
node.js文件操作系统实例详解
2019/11/05 Javascript
django启动uwsgi报错的解决方法
2018/04/08 Python
python中ASCII码字符与int之间的转换方法
2018/07/09 Python
Python实现网站表单提交和模板
2019/01/15 Python
计算机二级python学习教程(3) python语言基本数据类型
2019/05/16 Python
python tkinter 设置窗口大小不可缩放实例
2020/03/04 Python
python小技巧——将变量保存在本地及读取
2020/11/13 Python
Canvas 文本转粒子效果的实现代码
2019/02/14 HTML / CSS
顶级宝石首饰网络零售商:Angara
2016/10/25 全球购物
ECCO俄罗斯官网:北欧丹麦鞋履及皮具品牌
2020/06/26 全球购物
Android面试题附答案
2014/12/08 面试题
30岁生日感言
2014/01/25 职场文书
表扬稿格式范文
2015/01/16 职场文书
大学毕业生自我评价
2015/03/02 职场文书
2015个人简历自我评价语
2015/03/11 职场文书
商务信函英语问候语
2015/11/10 职场文书
少先大队干部竞选稿
2015/11/20 职场文书
创业计划书之婴幼儿游泳馆
2019/09/11 职场文书
Apache SeaTunnel实现 非CDC数据抽取
2022/05/20 Servers
windows server 2012安装FTP并配置被动模式指定开放端口
2022/06/10 Servers