前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >hoverHook vue 鼠标悬浮 Hook

hoverHook vue 鼠标悬浮 Hook

作者头像
copy_left
发布2020-04-09 11:49:36
9880
发布2020-04-09 11:49:36
举报
文章被收录于专栏:方球方球
使用例子

chart.gif

代码语言:javascript
复制
<template>
  <div class="home" ref='element'>

    <div ref='hoverEle' >
      <Card style='margin: 20% auto; width: 600px' title='' >
        {{ isHover }}
      </Card>
    </div>
    
  </div>
</template>

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

export default { 

  setup(){
 
    const [ isHover, hoverEle ] = hoverHook({
      onEnter(e){ console.log('enter >>>', e) },
      onLeave(e){ console.log('leave >>>', e) },
    })
   
    return {
      
      isHover,
      hoverEle
      
    }
    

  }

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


/**
 * dom 鼠标悬浮事件 hook
 * @param { { dom, onEnter, onLeave } } options 配置  dom 初始绑定dom  onEnter 滑出事件 onLeave 滑出事件 
 * @returns { [ state, element ] } state 滑入状态  element dom绑定ref
 * 
 * @example
 * 
 *  setup
 *  
 *  const [ isHover, hoverEle ] = hoverHook({
      onEnter(e){ console.log('enter >>>', e) },
      onLeave(e){ console.log('leave >>>', e) },
    })
 *
 *  模板
 * 
 *  <div ref='hoverEle' >
      <Card style='margin: 20% auto; width: 600px' title='' >
        {{ isHover }}
      </Card>
    </div>
 *  
 */

export default function hoverHook(options={}){
    const { dom, onEnter, onLeave } = options
    const element = ref(null)
    const onEnterRef = ref(onEnter)
    const onLeaveRef = ref(onLeave)

    const { state, setTrue, setFalse } = boolHook(false)

    const targetElement = computed(() => {
        const ele = dom ? dom.value : element.value
        return ele || element.value
    })
    
    const onMouseEnter = () => {
        onEnterRef.value && onEnterRef.value()
        setTrue()
    }

    const onMouseLeave = () => {
        onLeaveRef.value && onLeaveRef.value()
        setFalse()
    }
    
    
    watch(() => targetElement.value, (val, oldVal) =>{

        if(oldVal){
            oldVal.removeEventListener('mouseenter', onMouseEnter);
            oldVal.removeEventListener('mouseleave', onMouseLeave);
        }
        
        if(val){
            val.addEventListener('mouseenter', onMouseEnter);
            val.addEventListener('mouseleave', onMouseLeave);
        }

    })
    

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用例子
  • 实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档