為vue中的data賦值computed計算屬性后,出現(xiàn)undefined原因及解決
為vue中的data賦值computed計算屬性后,出現(xiàn)undefined原因
今天遇到一個問題,當(dāng)我給data數(shù)據(jù)初始化一個computed計算屬性時,在頁面上竟然沒有顯示,放代碼
<template> <div class="container"> <div>num1:{{num1}}</div> <div>num2:{{num2}}</div> <div>data中的數(shù)據(jù){{sum}}</div> </div> </template> <script> export default { data() { return { num1:2, num2:10, sum:this.result }; }, computed:{ result(){ return this.num1+this.num2 } } }; </script>
console.log(this.data)一下,結(jié)果是undefined
查了一下資料,原來是跟Vue組件數(shù)據(jù)初始化順序有關(guān),我們可以看一下源碼new Vue
的執(zhí)行順序
往下找,可以找到在這個initMixin
函數(shù)里,定義了_init
的方法
function initMixin (Vue) { Vue.prototype._init = function (options) { //在這里定義了_init方法 var vm = this; // a uid vm._uid = uid$3++; var startTag, endTag; /* istanbul ignore if */ if (config.performance && mark) { startTag = "vue-perf-start:" + (vm._uid); endTag = "vue-perf-end:" + (vm._uid); mark(startTag); } // a flag to avoid this being observed vm._isVue = true; // merge options if (options && options._isComponent) { // optimize internal component instantiation // since dynamic options merging is pretty slow, and none of the // internal component options needs special treatment. initInternalComponent(vm, options); } else { vm.$options = mergeOptions( resolveConstructorOptions(vm.constructor), options || {}, vm ); } /* istanbul ignore else */ { initProxy(vm); } // expose real self vm._self = vm; 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'); /* istanbul ignore if */ if (config.performance && mark) { vm._name = formatComponentName(vm, false); mark(endTag); measure(("vue " + (vm._name) + " init"), startTag, endTag); } if (vm.$options.el) { vm.$mount(vm.$options.el); } }; }
其中,聚焦在這里
看來initState(vm)
是關(guān)鍵的部分了,在initState函數(shù)里
function initState (vm) { vm._watchers = []; var opts = vm.$options; 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 if (opts.watch && opts.watch !== nativeWatch) { initWatch(vm, opts.watch);//初始化watch } }
從initState(vm)
函數(shù)可以看出
初始化數(shù)據(jù)的順序如下
props
methods
data
computed
watch
computed的初始化在data的后邊!
這也就證實了為什么為data賦值計算屬性computed時,data打印出來是undefined
回到上邊的例子
<template> <div class="container"> <div>num1:{{num1}}</div> <div>num2:{{num2}}</div> <div>data中的數(shù)據(jù){{sum}}</div> </div> </template> <script> export default { data() { return { num1:2, num2:10, sum:this.result }; }, computed:{ result(){ return this.num1+this.num2 } } }; </script>
因為computed
初始化順序是在data
后邊。
當(dāng)sum
初始化的時候,result
還沒有初始化,所以也就輸出undefined
的結(jié)果
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue.js的computed,filter,get,set的用法及區(qū)別詳解
下面小編就為大家分享一篇vue.js的computed,filter,get,set的用法及區(qū)別詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-03-03npm如何更新VUE package.json文件中依賴的包版本
這篇文章主要介紹了npm如何更新VUE package.json文件中依賴的包版本問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06使用Vue+Django+Ant Design做一個留言評論模塊的示例代碼
這篇文章主要介紹了使用Vue+Django+Ant Design做一個留言評論模塊,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06vue3?ts編寫echart是tooltip無法展示的解決
這篇文章主要介紹了vue3?ts編寫echart是tooltip無法展示的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-10-10