javascript - 从 vue 指令操作目标的 dom

标签 javascript vue.js vuejs2

我想定义一个 vue 指令,在点击时切换弹出窗口的显示,我现在拥有的是:

切换.js

export default {
    bind(el, binding) {
        console.log(binding.value); // this is undefined

        el.onclick = function() {
            console.log(binding.value); // this is undefined as well

            // toggle menu element display
        };
    }
};

组件.vue

<template>
    <button v-toggle="$refs.menu">
        ...
    </button>
    <div ref="menu">
        ...
    </div>
</template>

<script>
    import Toggle from 'path/to/toggle.js';

    export default {
        name: "Component",
        directives: {
            Toggle
        }
</script>

内部绑定(bind)函数 binding.value 始终未定义,可能是因为菜单引用尚未准备好。这样做的正确方法是什么?

最佳答案

$refs 不会在设置指令时填充。您可以使它的表达式成为一个函数,它将在点击发生时评估 $refs.menu,而不是在指令设置时。

new Vue({
  el: '#app',
  directives: {
    toggle: {
      bind(el, binding) {
        el.onclick = function() {
          const target = binding.value();

          target.classList.toggle('closed');
        };
      }
    }
  }
});
.closed {
  display: none;
}
<script src="https://unpkg.com/vue@latest/dist/vue.js"></script>
<div id="app">
  <button v-toggle="() => $refs.menu">
    Button
  </button>
  <div ref="menu">
    Some junk in the menu
  </div>
</div>

关于javascript - 从 vue 指令操作目标的 dom,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52933500/

相关文章:

javascript - 类是 Javascript ES6 中的对象吗?

unit-testing - JEST 不会触发模拟函数 Vue js

javascript - 在 VueJS 项目中设置 jsconfig.json

javascript - 在 Vue JS 上根据父属性生成 id

vuejs2 - 如何在 vuejs 中执行其他操作之前等待函数的响应

javascript - 在保持比例的同时动态缩小图像

javascript - Snap.svg 延迟动画不起作用

javascript - 谷歌驱动器 : access webContentLink through javascript

javascript - 如何从NodeJS获取单个数据并在VueJS中显示?

symfony - 带有axios的POST请求不发送参数