亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

組件更新亂序 Vue

組件更新亂序 Vue

炎炎設計 2022-10-27 16:46:41
這是我使用 Bootstrap、Vue 和 Axios 的以下代碼:設置:*忽略component_a中的標簽內容main.html  <div v-if="activeDisplay === 'ep'">    <component_b @set-active-display="setActiveDisplay" :info="info"></component_b>  </div>  <div v-else-if="activeDisplay === 'dashboard'">    <dashboard></dashboard>  </div>  <div v-else-if="activeDisplay === 'activeEp'">    <component_a :info="info"></component_a>  </div>  <div v-else>    <dashboard></dashboard>  </div>問題:單擊表中 B 中的鏈接后,它正確調用了setActiveDisplay方法和getAPIData。但是,在getAPIData(即 Axios GET 調用)運行后,info(根實例)不會更新為在 B 中的表中單擊的單個項目,我從登錄到控制臺中知道這一點。info(根實例)包含表中的所有對象。(組件 B 是打開網頁時首先顯示的組件)然后,網頁更改(正確)以顯示組件 A(由于activeDisplay設置變量并顯示正確的組件),但我可以看到與表中項目數相同的選項卡數。我一瞬間就看到了這一點。然后,組件 A 會更新以顯示最初單擊的正確選項卡。我確定這是一個操作順序問題(因為我是 Vue 的新手),但似乎無法弄清楚為什么info(根實例)對象在運行時未設置為單個項目。我已經在瀏覽器中運行了調試器,并且getAPIData從未被第二次調用。getAPIData正在獲取正確的數據,但就像 Vue 持有從修改信息到渲染組件 A 的getAPIData調用的結果(即使我在單擊組件 B 中的鏈接后要求它更新)操作順序在根信息中使用多個對象在表中渲染 B => 用戶單擊表中的鏈接 => 在 B 中調用 setActiveDisplay => 在根中發出事件調用 setActiveDisplay => 在根中調用 setActiveDisplay 的 getAPIData (直到此處正確工作) =>應該更新根info對象到單個項目=> 由于根info對象(并且由于傳遞給 A 的道具)包含一個來自getAPIData調用的對象,因此使用一個選項卡呈現 A編輯1:經過更多調試,我看到在 vue.js開始處理點擊后,使用正確的 API url 調用了axios.js 的dispatchRequest 。. . .所以,這個方法完成后,getAPIData 中的this.info = response.data中沒有數據。這是我從調試中發現的流程細分:運行 getAPIData 完成(導致根實例的 info 對象未定義 => vue.js 處理組件 B 中表中項目的單擊事件 => axios.js 正在使用完整 URL 調用 dispactRequest 事件 => more vue. js 處理 => 從 getAPIData 函數接收響應并將信息(根)對象設置為響應所以我看到在顯示我需要的數據之前,我需要等待 Axios 調用完成?,F在的問題是,我如何在 Vue 中做到這一點?謝謝你。
查看完整描述

1 回答

?
慕尼黑8549860

TA貢獻1818條經驗 獲得超11個贊

所以我看到在顯示我需要的數據之前,我需要等待 Axios 調用完成?,F在的問題是,我如何在 Vue 中做到這一點?

我假設您需要在設置之前等待axios.get()調用getApiData()完成this.activeDisplay。為此,首先返回axios.get()(ie, a Promise) 的結果,以便調用者可以await得到它。


getAPIData(id,type) {

  // BEFORE:

  //axios.get(...)


  // AFTER:

  return axios.get(...)

}

然后制作setActiveDisplay()一個async函數,允許編輯的getApiData()結果await


// BEFORE:

//setActiveDisplay: function (id, ad) { 


// AFTER:

async setActiveDisplay(id, ad) {

  if (...) {

    await this.getApiData(...)

  }

  this.activeDisplay = ad

}

或者,您可以不使用async/await并使用Promise.prototype.then()


setActiveDisplay: function (id, ad) {

  if (...) {

    this.getApiData(...).then(() => this.activeDisplay = ad)

  }

}


查看完整回答
反對 回復 2022-10-27
  • 1 回答
  • 0 關注
  • 111 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號