前端(vue)入門到精通課程,老師線上輔導:聯絡老師
Apipost = Postman + Swagger + Mock + Jmeter 超好用的API偵錯工具:
【相關推薦:】
動態元件有兩種常用場景:
一是動態路由:
// 動態路由
export const asyncRouterMap: Array<RouteRecordRaw> = [
{
path: '/',
name: 'index',
meta: { title: '首頁' },
component: BasicLayout, // 參照了 BasicLayout 元件
redirect: '/welcome',
children: [
{
path: 'welcome',
name: 'Welcome',
meta: { title: '引導頁' },
component: () => import('@/views/welcome.vue')
},
...
]
}
]
登入後複製
二是動態渲染元件,比如在 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>
// 關鍵在這裡
<component :key="item.key || item.name" :is="item.component" v-bind="item.props" />
</el-tab-pane>
</template>
</el-tabs>
登入後複製
在 vue2 中使用並不會引發什麼其他的問題,但是當你將元件包裝成一個響應式物件時,在 vue3 中,會出現一個警告:
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
.
出現這個警告是因為:使用 reactive 或 ref(在 data 函數中宣告也是一樣的)宣告變數會做 proxy 代理,而我們元件代理之後並沒有其他用處,為了節省效能開銷,vue 推薦我們使用 shallowRef 或者 markRaw 跳過 proxy 代理。
解決方法如上所說,需要使用 shallowRef 或 markRaw 進行處理:
對於 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)
}])
登入後複製
對於動態路由的處理:
import { markRaw } from 'vue'
// 動態路由
export const asyncRouterMap: Array<RouteRecordRaw> = [
{
path: '/',
name: 'home',
meta: { title: '首頁' },
component: markRaw(BasicLayout), // 使用 markRaw
// ...
}
]
登入後複製
而對於 shallowRef 和 markRaw,2 者的區別在於 shallowRef 只會對 value 的修改做出反應,比如:
const state = shallowRef({ count: 1 })
// 不會觸發更改
state.value.count = 2
// 會觸發更改
state.value = { count: 2 }
登入後複製
而 markRaw,是將一個物件標記為不可被轉為代理。然後返回該物件本身。
const foo = markRaw({})
console.log(isReactive(reactive(foo))) // false
// 也適用於巢狀在其他響應性物件
const bar = reactive({ foo })
console.log(isReactive(bar.foo)) // false
登入後複製
可看到,被 markRaw 處理過的物件已經不是一個響應式物件了。
對於一個元件來說,它不應該是一個響應式物件,在處理時,shallowRef 和 markRaw 2 個 API,推薦使用 markRaw 進行處理。
(學習視訊分享:、)
以上就是淺析Vue3動態元件怎麼進行例外處理的詳細內容,更多請關注TW511.COM其它相關文章!