vue3 自定义指令 如何执行js表达式呢?
这是我现在的写法
给指令传递一个函数然后执行函数
.vue
v-click-blank="() => { isShowSearchBox = false }"
directives.js
export default { clickBlank: {
mounted(el, binding) {
binding.value && binding.value()
}
}
};
期望结果
想写成vue本身的click一样
directives.js 该如何写呢
// 修改变量v-click-blank="isShowSearchBox = false"
// 调动函数
v-click-blank="handleClick"
回答:
你可以参考一下,下面的实现
export default { clickBlank: {
mounted(el, binding, vnode) {
// 确保 vnode.component 上下文可用
if (!vnode.component) return;
// 创建一个动态函数,接受传递的表达式作为函数体
const dynamicFunction = new Function(`with(this){ ${binding.value} }`);
// 创建一个处理函数,当事件触发时执行动态函数
const eventHandler = (event) => {
if (el.contains(event.target)) return;
dynamicFunction.call(vnode.component.proxy);
};
// 监听 document 上的 click 事件
document.addEventListener("click", eventHandler);
// 在指令解绑时移除事件监听
el._click_blank_handler = eventHandler;
},
unmounted(el) {
if (el._click_blank_handler) {
document.removeEventListener("click", el._click_blank_handler);
}
},
},
};
以上是 vue3 自定义指令 如何执行js表达式呢? 的全部内容, 来源链接: utcz.com/p/934071.html