这篇“Vue3动态组件如何进行异常处理”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Vue3动态组件如何进行异常处理”文章吧。动态组件有两种常用场景:一是动态路由:
//动态路由 exportconstasyncRouterMap: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' importAfrom'./components/A.vue' importBfrom'./components/B.vue' interfaceComponentList{ name:string component:Component //... } consttab=ref([{ name:"组件A", component:markRaw(A) },{ name:"组件B", component:markRaw(B) }])
对于动态路由的处理:
import{markRaw}from'vue' //动态路由 exportconstasyncRouterMap:Array=[ { path:'/', name:'home', meta:{title:'首页'}, component:markRaw(BasicLayout),//使用markRaw //... } ]
而对于 shallowRef 和 markRaw,2 者的区别在于 shallowRef 只会对 value 的修改做出反应,比如:
conststate=shallowRef({count:1}) //不会触发更改 state.value.count=2 //会触发更改 state.value={count:2}
而 markRaw,是将一个对象标记为不可被转为代理。然后返回该对象本身。
constfoo=markRaw({}) console.log(isReactive(reactive(foo)))//false //也适用于嵌套在其他响应性对象 constbar=reactive({foo}) console.log(isReactive(bar.foo))//false
可看到,被 markRaw 处理过的对象已经不是一个响应式对象了。对于一个组件来说,它不应该是一个响应式对象,在处理时,shallowRef 和 markRaw 2 个 API,推荐使用 markRaw 进行处理。以上就是关于“Vue3动态组件如何进行异常处理”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注百云主机行业资讯频道免费云主机域名。
这篇文章主要介绍“.NetCore日志记录器如何实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“.NetCore日志记录器如何实现”文章能帮助大家解决问题。ILoggerFactory是日志记录器的工厂接口类,用于配…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。