vue3 自定义指令 如何执行js表达式呢?

新手上路,请多包涵

这是我现在的写法
给指令传递一个函数然后执行函数
.vue
image.png

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"
阅读 1.2k
1 个回答

你可以参考一下,下面的实现

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);
      }
    },
  },
};
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题