2 回答

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超5個(gè)贊
這種行為能描述事物的秩序嗎?@change更新路徑后活動(dòng)選項(xiàng)卡,單擊選項(xiàng)卡更新路線,然后激活選項(xiàng)卡?因此,在選項(xiàng)卡視圖更新之前,路由器視圖位于下一個(gè)視圖上,因此它在同一路徑上顯示兩個(gè)不同的路由器視圖。
要解決此問題,只需更改
<router-view v-if="tab.route === activeTab" />
自
<router-view v-if="tab.route === $route.fullPath && tab.route === activeTab" />
或
<router-view v-if="tab.route === $route.path && tab.route === activeTab" />

TA貢獻(xiàn)1798條經(jīng)驗(yàn) 獲得超7個(gè)贊
我有一個(gè)不同的答案要提供。@Estradiaz的答案對(duì)我不起作用,因?yàn)槲业哪承┻x項(xiàng)卡中有子視圖,并且從選項(xiàng)卡重定向到該選項(xiàng)卡上的第一個(gè)子視圖。最終結(jié)果是,我有很多情況,其中$route.path 與 tab.route 不匹配,因?yàn)?tab.route 是選項(xiàng)卡的路由,而 $route.path 指向該選項(xiàng)卡的一個(gè)子級(jí)。
我確實(shí)找到了一種我認(rèn)為更好,更普遍適用的替代解決方案。但在我開始討論之前,我想充分解釋一下正在發(fā)生的事情。
因?yàn)槲覀兪褂玫氖?的 :to 屬性,所以我們讓路由器處理組件的所有選擇和顯示。這意味著在基礎(chǔ)設(shè)施有機(jī)會(huì)做出反應(yīng)之前,路由會(huì)發(fā)生變化。例如,如果我們有2個(gè)選項(xiàng)卡,而我顯示的是選項(xiàng)卡1,那么顯示的是這個(gè)(你可以在你的html中看到這個(gè))
<v-tabs-items>
<v-tab-item><router-view>tab 1 component</router-view></v-tab-item>
<--- tab 2 commented out --->
</v-tabs-items>
然后,當(dāng)我們單擊選項(xiàng)卡2時(shí),會(huì)發(fā)生什么:
<v-tabs-items>
<v-tab-item><router-view>tab 2 component</router-view></v-tab-item>
<--- tab 2 commented out --->
</v-tabs-items>
然后一段時(shí)間過去了,代碼開始更新,你過渡到這個(gè):
<v-tabs-items>
<--- tab 1 commented out --->
<v-tab-item><router-view>tab 2 component</router-view></v-tab-item>
</v-tabs-items>
但是由于 v-if 已更改,因此我們正在銷毀 for 選項(xiàng)卡 1 和新的選項(xiàng)卡 2 組件,結(jié)果只有 for 選項(xiàng)卡 2 創(chuàng)建選項(xiàng)卡 2 組件的新實(shí)例。
基礎(chǔ)結(jié)構(gòu)上似乎沒有任何內(nèi)容可用于知道顯示的選項(xiàng)卡和 中的組件不匹配。@Estradiaz的解決方案適用于簡(jiǎn)單的選項(xiàng)卡組件,但它并不可靠。
我沒有試圖阻止不匹配的情況,而是通過此解決方案來接受它,并在我們吹走選項(xiàng)卡1時(shí)使用保持活動(dòng)狀態(tài)的基礎(chǔ)結(jié)構(gòu)來“重用”。以下是問題中給出的原始標(biāo)記的樣子:
<template>
<!-- [...] -->
<v-tabs centered="centered" grow v-model="activeTab">
<v-tab v-for="tab of tabs" :key="tab.id" :id="tab.id" :to="tab.route" exact>
<v-icon>{{ tab.icon }}</v-icon>
</v-tab>
<v-tabs-items v-model="activeTab" @change="updateRouter($event)">
<v-tab-item v-for="tab of tabs" :key="tab.id" :value="resolvePath(tab.route)" class="tab_content">
<div v-if="tab.route === activeTab">
<keep-alive>
<router-view key="1" />
</keep-alive>
</div>
</v-tab-item>
</v-tabs-items>
</v-tabs>
<!-- [...] -->
</template>
現(xiàn)在,當(dāng)您單擊選項(xiàng)卡2時(shí),將發(fā)生以下情況:
<v-tabs-items>
<v-tab-item><router-view>tab 2 component</router-view></v-tab-item>
<--- tab 2 commented out --->
</v-tabs-items>
路由器視圖現(xiàn)在創(chuàng)建選項(xiàng)卡 2 組件并顯示它。一段時(shí)間過去了,v-Tab 基礎(chǔ)結(jié)構(gòu)更新,標(biāo)記也發(fā)生了變化:
<v-tabs-items>
<--- tab 1 commented out --->
<v-tab-item><router-view>tab 2 component</router-view></v-tab-item>
</v-tabs-items>
但是現(xiàn)在,當(dāng)從dom中刪除原始文件時(shí),它不會(huì)被刪除,而是被緩存。當(dāng)創(chuàng)建新的組件時(shí),它來自緩存,準(zhǔn)備與已經(jīng)構(gòu)建的選項(xiàng)卡2組件一起使用。
就我而言,這可以完美地消除正在發(fā)生的雙重安裝。而且它可能更快一些,因?yàn)樗槐卦诿看吻袚Q時(shí)重新創(chuàng)建。
添加回答
舉報(bào)