【问题标题】:Defining user-defined getters in a Vue component在 Vue 组件中定义用户定义的 getter
【发布时间】:2018-12-06 03:42:21
【问题描述】:

我的问题与 Vue 相关,更具体地说与反应性和反应性 getter/setter 相关:https://vuejs.org/v2/guide/reactivity.html

我可以在 Vue 组件中定义自己的 getter 吗?当 Vue 添加自己的响应式 getter 时它们会发生什么?

【问题讨论】:

  • 你到底想用这个实现什么?
  • @Stephan-v 我来自角度背景,我经常在我的角度组件中使用 getters 以便在不调用方法的情况下访问我的组件属性。因此我的问题。
  • 您可以为此使用计算属性。它们被缓存以供重复使用,您也可以添加setter。在computed setter 部分查找操作方法:vuejs.org/v2/guide/computed.html
  • 谢谢。我正在阅读您指向我的文档。
  • 出于好奇且完全独立于最佳实践,如果开发人员在 Vue 组件中定义自己的用户定义 getter 会发生什么?

标签: vue.js vue-component


【解决方案1】:

Vue 将遍历其所有属性并使用 Object.defineProperty 将它们转换为 getter/setter

上面这句话的意思是 vue 迭代你的 data 选项中的每个属性以使它们反应。

例如,考虑您的data 选项为:

data:{
  foo: 'hello world',
  bar: 3
}

vue 将覆盖data 对象如下(只是一个抽象描述):

let key = Object.keys(data)

for (let i = 0; i < keys.length; i++) {
  let val = data[keys[i]];
  Object.defineProperty(data, keys[i], {
    get(){
      // add this property as a dependency when accessed
      return val;
    },
    set(newVal){
      //notify for a change
      val = newVal;
    }
  })
}

如果你检查 vue source code 相同的,你会发现它检查属性是否有predefined getters or setters

然后它会覆盖属性getter,如下所示:

Object.defineProperty(obj, key, {
  enumerable: true,
  configurable: true,
  get: function reactiveGetter() {
    const value = getter ? getter.call(obj) : val;
    if (Dep.target) {
      dep.depend();
      if (childOb) {
        childOb.dep.depend();
        if (Array.isArray(value)) {
          dependArray(value);
        }
      }
    }
    return value;
  },
  set(newVal) {
    //...
  }
});

如果你看到这个line const value = getter ? getter.call(obj) : val; 你会注意到,如果你定义了一个 getter,它正在被使用并且它的值被返回。

Vue 只是通过调用一些与依赖相关的方法来使它们具有反应性。

【讨论】:

  • 非常感谢您的全面回复!我真的很感激。
  • 我也在寻找更多解释。你做的非常出色。 Tnx!
猜你喜欢
  • 2020-04-30
  • 2018-01-05
  • 2018-04-03
  • 2021-07-26
  • 2018-10-09
  • 2018-12-04
  • 1970-01-01
  • 2019-05-22
  • 2017-10-09
相关资源
最近更新 更多