详解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 相关文章推荐
jQuery中对未来的元素绑定事件用bind、live or on
Apr 17 Javascript
利用js实现禁止复制文本信息
Jun 03 Javascript
jquery动感漂浮导航菜单代码分享
Apr 15 Javascript
JS实现滑动门效果的方法详解
Dec 19 Javascript
vue几个常用跨域处理方式介绍
Feb 07 Javascript
详解ES6 Fetch API HTTP请求实用指南
Nov 14 Javascript
js操作table中tr的顺序实现上移下移一行的效果
Nov 22 Javascript
vue实现搜索功能
May 28 Javascript
vue自定义指令和动态路由实现权限控制
Aug 28 Javascript
如何管理Vue中的缓存页面
Feb 06 Vue.js
JavaScript实现筛选数组
Mar 02 Javascript
JS数组去重详情
Nov 07 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
解析:通过php socket并借助telnet实现简单的聊天程序
2013/06/18 PHP
session在php5.3中的变化 session_is_registered() is deprecated in
2013/11/12 PHP
PHP判断表单复选框选中状态完整例子
2014/06/24 PHP
PHP解码unicode编码的中文字符代码分享
2014/08/13 PHP
PHP程序员必须清楚的问题汇总
2014/12/18 PHP
javascript 广告后加载,加载完页面再加载广告
2010/11/25 Javascript
kmock javascript 单元测试代码
2011/02/06 Javascript
精心挑选的15个jQuery下拉菜单制作教程
2012/06/15 Javascript
jquery与js函数冲突的两种解决方法
2013/09/09 Javascript
JavaScript组件焦点与页内锚点间传值的方法
2015/02/02 Javascript
jQuery在页面加载时动态修改图片尺寸的方法
2015/03/20 Javascript
在浏览器中打开或关闭JavaScript的方法
2015/06/03 Javascript
JQuery实现左右滚动菜单特效
2015/09/28 Javascript
使用javascript插入样式
2016/03/14 Javascript
基于Bootstrap重置输入框内容按钮插件
2016/05/12 Javascript
Angular.js去除页面中显示的空行方法示例
2017/03/30 Javascript
微信公众号菜单配置微信小程序实例详解
2017/03/31 Javascript
JS失效 提示HTML1114: (UNICODE 字节顺序标记)的代码页 utf-8 覆盖(META 标记)的冲突的代码页 utf-8
2017/06/23 Javascript
微信小程序开发实现消息推送
2020/11/18 Javascript
jquery实现动态改变css样式的方法分析
2019/05/27 jQuery
在Python中使用SQLite的简单教程
2015/04/29 Python
Python多维/嵌套字典数据无限遍历的实现
2016/11/04 Python
浅谈Series和DataFrame中的sort_index方法
2018/06/07 Python
python 实现敏感词过滤的方法
2019/01/21 Python
python装饰器简介---这一篇也许就够了(推荐)
2019/04/01 Python
python实现微信每日一句自动发送给喜欢的人
2019/04/29 Python
Python Django给admin添加Action的方法实例详解
2019/04/29 Python
tensorflow 限制显存大小的实现
2020/02/03 Python
python 装饰器功能与用法案例详解
2020/03/06 Python
python绘制趋势图的示例
2020/09/17 Python
Aeropostale官网:美国著名校园品牌及青少年服饰品牌
2019/03/21 全球购物
Android笔试题总结
2014/11/29 面试题
大学生第一学年自我鉴定2015
2014/09/28 职场文书
2014年财务人员工作总结
2014/11/11 职场文书
考研经验交流会策划书
2015/11/02 职场文书
2019年图书室自查报告范本
2019/10/12 职场文书