基于这个问题Detect click outside element和这个答案https://stackoverflow.com/a/42389266,我试图将指令从Vue 2迁移到Vue 3.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', {
  mounted(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>

Vue.js相关问答推荐

NUXT 3 在客户端获取数据

vue 模板中无法识别 pug 语言

nuxt.js - 预加载 .woff 字体加载为@font-face

如何在 Nativescript 应用程序中调用 axios/api 调用

VuetifyJS:如何摆脱 v-stepper 组件的提升?

使用数组元素的计算(computed)属性

Vue 两种方式的 prop 绑定

VueJS + Typescript:类型上不存在属性

Vuetify 单选按钮未显示为选中状态

Vue路由保持活动和挂载行为

如何将 v-if 与 Vue.js 中的值进行比较

如何将 Angular 和 Vue 项目合并在一起?

中文而不是英文的Element UI分页

如何让 vuetify 数据表在卡片内时跨越容器的整个宽度?

如何使用 Vue Test utils 测试输入是否聚焦?

使密码字符隐藏在 Vuetify 字段中

Vue Cli 3:定义的输出路径

VueJS 2 + ASP.NET MVC 5

Vue过滤器应该如何使用typescript绑定?

在鼠标悬停时动态添加和删除类