From 73b0def082d30f7f3c502bd014c7d1acd41186aa Mon Sep 17 00:00:00 2001 From: webfansplz <308241863@qq.com> Date: Sat, 5 Mar 2022 17:03:15 +0800 Subject: [PATCH] feat(useElementHover): directive support (#1359) --- .../core/useElementHover/directive.test.ts | 42 +++++++++++++++++++ packages/core/useElementHover/directive.ts | 15 +++++++ packages/core/useElementHover/index.md | 24 +++++++++++ 3 files changed, 81 insertions(+) create mode 100644 packages/core/useElementHover/directive.test.ts create mode 100644 packages/core/useElementHover/directive.ts diff --git a/packages/core/useElementHover/directive.test.ts b/packages/core/useElementHover/directive.test.ts new file mode 100644 index 00000000000..4575591f820 --- /dev/null +++ b/packages/core/useElementHover/directive.test.ts @@ -0,0 +1,42 @@ +import { defineComponent } from 'vue-demi' +import type { VueWrapper } from '@vue/test-utils' +import { mount } from '@vue/test-utils' + +import { vElementHover } from './directive' + +const App = defineComponent({ + props: { + onHover: { + type: Function, + required: true, + }, + }, + + template: ` + `, +}) + +describe('vElementHover', () => { + let onHover = vi.fn() + let wrapper: VueWrapper + + beforeEach(() => { + onHover = vi.fn() + wrapper = mount(App, { + props: { + onHover, + }, + global: { + directives: { + elementHover: vElementHover, + }, + }, + }) + }) + + it('should be defined', () => { + expect(wrapper).toBeDefined() + }) +}) diff --git a/packages/core/useElementHover/directive.ts b/packages/core/useElementHover/directive.ts new file mode 100644 index 00000000000..f2e468cfaf2 --- /dev/null +++ b/packages/core/useElementHover/directive.ts @@ -0,0 +1,15 @@ +import { watch } from 'vue-demi' +import type { FunctionDirective } from 'vue-demi' +import { useElementHover } from '.' + +type BindingValueFunction = (state: boolean) => void + +export const vElementHover: FunctionDirective< +HTMLElement, +BindingValueFunction +> = (el, binding) => { + if (typeof binding.value === 'function') { + const isHovered = useElementHover(el) + watch(isHovered, v => binding.value(v)) + } +} diff --git a/packages/core/useElementHover/index.md b/packages/core/useElementHover/index.md index bdcf09c65ff..221574f6b75 100644 --- a/packages/core/useElementHover/index.md +++ b/packages/core/useElementHover/index.md @@ -8,6 +8,8 @@ Reactive element's hover state. ## Usage +### As a hook + ```vue