Vue: 打开弹框的正确姿势

9 篇文章 0 订阅
1 篇文章 0 订阅

1. 技术选型

Vue + ElementUI

2. 需求功能分析

点击按钮,出现弹框。点击取消或者弹框右上角叉号,关闭弹框。

3. 组件树结构

4. 实现思路 

4.1 方案一 (wrong)

  • 用户点击MainContent触发点击事件
  • MainContent通知父组件显示弹框
this.$emit('showAlertModal')
  • 父组件接收通知并改变showAlertModal变量的值
this.showAlertModal = true
  • 父组件传值给AlertModal告诉它:请开始你的表演
<AlertModal :show="showAlertModal"></AlertModal>
  • 子组件拿到这个值之后,脱掉隐身衣
<el-dialog title="title" :visible.sync="show"></el-dialog>
  • 当用户点击到取消按钮或者弹出框右上角的叉号时,子组件更改show的值隐藏自己
CloseThis () {
    this.show = false
}

这个方案是可以正常运行的,但是会报错,因为Vue不允许子组件更改父组件的变量。

4.2 方案二 (wrong)

  • 子组件中不直接更改父组件传过来的show值,而是在computed中使用一个变量来接收它
computed: {
  showThis: {
    get: function () {
      return this.show
    }
  }
}
  • 子组件通过showThis变量来操作隐身衣
<el-dialog title="title" :visible.sync="showThis"></el-dialog>
  • 在用户点击取消按钮的时候通过改变showThis的值来达到隐藏效果
CloseThis () {
    this.showThis = false
}

结果表现为弹出框能点开,但是关不上,报错信息为:Computed property "showThis" was assigned to but it has no setter.

好吧,查了一下官方文档发现需要如果需要读取和设置computed中的属性需要同时具备get和set方法,就像下面这样

但是继续观察这个写法,发现set方法中修改的变量值正是get方法中返回的变量值。平移到我们这个场景中则表现为set方法中需要修改this.show的值,而this.show是父元素传下来的,是不能修改的,所以这个方法也不可行!

4.3 方案三 (right)

  • 子组件在data中定义一个showThis变量,初始值为null
data () {
  return {
    showThis: null
  }
}
  • 在组件挂载的时候将父元素传来的show赋值给showThis 
mounted () {
    this.showThis = this.show
}
  • 为show和showThis两个变量添加监听,每当它们发生变化的时候就进行相应的操作
watch: {
  showThis: function(newV, oldV){
    // 告诉父元素改变show的值
    this.$emit('closeModal', newV)
  },
  show: function (newV, oldV) {
    this.showThis = newV
  }
}
  • 父元素拿到子元素传来的closeModal事件的dom及事件触发的函数内容如下
<AlertModal 
    @closeModal="CloseModal"
    :show="showAlertModal"></AlertModal>
CloseModal(...data) {
  this.showAlertModal = data[0]
}

 

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值