文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Vue3动态组件如何进行异常处理

2023-07-04 17:55

关注

这篇“Vue3动态组件如何进行异常处理”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Vue3动态组件如何进行异常处理”文章吧。

动态组件有两种常用场景:

一是动态路由:

// 动态路由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动态组件如何进行异常处理”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯