為vue中的data賦值computed計(jì)算屬性后,出現(xiàn)undefined原因及解決
為vue中的data賦值computed計(jì)算屬性后,出現(xiàn)undefined原因
今天遇到一個(gè)問(wèn)題,當(dāng)我給data數(shù)據(jù)初始化一個(gè)computed計(jì)算屬性時(shí),在頁(yè)面上竟然沒(méi)有顯示,放代碼
<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

查了一下資料,原來(lái)是跟Vue組件數(shù)據(jù)初始化順序有關(guān),我們可以看一下源碼new Vue的執(zhí)行順序

往下找,可以找到在這個(gè)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);
}
};
}其中,聚焦在這里

看來(lái)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ù)的順序如下
propsmethodsdatacomputedwatch
computed的初始化在data的后邊!
這也就證實(shí)了為什么為data賦值計(jì)算屬性computed時(shí),data打印出來(lái)是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>因?yàn)?code>computed初始化順序是在data后邊。
當(dāng)sum初始化的時(shí)候,result還沒(méi)有初始化,所以也就輸出undefined的結(jié)果
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Vue中的methods、computed計(jì)算屬性和watch監(jiān)聽(tīng)屬性的使用和區(qū)別解析
- Vue中computed(計(jì)算屬性)和watch(監(jiān)聽(tīng)屬性)的用法及區(qū)別說(shuō)明
- vue計(jì)算屬性computed--getter和setter用法
- vue計(jì)算屬性computed方法內(nèi)傳參方式
- vue正確使用watch監(jiān)聽(tīng)屬性變化方式
- Vue中的?watch監(jiān)聽(tīng)屬性詳情
- Vue3計(jì)算屬性computed和監(jiān)聽(tīng)屬性watch區(qū)別解析
相關(guān)文章
vue-cli3.x配置全局的scss的時(shí)候報(bào)錯(cuò)問(wèn)題及解決
這篇文章主要介紹了vue-cli3.x配置全局的scss的時(shí)候報(bào)錯(cuò)問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-04-04
vue.js的computed,filter,get,set的用法及區(qū)別詳解
下面小編就為大家分享一篇vue.js的computed,filter,get,set的用法及區(qū)別詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-03-03
npm如何更新VUE package.json文件中依賴的包版本
這篇文章主要介紹了npm如何更新VUE package.json文件中依賴的包版本問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
使用Vue+Django+Ant Design做一個(gè)留言評(píng)論模塊的示例代碼
這篇文章主要介紹了使用Vue+Django+Ant Design做一個(gè)留言評(píng)論模塊,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
淺談vue引用靜態(tài)資源需要注意的事項(xiàng)
今天小編就為大家分享一篇淺談vue引用靜態(tài)資源需要注意的事項(xiàng),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-09-09
vue3?ts編寫(xiě)echart是tooltip無(wú)法展示的解決
這篇文章主要介紹了vue3?ts編寫(xiě)echart是tooltip無(wú)法展示的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10

