在Vue 3上检测外部点击元素

问题描述

基于这个问题Detect click outside element和这个答案https://stackoverflow.com/a/42389266,我正在尝试将指令从Vue 2迁移到Vue3。似乎binding.expressionvnode.context不存在更多。我该如何运作?

app.directive('click-outside',{
    beforeMount (el,binding,vnode) {
        el.clickOutsideEvent = function (event) {
            if (!(el === event.target || el.contains(event.target))) {
                vnode.context[binding.expression](event);
            }
        };
        document.body.addEventListener('click',el.clickOutsideEvent);
    },unmounted (el) {
        document.body.removeEventListener('click',el.clickOutsideEvent);
    }
});

解决方法

您可以像这样使用binding.value

const { createApp } = Vue;

const highlightEl = (color ) => (event,el) => {
  if (el) {
    el.style.background = color;
  } else {
    event.target.style.background = color;
  }
}
const clearHighlightEl = (event,el) => {
  if (el) {
    el.style.background = '';
  } else {
    event.target.style.background = '';
  }
}

const app = Vue.createApp({
  setup() {
    return {
      highlightEl,clearHighlightEl
    }
  }
})

app.directive('click-outside',{
  beforeMount(el,binding,vnode) {
    el.clickOutsideEvent = function(event) {
      if (!(el === event.target || el.contains(event.target))) {
        binding.value(event,el);
      }
    };
    document.body.addEventListener('click',el.clickOutsideEvent);
  },unmounted(el) {
    document.body.removeEventListener('click',el.clickOutsideEvent);
  }
});

app.mount('#app')
<script src="https://unpkg.com/vue@3.0.0-rc.11/dist/vue.global.prod.js"></script>

<div id="app">
  <h1 v-click-outside="highlightEl('yellow')" @click="clearHighlightEl">Element 1</h1>
  <p v-click-outside="highlightEl('#FFCC77')" @click="clearHighlightEl">Element 2</p>
</div>

,

脱离上下文,vue3 有一种更简单的组合方式。

Link to Vueuse ClickOutside

<template>
  <div ref="target">
    Hello world
  </div>
  <div>
    Outside element
  </div>
</template>

<script>
import { ref } from 'vue'
import { onClickOutside } from '@vueuse/core'

export default {
  setup() {
    const target = ref(null)

    onClickOutside(target,(event) => console.log(event))

    return { target }
  }
}
</script>

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...