javascript - Vue 两次使用相同的指令
问题描述
当用户点击时,我有全局指令来隐藏模式:
Vue.directive('click-outside', {
bind(el, binding, vNode) {
el.clickOutside = event => {
if (!(el == event.target || el.contains(event.target))) {
vNode.context[binding.expression](event);
event.stopPropagation();
}
}
document.body.addEventListener('click', el.clickOutside)
},
unbind(el) {
document.removeEventListener('click', el.clickOutside)
el.clickOutside = null
}
});
接下来我使用了这个指令:
<img src="noti.png" id="1" v-click-outside="onClickOutside('notification')">
<img src="dots.png" id="2" v-click-outside="onClickOutside('profile')">
我有问题,因为我不能在一个组件上使用相同的指令。Vue返回我错误:
vNode.context[binding.expression] is not a function
我找到了这个查询,但答案对我没有帮助。例如,当添加console.log
到指令并单击第一个img
指令时,将执行两次。
我如何检测(在指令中)img
被点击的?
解决方案
您传递给自定义指令的值将在呈现模板时立即进行评估。这与v-on
Vue 模板编译器的特殊行为不同,后者会自动将其包装在一个函数中。
我在这个答案中更详细地解释了这一点。
我不知道这是否会完全解决您的问题,但至少您需要执行以下操作:
<img src="noti.png" id="1" v-click-outside="() => onClickOutside('notification')">
推荐阅读
- ruby-on-rails - 错误:列“increment_by”不存在 - Postgres 10 和 Rails 5
- terraform - 创建 CacheSecurityGroup 时出错:InvalidParameterValue
- matlab - 如何在 Matlab 中计算日期时间的“外减法”
- angular - Angular 4 输入指令 onSave
- javascript - 如何在 LiveCycle 中添加一年并从日期中减去一天?
- java - 使用 Java 10 的 jaotc 编译单个类
- python - 我在 pygame.Surface() 里面放了什么?
- c# - Google Assistant Dialogflow API V2 webhook ETag 错误
- sql-server - 基于日期的 T-SQL 每日数据备份
- apache-flink - 跨 Flink 数据流的多个步骤的节点内的任务本地处理