来自vuex的怪异吸气剂。有人可以向我解释这种行为吗?

时间:2018-12-04 10:16:02

标签: vue.js vuejs2 vuex

好吧,我知道在js中很多事情看起来是不可能或奇怪的。但是,为什么要在使用数百万个ppl的产品中实现它们呢?

我们在吸气剂中有一个功能

export const isAuthenticated = state => (
      state.auth !== null &&
      state.auth.access_token !== null &&
      new Date(state.auth.access_token_expiration) > new Date() 
      );

因此,如果这是一个函数,则应使用括号和1个参数来调用它,例如getters.isAuthenticated(state),但在吸气剂中却不是这种情况-getters.isAuthenticated-没有括号,没有参数,就像属性一样,但是是一个函数调用。如果我们执行getters.isAuthenticated(arg),则我们的函数应类似于(state)=>(arg)=>{}。 为什么会这样?

2 个答案:

答案 0 :(得分:1)

实际上,您可以将getter用作here编写的函数。这就是为什么您看到(state)=>(arg)=>{}的原因。吸气剂类似于computed属性,它们是常规的javascript吸气剂。请在这个简单的example中检查控制台。您将看到这些道具设置为实例: enter image description here

这些是基本的JS getter函数,没什么奇怪的。如果您想了解更多信息,请阅读this MDN参考。希望这对您有所帮助,并乐于学习Vue。

答案 1 :(得分:0)

它是高阶函数的变体,其中您的函数(带有状态参数)被另一个函数(没有参数)替换,该函数在调用时调用您的函数并从其自身的上下文中提供状态参数。

从源代码here,我简化了第303和425行的包装器代码

serverless.yml

在233行,您可以看到wrapdGetters作为javascript getters添加到store.getters属性中,并随store参数一起提供。再次简化了此过程,因为将吸气剂添加为计算属性,以利用值缓存。

module.forEachGetter((rawGetter, key) => {
  store._wrappedGetters[key] = function wrappedGetter (store) {
    return rawGetter(
      local.state, // local state
      local.getters, // local getters
      store.state, // root state
      store.getters // root getters
    )
  }
})