详解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搭建最佳用户体验的登录页面之记住密码自动登录功能(含后台代码)
Jul 10 Javascript
JavaScript中的值是按值传递还是按引用传递问题探讨
Jan 30 Javascript
JQuery的Pager分页器实现代码
May 03 Javascript
一个仿微博登陆邮箱提示框js开发案例
Jul 28 Javascript
jQuery实现手机上输入后隐藏键盘功能
Jan 04 Javascript
分析JS中this引发的bug
Dec 12 Javascript
微信小程序button组件使用详解
Jan 31 Javascript
详解vue axios二次封装
Jul 22 Javascript
微信小程序开发的基本流程步骤
Jan 31 Javascript
JS中的算法与数据结构之队列(Queue)实例详解
Aug 20 Javascript
vue中使用带隐藏文本信息的图片、图片水印的方法
Apr 24 Javascript
JS实现密码框效果
Sep 10 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缓冲输出实例分析
2015/01/05 PHP
IE bug table元素的innerHTML
2010/01/11 Javascript
IE无法设置短域名下Cookie
2010/09/23 Javascript
Web 前端设计模式--Dom重构 提高显示性能
2010/10/22 Javascript
Javascript 面向对象编程(一) 封装
2011/08/28 Javascript
深入理解JavaScript中的对象
2015/06/04 Javascript
CSS javascript 结合实现悬浮固定菜单效果
2015/08/23 Javascript
详解Vue 普通对象数据更新与 file 对象数据更新
2017/04/26 Javascript
EasyUI在Panel上动态添加LinkButton按钮
2017/08/11 Javascript
使用vue实现grid-layout功能实例代码
2018/01/05 Javascript
js删除数组中的元素delete和splice的区别详解
2018/02/03 Javascript
详解javascript对数组和json数组的操作
2019/04/15 Javascript
javascript实现自由编辑图片代码详解
2019/06/21 Javascript
js中关于Blob对象的介绍与使用
2019/11/29 Javascript
浅谈Vue2.4.0 $attrs与inheritAttrs的具体使用
2020/03/08 Javascript
Python的Django框架下管理站点的基本方法
2015/07/17 Python
Python实现通讯录功能
2018/02/22 Python
python opencv 读取本地视频文件 修改ffmpeg的方法
2019/01/26 Python
python集合常见运算案例解析
2019/10/17 Python
jupyter notebook 使用过程中python莫名崩溃的原因及解决方式
2020/04/10 Python
Softmax函数原理及Python实现过程解析
2020/05/22 Python
HTML5 画布canvas使用方法
2016/03/18 HTML / CSS
澳大利亚药房在线:ThePharmacy
2017/10/04 全球购物
编写一个 C 函数,该函数在一个字符串中找到可能的最长的子字符串,且该字符串是由同一字符组成的
2015/07/23 面试题
extern是什么意思
2016/03/10 面试题
行政助理的职责
2013/11/14 职场文书
管理站站长岗位职责
2013/11/27 职场文书
党校培训自我鉴定
2014/02/01 职场文书
开门红主持词
2014/04/02 职场文书
《苏珊的帽子》教学反思
2014/04/07 职场文书
土建专业毕业生自荐书
2014/07/04 职场文书
教师党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
优秀班干部主要事迹材料
2015/11/04 职场文书
2016银行招聘自荐信
2016/01/28 职场文书
科普 | 业余无线电知识-波段篇
2022/02/18 无线电
分享一个vue实现的记事本功能案例
2022/04/11 Vue.js