• 技术文章 >web前端 >Vue.js

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

    青灯夜游青灯夜游2022-12-02 21:11:10转载310
    Vue3动态组件怎么进行异常处理?下面本篇文章带大家聊聊Vue3 动态组件异常处理的方法,希望对大家有所帮助!

    大前端零基础入门到就业:进入学习

    【相关推荐:vuejs视频教程

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

    一是动态路由:

    // 动态路由
    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 进行处理。

    (学习视频分享:web前端开发编程基础视频

    以上就是浅析Vue3动态组件怎么进行异常处理的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:掘金社区,如有侵犯,请联系admin@php.cn删除

    前端(VUE)零基础到就业课程:点击学习

    清晰的学习路线+老师随时辅导答疑

    自己动手写 PHP MVC 框架:点击学习

    快速了解MVC架构、了解框架底层运行原理

    专题推荐:前端 Vue.js JavaScript
    上一篇:(超详细)vue怎么进行路由跳转?三种方式分享 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • ❤️‍🔥共22门课程,总价3725元,会员免费学• ❤️‍🔥接口自动化测试不想写代码?• vue什么时候会出现白屏• vue的key是什么• vue的watch是做什么的• vue组件中data为啥是函数• vue路由模式有哪些
    1/1

    PHP中文网