Хорошо, я знаю, что в js многое кажется невозможным или странным. Но зачем реализовывать их в продукте, который использует миллионы людей?

Здесь у нас есть функция в геттерах

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

Поэтому, если это функция, мы должны вызывать ее с круглыми скобками и одним аргументом, например getters.isAuthenticated(state), но это не относится к геттерам - getters.isAuthenticated - без скобок, без аргументов, это как свойство, но это функция вызов. И если мы сделаем это getters.isAuthenticated(arg), наша функция должна выглядеть как (state)=>(arg)=>{}. Это почему ?

1
Roman 4 Дек 2018 в 13:16

2 ответа

Лучший ответ

Фактически, вы можете использовать геттер как функцию, как написано здесь, Вот почему вы видите (state)=>(arg)=>{}. Геттеры похожи на свойства computed, которые являются обычными геттерами javascript. Пожалуйста, проверьте консоль в этом простом примере. Вы увидите, что эти реквизиты установлены для экземпляра: введите описание изображения здесь

Это базовые функции получения JS, ничего странного. Если вы хотите узнать больше, прочтите это Ссылка MDN. Надеюсь, это поможет, получайте удовольствие от изучения Vue.

1
Fleeck 4 Дек 2018 в 12:26

Это вариант функций более высокого порядка, где ваша функция (с параметром состояния) заменяется другой функцией (без параметра), которая при вызове вызывает вашу функцию и предоставляет параметр состояния из собственного контекста.

Из исходного кода здесь я упростил код оболочки из строки 303 и 425

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
    )
  }
})

В строке 233 вы можете увидеть, что wrappedGetters добавляется к свойству store.getters как геттеры javascript и поставляется с параметром store. Опять же, это упрощено, поскольку геттеры добавляются как вычисляемые свойства, чтобы воспользоваться преимуществами кэширования значений.

forEachValue(wrappedGetters, (fn, key) => {
  Object.defineProperty(store.getters, key, {
    get: () => fn(store),
    enumerable: true // for local getters
  })
})
0
Richard Matsen 4 Дек 2018 в 20:49