前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >clickAwayHook Vue 监听元素外事件 hook

clickAwayHook Vue 监听元素外事件 hook

作者头像
copy_left
发布2020-04-10 16:06:00
6880
发布2020-04-10 16:06:00
举报
文章被收录于专栏:方球方球

chart.gif

使用例子
代码语言:javascript
复制
<template>
  <div class="home" >

      <Card style='margin: 20% auto; width: 600px' title='' >
        <h1> {{ state }} </h1>
        <Button ref='element' @click="innerClick"> inner </Button>
      </Card>
    
  </div>
</template>

<script>
import { ref } from '@vue/composition-api'
import clickAwayHook from '@/hooks/clickAwayHook'


export default { 

  setup(){

    const state = ref(null)
    const innerClick = () => state.value = 'inner'
    const outClick = () => state.value = 'out'
    const element = clickAwayHook( outClick , 'click')
    
    
    return {

      state,
      innerClick,
      outClick,
      element,
      
    }
    

  }

}
</script>
实现
代码语言:javascript
复制
import { ref, computed, onMounted, onUnmounted, watch } from '@vue/composition-api'
import { getVmElement } from '@/utils/isVm'


/**
 * 监听元素外事件
 * @param { Function } onClickAway 外部事件触发回调
 * @param { String ? } eventName  监听事件 默认 click
 * @param { element ? } dom 初始dom 
 * @returns { ref } 被监听dom挂载对象
 * 
 * @example
 *  
 * setup
 *  const state = ref(null)
 *  const innerClick = () => state.value = 'inner'
 *  const outClick = () => state.value = 'out'
 *  const element = clickAwayHook( outClick , 'click')
 * 
 *  
 *  模板
 *   <Card style='margin: 20% auto; width: 600px' title='' >
        <h1> {{ state }} </h1>
        <Button ref='element' @click="innerClick"> inner </Button>
      </Card>
 * 
 */
export default function clickAwayHook( onClickAway, eventName='click', dom={} ){

    const element = ref(null)

    const tarageElement = computed(() =>  dom.value || element.value )
    
    const handler = event => {
        const el = getVmElement(tarageElement.value)  
        
        // 触发事件对象是否在容器元素内
        if(!el || el.contains(event.target) ) return
        onClickAway(event)

    }
    
    onMounted(() => {
        document.addEventListener(eventName, handler)
    })

    onUnmounted(() => {
        document.removeEventListener(eventName, handler)
    })
    
    watch(() => eventName, () => {
        document.addEventListener(eventName,handler)
    })

    return element
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用例子
  • 实现
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档