vue中点击空白处改变dom状态实现显隐,监听dom(addEventListener)

47 篇文章 3 订阅

需求来源:点击铃铛之后弹出右侧抽屉,实现文件下载

现在是点击小铃铛出现弹框没问题,点击关闭图标关闭弹框也没问题,但是点击空白区域消失不了,这个时候需要dom监听属性document.addEventListener来实现需求了

addenent
darw
主要是用document.addEventListener监听鼠标事件就可以了

methods: {
    bodyCloseDrawer() { // 关闭弹框方法
      document.addEventListener('mouseup', e => {
        // let taskModal = document.getElementById('taskModal') // 这两个获取dom的你用那个都行
        const taskModal = document.querySelector('#taskModal  .ivu-drawer-content')

        if (taskModal) {
          if (!taskModal.contains(e.target)) {
            this.showModal = false
          }
        }
      })
    }
  }

组件index.vue

拿到项目中直接可以用,Tabs也是一个组件taskData.vue

<template>
  <div>
    <a href="javascript:void(0)" class="dotClass" @click="showModal = true">
      <Badge  :dot="showDot" style="line-height: normal;" type="error">
        <Icon type="ios-notifications-outline" size="26"></Icon>
      </Badge>
    </a>
    <Drawer title="通知公告"  :mask="false" :closable="true" width="500" v-model="showModal"  id="taskModal">
      <div >
        <div style="height: 10px;width: 100%;"></div>
        <Tabs type="card" class="contents" :animated="false" v-if="showModal">
            <Tab-pane v-for="(tab, index) in tabList" :key="index" :label="tab.label" :name="tab.name">
                <task-datas :type="tab.type" :showModal="showModal" :tabContentList.sync="tabContentList"></task-datas>
            </Tab-pane>
        </Tabs>
      </div>
    </Drawer>
  </div>
</template>
<script>
import taskDatas from './taskData.vue'
let taskList = [
  {
    label: '改价',
    name: 'ChangePrice',
    type: 1
  },
  {
    label: 'FBA',
    name: 'FBA',
    type: 2
  },
  {
    label: '财务',
    name: 'finance',
    type: 3
  }
]
export default {
  name: 'drawer-list',
  components: { taskDatas },
  data() {
    return {
      showModal: false,
      showDot: true,
      tabList: taskList,
      tabContentList: []
    }
  },
  mounted() { // 初始化加载
    this.bodyCloseDrawer()
  },
  beforeDestroy() { // 销毁事件
    document.removeEventListener('click', this.bodyCloseDrawer)
  },
  methods: {
    bodyCloseDrawer() { // 关闭弹框方法
      document.addEventListener('mouseup', e => {
        // let taskModal = document.getElementById('taskModal') // 这两个获取dom的你用那个都行
        const taskModal = document.querySelector('#taskModal  .ivu-drawer-content')

        if (taskModal) {
          if (!taskModal.contains(e.target)) {
            this.showModal = false
          }
        }
      })
    }
  }
}
</script>

组件taskData.vue

<template>
  <div>
    <Row >
      <Col span="12">
          <Select  clearable class="select" style="margin-top:4px;width: 236px;" placeholder="请选择">
            <Option value="1">单价</Option>
            <Option value="2">固价</Option>
            <Option value="3">首续重</Option>
          </Select>
      </Col>
    </Row>
    <Alert type="warning" show-icon style="margin: 10px 0 20px;">仅保留近30天的文件,请及时下载。</Alert>
    {{ type }}--{{ tabContentList }}--{{ showModal }}
  </div>
</template>
<script>
export default {
  props: ['type', 'showModal', 'tabContentList'],
  data() {
    return {
      dataList: []
    }
  },
  mounted() {
    console.log(899)
  },
  methods: {
    fn1(e) {
      console.log('fn1', e)
    }
  }
}
</script>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值