Доступность данных на каждом этапе Vue: создано, вычислено, данные, реквизит, смонтировано, методы, просмотр

Vue.js

При создании данные в data и prop доступны.

Вычисляемое свойство при использовании в mount или dom будет выполнять код свойства.

Последний отключен, можно использовать предыдущие данные, а dom можно манипулировать только в это время.

Часы больше не будут автоматически выполняться на этапе создания, за исключением добавления элемента конфигурации немедленного выполнения.

Порядок загрузки:

В официальной документации подчеркнуты два наиболее важных момента, отличающих вычисляемый от метода.

  • вычисленный — это вызов свойства, а методы — вызов функции.
  • вычисленный поставляется с кэшированием, а методы - нет.

Вычисляемые свойства кэшируются на основе их зависимостей и переоцениваются только при изменении связанных с ними зависимостей.

let vm = new Vue({
    el: '#app',
    data: {
        message: '我是消息,'
    },
    methods: {
        methodTest() {
            return this.message + '现在我用的是methods'
        }
    },
    computed: {
        computedTest() {
            return this.message + '现在我用的是computed'
        }
    }
})

Это означает, что до тех пор, пока сообщение не изменилось, многократный доступ к вычисляемому свойству calculatedTest немедленно вернет предыдущий результат вычисления без необходимости повторного выполнения функции.

Напротив, до тех пор, пока возникновение переработки, вызов метода всегда будет выполнять эту функцию.

<div id="app">
    <h1>{{message}}</h1>
    <p class="test1">{{methodTest}}</p>
    <p class="test2-1">{{methodTest()}}</p>
    <p class="test2-2">{{methodTest()}}</p>
    <p class="test2-3">{{methodTest()}}</p>
    <p class="test3-1">{{computedTest}}</p>
    <p class="test3-2">{{computedTest}}</p>
</div>

в интерполяции HTML

  • Метод, определенный вычисляемым, вызывается в форме доступа к свойству, {{computedTest}}
  • Однако для метода, определяемого методами, мы должны добавить () к вызову, например {{methodTest()}}, иначе представление будет выглядеть как test1, см. рисунок ниже

вычислительные возможности кэширования

В приведенном выше примере доступ к методам, определенным с помощью методов, осуществляется в виде вызовов функций, затем test2-1, test2-2 и test2-3 многократно запускают метод methodTest три раза.Если мы сталкиваемся со сценарием, 1000 возвращаемых значений of methodTest требуются, поэтому нет сомнений, что это приведет к большому количеству отходов Хуже того, если вы измените значение message, каждый из 1000 методов methodTest будет пересчитан заново. . . .

Поэтому в официальной документации неоднократно подчеркивается, что для любой сложной логики следует использовать вычисляемые свойства

вычисленный зависит от данных в данных и будет переоценен только при изменении связанных с ним зависимых данных.

let vm = new Vue({
    el: '#app',
    data: {
        message: '我是消息,'
    },
    methods: {
        methodTest() {
            return this.message + '现在我用的是methods'
        }
    },
    computed: {
        computedTest() {
            return this.message + '现在我用的是computed'
        }
    }
})

Как и в приведенном выше примере, когда создается экземпляр Vue, вычисляемый метод, определенный в вычислении, выполняет вычисление и возвращает значение.При последующем написании кода до тех пор, пока не изменятся данные сообщения, от которых зависит метод ComputedTest, метод ComputedTest не будет пересчитан., то есть test3-1, test3-2 получают возвращаемое значение напрямую, а не результат пересчета методом calculatedTest.

Преимущества этого также очевидны.Также, если мы столкнемся со сценарием, который требует возвращаемого значения 1000 вычисленных тестов, нет сомнений, что это значительно сэкономит память по сравнению с методами. Даже если вы измените значение сообщения, calculatedTest вычислит его только один раз.

Другие примечания к вычисляемым

  • На самом деле, к вычислению можно обращаться и как к свойству, и как к методу.
  • Важной причиной происхождения вычисляемого является предотвращение чрезмерной логики в текстовой интерполяции, которая затрудняет поддержку.

вычислил и смотри

Vue предоставляет более общий способ наблюдения за изменениями данных в экземплярах Vue и реагирования на них: свойство watch, которое используется в сценариях маршрутизации: router for vue learning

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

<div id="demo">{{ fullName }}</div>
var vm = new Vue({ 
 el: '#demo',  
data: {   
    firstName: 'Foo',
    lastName: 'Bar', 
    fullName: 'Foo Bar'
  }, 
 watch: {   
 firstName: function (val) { 
     this.fullName = val + ' ' + this.lastName  
  },   
 lastName: function (val) { 
    this.fullName = this.firstName + ' ' + val   
 }
  }
})

Приведенный выше код является императивным и повторяющимся. Сравните его с версией вычисляемого свойства:

var vm = new Vue({
    el: '#demo', 
    data: { 
        firstName: 'Foo',
        lastName: 'Bar'
    },
    computed: {
        fullName: function () {
            return this.firstName + ' ' + this.lastName
        }
    }
})

Watch уместно, когда вам нужно выполнять асинхронные или дорогостоящие операции при изменении данных.

Вкратце: попробуйте использовать вычисляемые свойства для мониторинга изменения данных, потому что в нем самой есть эта фича, а вычисляемого «автомата» с часами нет, а ручные настройки усложняют код.

На каком этапе жизненного цикла выполняется Vue?

1. Во время new Vue(), _init() в vue\src\core\instance\index.js инициализирует каждую функцию

function Vue (options) {
if (process.env.NODE_ENV !== 'production' &&
  !(this instanceof Vue)
) {
  warn('Vue is a constructor and should be called with the `new` keyword')
}
this._init(options) //初始化各个功能
}

2. В _init() есть такой порядок выполнения: где initState() находится между beforeCreate и created

  initLifecycle(vm)
  initEvents(vm)
  initRender(vm)
  callHook(vm, 'beforeCreate')
  initInjections(vm) // resolve injections before data/props
  initState(vm) //初始化
  initProvide(vm) // resolve provide after data/props
  callHook(vm, 'created') 

3. Сделайте следующие вещи в initState():

if (opts.props) initProps(vm, opts.props)//初始化Props
if (opts.methods) initMethods(vm, opts.methods)//初始化methods
if (opts.data) {
  initData(vm)} else {
  observe(vm._data = {}, true /* asRootData */)}//初始化data
if (opts.computed) initComputed(vm, opts.computed)//初始化computed

4. Таким образом, инициализация Props, методов, данных и вычислений выполняется между beforeCreated и created.