Vue created/mounted 獲取不到data中的數據 獲取異步數據

背景:一個四級聯動下拉欄,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

 

另外說一個奇奇怪怪的東西吧,我最開始做的時候,指定寫死了初始值,但是調用畫圖函數,還是畫不出來,只有直接在指定初始值後面畫一遍圖(就是複製重寫一遍畫圖函數的代碼,不是調用),才畫了出來;但是之後突然又沒有這個問題了,直接調用就畫出來了,不知道最開始怎麼了,可能抽風吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章