这篇“Vue3动态组件如何进行异常处理”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Vue3动态组件如何进行异常处理”文章吧。
10余年的新干网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。成都全网营销的优势是能够根据用户设备显示端的尺寸不同,自动调整新干建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联建站从事“新干网站设计”,“新干网站推广”以来,每个客户项目都认真落实执行。
动态组件有两种常用场景:
一是动态路由:
// 动态路由
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动态组件如何进行异常处理”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注创新互联行业资讯频道。
分享标题:Vue3动态组件如何进行异常处理
本文地址:https://www.cdcxhl.com/article30/gisgpo.html
成都网站建设公司_创新互联,为您提供云服务器、企业网站制作、商城网站、定制网站、网站导航、网页设计公司
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联