首先先解釋原因:
因為同步和異步操作的原因,同步操作總是先執行,異步方法總是在將來的某個結點執行,然而我們不知道這個異步方法何時會來到,這個時候,實際生產中就引入了loading,增加用戶體驗。
情況一:組件請求數據打印undefined
可以看到,mounted方法先執行了,因為他是同步方法,事實上,created也是,還有其它生命周期也是,所以不要懷疑你把數據賦值放在別的生命周期里面就可以拿到值,。
正確思路應該在獲取網路數據里面的then方法里面實現你的賦值:
Article(this.page).then(res => { this.articleArray = res;//把返回的數據賦值給當前組件的變量 console.log("Home的異步方法中看到的值__________") console.log(this.articleArray) console.log("Home的異步方法中看到的值__________") this.flag = true; }) },
情況二:父組件向子組件傳遞值時,子組件打印為undefined:
其實這個也是異步引起的,分析如下:
(1)因為子組件本身就在父組件當中,當父組件拿到的值的時候,子組件已經存在;
(2)子組件mounted的時候,父組件還沒拿到值,因為父組件異步請求數據還未到達,子組件已經mounted完畢,所以此處打印為空:
解決方法在組件中加v-if,默認為false,在數據加載完then函數里面把flag改為true;此時為了用戶體驗,你可以加入loading動畫,告知用戶數據正在加載……
<TextBox v-if="flag" :ArticleInfo="articleArray"></TextBox>
解決: