Подтвердить что ты не робот

Как vuejs знает, какие функции вычисляемого свойства кэшируются?

У меня есть этот код Vue.js:

new Vue({
  data:{
         myValue:'x',
         myOtherValue:'y'
  },
  computed: {
       myComputed: myFunction(){
          return this['my' + 'Value']
       }
  }
})

Как вы можете видеть, вычисленное свойство будет кэшироваться, и оно зависит только от data.myValue. Мой вопрос в том, как система кэширования Vue.js знает, что запустить вычисленную функцию снова, только если myValue изменено?

Если я изменю переменную myOtherValue, функция myComputed будет использовать кеш и не будет запущена снова, я ее вызову.

Я думал о нескольких способах, как это возможно. Но как Vuejs это делает? Я прочитал эту статью: https://vuejs.org/v2/guide/computed.html и не нашел ответа.

И что произойдет в этом коде, на что он будет зависеть?

const flag=2
new Vue({
  data:{
         myValue:'x',
         myOtherValue:'y'
  },
  computed: {
       myComputed: myFunction(){
          if (flag==1){
              return this['my' + 'Value']
          }
          else
              return this['my' + 'Other' + 'Value']
       }
  }
})

Бонус: я буду признателен за ссылку на соответствующую функцию в коде VueJS: https://github.com/vuejs/vue

4b9b3361

Ответ 1

Это реакционная система Vue.js, а не система кэширования.

Данные в компоненте будут преобразованы в геттеры и сеттеры. Когда вы получаете доступ к значению через геттер, получатель добавляет его в зависимости, а когда вы изменяете значение через сеттер, сеттер будет уведомлять всех, кто зависит от значения.

Вот исходный код, все волшебство происходит в этой функции: https://github.com/vuejs/vue/blob/dev/src/core/observer/index.js#L131

Ответ 2

В документах он гласит: Вычислимые свойства кэшируются и только пересчитываются при изменении реактивной зависимости. Однако следующая скрипка показывает что-то немного другое.

Из скрипты, если вы установите флаг в 2, вычисленное свойство будет переоценено и выполнено, если вы измените myOtherValue, однако это не произойдет, если флаг установлен на 1. Я думаю, что он отслеживает ваши условия if.

В документах обычно вы можете найти ссылки на соответствующий исходный код. Вот код для вычисленных свойств: