• 浅析Vue3动态组件怎么进行异常处理


    Vue3动态组件怎么进行异常处理?下面本篇文章带大家聊聊Vue3 动态组件异常处理的方法,希望对大家有所帮助!

     

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

    一是动态路由:

    1. // 动态路由
    2. export const asyncRouterMap: Array<RouteRecordRaw> = [
    3.   {
    4.     path: '/',
    5.     name: 'index',
    6.     meta: { title: '首页' },
    7.     component: BasicLayout, // 引用了 BasicLayout 组件
    8.     redirect: '/welcome',
    9.     children: [
    10.       {
    11.         path: 'welcome',
    12.         name: 'Welcome',
    13.         meta: { title: '引导页' },
    14.         component: () => import('@/views/welcome.vue')
    15.       },
    16.       ...
    17.     ]
    18.   }
    19. ]

    二是动态渲染组件,比如在 Tabs 中切换:

    1. <el-tabs :model-value="copyTabName" type="card">
    2.   <template v-for="item in tabList" :key="item.key || item.name">
    3.     <el-tab-pane
    4.       :name="item.key"
    5.       :label="item.name"
    6.       :disabled="item.disabled"
    7.       :lazy="item.lazy || true"
    8.     >
    9.       <template #label>
    10.         <span>
    11.           <component v-if="item.icon" :is="item.icon" />
    12.           {{ item.name }}
    13.         </span>
    14.       </template>
    15.       // 关键在这里
    16.       <component :key="item.key || item.name" :is="item.component" v-bind="item.props" />
    17.     </el-tab-pane>
    18.   </template>
    19. </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 的处理:

    1. import { markRaw, ref } from 'vue'
    2. import A from './components/A.vue'
    3. import B from './components/B.vue'
    4. interface ComponentList {
    5.   name: string
    6.   component: Component
    7.   // ...
    8. }
    9. const tab = ref<ComponentList[]>([{
    10.     name: "组件 A",
    11.     component: markRaw(A)
    12. }, {
    13.     name: "组件 B",
    14.     component: markRaw(B)
    15. }])

    对于动态路由的处理:

    1. import { markRaw } from 'vue'
    2. // 动态路由
    3. export const asyncRouterMap: Array<RouteRecordRaw> = [
    4.   {
    5.     path: '/',
    6.     name: 'home',
    7.     meta: { title: '首页' },
    8.     component: markRaw(BasicLayout), // 使用 markRaw
    9.     // ...
    10.   }
    11. ]

     而对于 shallowRef 和 markRaw,2 者的区别在于 shallowRef 只会对 value 的修改做出反应,比如:

    1. const state = shallowRef({ count: 1 })
    2. // 不会触发更改
    3. state.value.count = 2
    4. // 会触发更改
    5. state.value = { count: 2 }

    而 markRaw,是将一个对象标记为不可被转为代理。然后返回该对象本身。

    1. const foo = markRaw({})
    2. console.log(isReactive(reactive(foo))) // false
    3. // 也适用于嵌套在其他响应性对象
    4. const bar = reactive({ foo })
    5. console.log(isReactive(bar.foo)) // false

    可看到,被 markRaw 处理过的对象已经不是一个响应式对象了。

    对于一个组件来说,它不应该是一个响应式对象,在处理时,shallowRef 和 markRaw 2 个 API,推荐使用 markRaw 进行处理。

    以上就是浅析Vue3动态组件怎么进行异常处理的详细内容,有不当的地方还请大家多多指教

  • 相关阅读:
    入职美团Java岗后,美团人事分享给了我一份面试笔记......
    【设计模式】六、【创建性模式】揭秘单例模式:从生活例子到Java代码
    C++ Builder XE 用sndPlaySound写的简单的语音播报算法
    objective-c 基础学习
    【uniapp】【微信小程序】wxml-to-canvas
    黑马程序员Linux简单入门学习笔记
    2022-2027年中国冷链物流行业市场发展预测与投资趋势分析报告
    向量数据库,为什么是大模型的最佳拍档?
    anaconda入门
    由ASP.NET Core读取Response.Body引发的思考
  • 原文地址:https://blog.csdn.net/lwf3115841/article/details/128163570