【相关推荐:vuejs视频教程】
动态组件有两种常用场景:
(资料图片)
一是动态路由:
// 动态路由export const asyncRouterMap: Array = [ { path: "/", name: "index", meta: { title: "首页" }, component: BasicLayout, // 引用了 BasicLayout 组件 redirect: "/welcome", children: [ { path: "welcome", name: "Welcome", meta: { title: "引导页" }, component: () => import("@/views/welcome.vue") }, ... ] }]
登录后复制
二是动态渲染组件,比如在 Tabs 中切换:
{{ item.name }} // 关键在这里
登录后复制
在 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([{ name: "组件 A", component: markRaw(A)}, { name: "组件 B", component: markRaw(B)}])
登录后复制
对于动态路由的处理:
import { markRaw } from "vue"// 动态路由export const asyncRouterMap: Array = [ { 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中文网其它相关文章!