要做一个消息显示按钮,点击按钮之后消息框弹出。直接用element的pover做的,给data加一个pover:false,点击的时候修改为pover=!pover就可以点击按钮关闭和显示了。

后来又要做一个点击空白区域隐藏。

首先消息框弹出之后,点击空白隐藏,我第一时间想到的是点击这个消息之框之外的区域。

直接一个点击事件然后传e.target,然后再判断点击区域包不包含这个消息框。结果有问题,百度了一下代码如下。

首先要在mounted阶段绑定一个全局的点击事件监听

mounted(){
    document.addEventListener('click',this.closePover)
}

接着写自己关闭方法

methods:{
    closePover(e){
    //传递事件源
    let self = this
    //判断当前消息框是否为显示状态以及点击区域是否为空白区域
    if(this.pover && !this.$refs.pover.contains(e.target)){
    this.pover = false
}
    }
}

结果还是不行,后来看别人的代码,发现还在消息按钮的点击事件还写了@click.stop

这是按钮的HTML

 <div class="msg" @click.stop="pover = !pover">

这是消息框的HTML

<div class="pover" v-show="pover" @click="closeMsg" ref="pover">

加了.stop会组织冒泡事件,但是为什么需要组织冒泡事件我也不是很清楚。

最后还要在destory阶段销毁事件监听

destroyed() {
    document.addEventListener('click', this.closeMsg);
  }

接下来是完整代码

<div class="msg" @click.stop="pover = !pover">
        <el-badge :value="msgNum" class="item">
          <img src="@/assets/myMessage.png" alt="" />
        </el-badge>
</div>
<div class="pover" v-show="pover" @click="closeMsg" ref="pover">
//消息框内容
</div>

data(){
    return {
    pover:false
} 

}
mounted() {
    
    document.addEventListener('click', this.closeMsg);
  },
method:{
closeMsg(e) {
      let self = this;
      if (self.pover === true && !this.$refs.pover.contains(e.target)) {
        self.pover = false;
      }
    }
   
},
destroyed() {
    document.addEventListener('click', this.closeMsg);
  }
GitHub 加速计划 / eleme / element
15
3
下载
A Vue.js 2.0 UI Toolkit for Web
最近提交(Master分支:4 个月前 )
c345bb45 1 年前
a07f3a59 * Update transition.md * Update table.md * Update transition.md * Update table.md * Update transition.md * Update table.md * Update table.md * Update transition.md * Update popover.md 1 年前
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐