【问题标题】:How can i re-use a function across multiple directive hooks?如何跨多个指令挂钩重用函数?
【发布时间】:2021-03-22 13:41:12
【问题描述】:

我有一个指令可以更新元素在其内容更改时的外观。因此,我需要它在其原生 change 事件触发时以及首次设置元素时运行。所以我在bind 钩子和componentUpdated 钩子中运行我的函数。

所以它的结构看起来像这样:

directives: {
    demo: {
        bind(el) {
            el.addEventListener('change', () => {
                alert('i am a directive function');
            });
        },

        componentUpdated(el) {
            alert('i am a directive function');
        }
    }
}

它工作正常,但我必须在两个钩子声明中复制并粘贴函数,我想摆脱它。

我想也许指令声明可以有它的本地属性,可以通过this 访问,所以我尝试这样解决它:

directives: {
    demo: {
        myFunction: () => {
            alert('i am a directive function');
        },

        bind(el) {
            el.addEventListener('keyup', () => this.myFunction());
        },

        componentUpdated(el) {
            this.myFunction();
        }
    }
}

但这不起作用,说this.myFunction 不是一个函数。

我将如何进行这项工作?

【问题讨论】:

  • 我只是将指令之外的myFunction 移动到一个可以在任何地方调用的独立函数中。例如,function myFunction() { ... },然后在需要的地方使用myFunction()
  • 这听起来不像是一个非常分离关注点的事情。理想情况下,我希望指令是一种即插即用且易于重复使用的指令。
  • 嗯,我一定错过了什么。为什么外部功能会排除即插即用或可重用性?我在下面的回答(选项 2)证明了我的建议。

标签: vue.js vuejs2 vue-directives


【解决方案1】:

选项 1:单独的指令变量

在自己的变量中定义指令,该变量可以通过名称而不是this引用:

// MyComponent.vue
const myDirective = {
  myFunction(msg) {
    console.log(msg)
  },
  bind(el, { value }) {
    el.addEventListener('keyup', () => myDirective.myFunction(value))
  },
  componentUpdated(el, { value }) {
    myDirective.myFunction(value)
  }
}

export default {
  directives: {
    myDirective
  }
}

demo 1

选项 2:分离函数

从指令外部定义通用函数,并在需要的地方使用:

// MyComponent.vue
function myFunction(msg) {
  console.log(msg)
}

export default {
  directives: {
    myDirective: {
      bind(el, { value }) {
        el.addEventListener('keyup', () => myFunction(value))
      },
      componentUpdated(el, { value }) {
        myFunction(value)
      }
    }
  }
}

demo 2

在以上两个示例中,指令都可以移动到它们自己的文件中,这将增加它们的可测试性并提高组件的可读性。

【讨论】:

  • 是的,选项 2 是我不想要的,因为它声明了一个全局函数(我在一个非 cli 应用程序 atm 中)。选项 1 正是我希望并尝试过的,但我不知道如何正确访问该功能(我尝试使用 this)。所以这行得通。谢谢!
猜你喜欢
  • 2020-03-28
  • 2011-11-05
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-07
相关资源
最近更新 更多