淺談vue中computed屬性對data屬性賦值為undefined的原因
場景:
我在computed中return了一個值,然后在data中直接將它復制給另一個屬性。結果data中的屬性值為undefined…
代碼示例:
timer為undefined…
原因:
在這里很容易想到是執(zhí)行順序的問題,computed中的屬性和data中的屬性最終都會加載到app這個實例下。如果data中的實例屬性被創(chuàng)建完成的時候,computed中的實例屬性還沒被創(chuàng)建,很明顯,在data中獲取到computed中的屬性必定是undefined…
下面看一下new vue的時候,它的執(zhí)行順序
_init中初始化
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) //初始化各個功能 }
_init中做了什么?
initLifecycle(vm) initEvents(vm) initRender(vm) callHook(vm, 'beforeCreate') initInjections(vm) // resolve injections before data/props initState(vm) //初始化,initState()是在beforeCreate和created之間 initProvide(vm) // resolve provide after data/props callHook(vm, 'created')
在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
從執(zhí)行順序中我們不難得出結論,初始化data在初始化computed之前。
另外,Props,methods,data和computed的初始化都是在beforeCreated和created之間完成的
解決辦法 :
直接在computed中對data中的屬性賦值,因為此時data已經初始化。
到此這篇關于淺談vue中computed屬性對data屬性賦值為undefined的原因的文章就介紹到這了,更多相關vue data屬性賦值為undefined內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Vue + Element UI 實現權限管理系統(tǒng)之菜單功能實現代碼
菜單管理是一個對菜單樹結構的增刪改查操作,這篇文章主要介紹了Vue + Element UI 實現權限管理系統(tǒng)之菜單功能實現代碼,需要的朋友可以參考下2022-02-02