背景:一個四級聯動下拉欄,select下拉欄中的選項數據由異步請求獲得。
現在想進入這個頁面,就獲得select下拉框的初始默認選中數據,並根據這些默認初始值(調用畫圖函數)畫一張圖表。就是進入這個頁面就立馬根據初始值加載一張圖表。
我在created裏,通過調用4個異步請求的函數,分別獲得了每個下拉框的內容(四個數組:L1、L2、L3、L4)。在這四個發起異步請求的函數裏,我又分別初始化了下拉框的所有初始默認選中值(假設L1_Selected、L2_Selected、L3_Selected、L4_Selected)。
之後,我在mounted裏面,調用畫圖函數畫圖。
在create裏打印this
可以看到this指向的Vue實例,這些值都是存在的。(L1的值,和L1_Selected的值都有,是異步請求獲得的數據)
但是this.L1, this.L1_Selected是獲取不到的,console.log出來都是空,
原因:因爲created和mounted執行時,異步初始化還沒執行(還沒執行完)。或者說當我在created/mounted裏打印this.L1的時候,這個異步請求還沒發起,還沒獲取到L1這個數組的內容。所有的鉤子都只是鉤子,調用一次,沒有參數,不關心返回值,可以是異步函數但不等待。所以我在created裏調用異步方法做初始化,又在mounted裏面根據這些初始化後的值初始化是行不通的,mounted不會等這些異步方法都執行完了再執行。
https://www.jianshu.com/p/aca5b1b4b0a4
Vue生命週期:
https://segmentfault.com/a/1190000011381906
如果在create中發送同步請求,不是調用4個異步請求函數,也許可以實現,但是有點麻煩。(因爲下拉框聯動,這4個異步請求函數有調用順序)
vue實現同步請求:https://segmentfault.com/q/1010000013144644/
——————————————————————————————————————————————————————
下面說下解決方法:
1 如果你初始值是固定的,那你直接指定這些初始值,然後調用畫圖函數。
2 如果你的初始值像我一樣在發起異步請求的函數裏初始化的,或者說不是固定的,是根據後臺數據得出的,
(1) 可以通過setTimeOut()設定等待一個時間,確保你的初始值都已經被初始化了,再畫圖,這樣就不會畫圖失敗。但是這個時間大小要把握好。
mounted:function() {
setTimeout(() => {
this.draw();
}, 1000)
},
(2) 通過watch,觀察到下拉欄的最後一個聯動框數值改變時候就調用畫圖函數(最開始這些初始值都設置爲空),但是這樣不適用像我這樣只有一開始進入頁面需要自動畫圖,其他時候都要按按鈕再觸發畫圖的。
watch:{
L1_Selected:function() {
this.getL2();
},
L2_Selected:function() {
this.getL3();
this.getL4();
},
L3_Selected:function() {
this.getL4();
},
L4_Selected:function() {
this.draw();
},
},
再附上兩個相關資料:
https://www.zhihu.com/question/50934347
https://www.cnblogs.com/xkloveme/p/7435271.html
另外說一個奇奇怪怪的東西吧,我最開始做的時候,指定寫死了初始值,但是調用畫圖函數,還是畫不出來,只有直接在指定初始值後面畫一遍圖(就是複製重寫一遍畫圖函數的代碼,不是調用),才畫了出來;但是之後突然又沒有這個問題了,直接調用就畫出來了,不知道最開始怎麼了,可能抽風吧。