详解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-easyui关闭tab自动切换到前一个tab
Jul 29 Javascript
javascript学习笔记(一) 在html中使用javascript
Jun 18 Javascript
使用js修改客户端注册表的方法
Aug 09 Javascript
Jquery性能优化详解
May 15 Javascript
Javascript前端UI框架Kit使用指南之kitjs的对话框组件
Nov 28 Javascript
Node.js 去掉种子(torrent)文件里的邪恶信息
Mar 27 Javascript
jQuery实现简单的点赞效果
May 29 Javascript
jQuery遍历DOM节点操作之filter()方法详解
Apr 14 Javascript
JavaScript兼容浏览器FF/IE技巧
Aug 14 Javascript
Javascript 普通函数和构造函数的区别
Nov 05 Javascript
浅谈react.js中实现tab吸顶效果的问题
Sep 06 Javascript
node.js利用socket.io实现多人在线匹配联机五子棋
May 31 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
NT IIS下用ODBC连接数据库
2006/10/09 PHP
php实现根据身份证获取精准年龄
2020/02/26 PHP
php多进程并发编程防止出现僵尸进程的方法分析
2020/02/28 PHP
Bootstrap轮播加上css3动画,炫酷到底!
2015/12/22 Javascript
jquery实现全选功能效果的实现代码
2016/05/05 Javascript
详细总结Javascript中的焦点管理
2016/09/17 Javascript
基于Bootstrap的网页设计实例
2017/03/01 Javascript
bootstrap实现动态进度条效果
2017/03/08 Javascript
ES6新特性二:Iterator(遍历器)和for-of循环详解
2017/04/20 Javascript
利用node.js+mongodb如何搭建一个简单登录注册的功能详解
2017/07/30 Javascript
cordova入门基础教程及使用中遇到的一些问题总结
2017/11/14 Javascript
基于Vue的SPA动态修改页面title的方法(推荐)
2018/01/02 Javascript
优雅的在React项目中使用Redux的方法
2018/11/10 Javascript
ES6 Promise对象的应用实例分析
2019/06/27 Javascript
解决layui的table插件无法多层级获取json数据的问题
2019/09/19 Javascript
[00:20]DOTA2荣耀之路7:-ah fu-抢盾
2018/05/31 DOTA
python通过floor函数舍弃小数位的方法
2015/03/17 Python
Python yield 使用浅析
2015/05/28 Python
在Python中分别打印列表中的每一个元素方法
2018/11/07 Python
在Python中表示一个对象的方法
2019/06/25 Python
python3 logging日志封装实例
2020/04/08 Python
Python用来做Web开发的优势有哪些
2020/08/05 Python
捷克时尚网上商店:OTTO
2018/03/15 全球购物
BLACKMORES澳洲官网:澳大利亚排名第一的保健品牌
2018/09/27 全球购物
澳大利亚拥有最好的家具和家居用品在线目的地:Nestz
2019/02/23 全球购物
印度尼西亚手表和包包商店:Urban Icon
2019/12/12 全球购物
国旗下的讲话演讲稿
2014/05/08 职场文书
小学亲子活动总结
2014/07/01 职场文书
2014最新预备党员思想汇报范文:中国梦,我的梦
2014/10/25 职场文书
送达通知书
2015/04/25 职场文书
发票退票证明
2015/06/24 职场文书
交通处罚决定书
2015/06/24 职场文书
2016国培研修心得体会
2016/01/08 职场文书
商业计划书范文
2019/04/24 职场文书
毕业生就业推荐表自我鉴定
2019/06/20 职场文书
MySQL串行化隔离级别(间隙锁实现)
2022/06/16 MySQL