Vue动态组件实现异常处理方法

 更新时间:2023年02月01日 08:32:07   作者:忧郁的蛋~  
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动态组件怎么进行异常处理的详细内容,有不当的地方还请大家多多指教

到此这篇关于Vue动态组件实现异常处理方法的文章就介绍到这了,更多相关Vue动态组件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解决vue中reader.onload读取文件的异步问题

    解决vue中reader.onload读取文件的异步问题

    这篇文章主要介绍了解决vue中reader.onload读取文件的异步问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • vue实现直播间点赞飘心效果的示例代码

    vue实现直播间点赞飘心效果的示例代码

    这篇文章主要介绍了vue实现直播间点赞飘心效果的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • vue 如何根据条件判断属性的添加和去除

    vue 如何根据条件判断属性的添加和去除

    这篇文章主要介绍了vue 如何根据条件判断属性的添加和去除,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • vue中使用svg-icon遇到的坑及解决

    vue中使用svg-icon遇到的坑及解决

    这篇文章主要介绍了vue中使用svg-icon遇到的坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • 教你使用vue-autofit 一行代码搞定自适应可视化大屏

    教你使用vue-autofit 一行代码搞定自适应可视化大屏

    这篇文章主要为大家介绍了使用vue-autofit 一行代码搞定自适应可视化大屏教程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • VUE render函数使用和详解

    VUE render函数使用和详解

    这篇文章主要为大家介绍了VUE render函数,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-12-12
  • 浅谈vue权限管理实现及流程

    浅谈vue权限管理实现及流程

    这篇文章主要介绍了浅谈vue权限管理实现及流程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • Vue3 源码解读之副作用函数与依赖收集

    Vue3 源码解读之副作用函数与依赖收集

    本文深入分析了副作用的实现以及执行时机,并详细分析了用于存储副作用函数的targetMap的数据结构及其实现原理,还深入分析了依赖收集track函数以及派发更新 trigger 函数的实现,需要的朋友可以参考下
    2022-08-08
  • 使用VUE+iView+.Net Core上传图片的方法示例

    使用VUE+iView+.Net Core上传图片的方法示例

    这篇文章主要介绍了使用VUE+iView+.Net Core上传图片的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • Vue首页界面加载优化实现方法详解

    Vue首页界面加载优化实现方法详解

    如果你也遇到在 vue 应用中,首页加载资源过多,导致加载缓慢的问题,下面的方法也许能帮到你,主要的处理思想是:让首页多余的资源能在需要它的时候再加载
    2022-09-09

最新评论