Vue動(dòng)態(tài)組件實(shí)現(xiàn)異常處理方法
動(dòng)態(tài)組件有兩種常用場景:
一是動(dòng)態(tài)路由:
// 動(dòng)態(tài)路由 export const asyncRouterMap: Array<RouteRecordRaw> = [ { path: '/', name: 'index', meta: { title: '首頁' }, component: BasicLayout, // 引用了 BasicLayout 組件 redirect: '/welcome', children: [ { path: 'welcome', name: 'Welcome', meta: { title: '引導(dǎo)頁' }, component: () => import('@/views/welcome.vue') }, ... ] } ]
二是動(dòng)態(tài)渲染組件,比如在 Tabs 中切換:
<el-tabs :model-value="copyTabName" type="card"> <template v-for="item in tabList" :key="item.key || item.name"> <el-tab-pane :name="item.key" :label="item.name" :disabled="item.disabled" :lazy="item.lazy || true" > <template #label> <span> <component v-if="item.icon" :is="item.icon" /> {{ item.name }} </span> </template> // 關(guān)鍵在這里 <component :key="item.key || item.name" :is="item.component" v-bind="item.props" /> </el-tab-pane> </template> </el-tabs>
在 vue2 中使用并不會(huì)引發(fā)什么其他的問題,但是當(dāng)你將組件包裝成一個(gè)響應(yīng)式對(duì)象時(shí),在 vue3 中,會(huì)出現(xiàn)一個(gè)警告:
Vue received a Component which was made a reactive object. This can lead to unnecessary performance overhead, and should be avoided by marking the component with markRaw
or using shallowRef
instead of ref
.
出現(xiàn)這個(gè)警告是因?yàn)椋菏褂?reactive 或 ref(在 data 函數(shù)中聲明也是一樣的)聲明變量會(huì)做 proxy 代理,而我們組件代理之后并沒有其他用處,為了節(jié)省性能開銷,vue 推薦我們使用 shallowRef 或者 markRaw 跳過 proxy 代理。
解決方法如上所說,需要使用 shallowRef 或 markRaw 進(jìn)行處理:
對(duì)于 Tabs 的處理:
import { markRaw, ref } from 'vue' import A from './components/A.vue' import B from './components/B.vue' interface ComponentList { name: string component: Component // ... } const tab = ref<ComponentList[]>([{ name: "組件 A", component: markRaw(A) }, { name: "組件 B", component: markRaw(B) }])
對(duì)于動(dòng)態(tài)路由的處理:
import { markRaw } from 'vue' // 動(dòng)態(tài)路由 export const asyncRouterMap: Array<RouteRecordRaw> = [ { path: '/', name: 'home', meta: { title: '首頁' }, component: markRaw(BasicLayout), // 使用 markRaw // ... } ]
而對(duì)于 shallowRef 和 markRaw,2 者的區(qū)別在于 shallowRef 只會(huì)對(duì) value 的修改做出反應(yīng),比如:
const state = shallowRef({ count: 1 }) // 不會(huì)觸發(fā)更改 state.value.count = 2 // 會(huì)觸發(fā)更改 state.value = { count: 2 }
而 markRaw,是將一個(gè)對(duì)象標(biāo)記為不可被轉(zhuǎn)為代理。然后返回該對(duì)象本身。
const foo = markRaw({}) console.log(isReactive(reactive(foo))) // false // 也適用于嵌套在其他響應(yīng)性對(duì)象 const bar = reactive({ foo }) console.log(isReactive(bar.foo)) // false
可看到,被 markRaw 處理過的對(duì)象已經(jīng)不是一個(gè)響應(yīng)式對(duì)象了。
對(duì)于一個(gè)組件來說,它不應(yīng)該是一個(gè)響應(yīng)式對(duì)象,在處理時(shí),shallowRef 和 markRaw 2 個(gè) API,推薦使用 markRaw 進(jìn)行處理。
以上就是淺析Vue3動(dòng)態(tài)組件怎么進(jìn)行異常處理的詳細(xì)內(nèi)容,有不當(dāng)?shù)牡胤竭€請(qǐng)大家多多指教
到此這篇關(guān)于Vue動(dòng)態(tài)組件實(shí)現(xiàn)異常處理方法的文章就介紹到這了,更多相關(guān)Vue動(dòng)態(tài)組件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue實(shí)現(xiàn)直播間點(diǎn)贊飄心效果的示例代碼
這篇文章主要介紹了vue實(shí)現(xiàn)直播間點(diǎn)贊飄心效果的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09教你使用vue-autofit 一行代碼搞定自適應(yīng)可視化大屏
這篇文章主要為大家介紹了使用vue-autofit 一行代碼搞定自適應(yīng)可視化大屏教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05淺談vue權(quán)限管理實(shí)現(xiàn)及流程
這篇文章主要介紹了淺談vue權(quán)限管理實(shí)現(xiàn)及流程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04使用VUE+iView+.Net Core上傳圖片的方法示例
這篇文章主要介紹了使用VUE+iView+.Net Core上傳圖片的方法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-01-01Vue首頁界面加載優(yōu)化實(shí)現(xiàn)方法詳解
如果你也遇到在 vue 應(yīng)用中,首頁加載資源過多,導(dǎo)致加載緩慢的問題,下面的方法也許能幫到你,主要的處理思想是:讓首頁多余的資源能在需要它的時(shí)候再加載2022-09-09