vue3动态组件使用技巧
动态组件有两种常用场景:
一是动态路由:// 动态路由 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: "index", meta: { title: "首页" }, component: markRaw(BasicLayout), // 使用 markRaw redirect: "/welcome", // ... } ]
而对于 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 推荐在使用动态组件用 markRaw 进行处理。
云南陇川边境线上村寨美来源人民网云南频道2021年,云南省陇川县陇把镇龙安村人均可支配收入达15000元,昔日贫穷落后的小山村已成为了当地有名的边境美丽村。蓝天下,龙安村内的鲜花绿树红墙彩画构成了一幅绚
谁能告诉我量子纠缠到底是个啥呀?前几天,今年诺贝尔物理学奖竟然颁给了量子纠缠!一时间引起了学界内外的激烈讨论,各流派观点激烈交锋。其实,这次诺奖并不是颁给量子纠缠的提出者(因为其提出者就是爱因斯坦本人),而是颁给
不可忽视的iphone备忘录,带你重新认识近日,不少iphone用户在社交媒体平台称,自己的备忘录被莫名清空,在苹果云端服务(iCloud)中无法找回。对此,苹果客服回应,有用户碰到相似情况,苹果会尝试在系统中帮忙恢复。事
随心掌控智能家居生活小米智能多模网关2体验智能家居所有设备都需要联网,网关就是协助智能家居设备联网的产品。近期收到了小米智能多模网关2,可以让WiFiZigbee蓝牙类设备实现互联互通,并且连接更加稳定,我换下多模1代网关
5队提前两轮锁定欧冠16强,巴萨一只脚已迈进欧联杯赛场南都讯记者陶新蕾巴萨在欧冠又悬了。北京时间10月13日凌晨,在20222023赛季欧冠小组赛第四轮比赛结束后,已有拜仁皇马曼城那不勒斯和布鲁日这5支球队提前锁定16强席位,补时阶段
为民造福砍柴人廖俊波同志任职期间,牢记党的嘱托,尽心尽责,带领当地干部群众扑下身子苦干实干,以实际行动体现了对党忠诚心系群众忘我工作无私奉献的优秀品质,无愧于全国优秀县委书记的称号。广大党员干部
科技互联网等大厂裁员为何越来越多?1。美国芯片制裁相关这块不详细展开了,大家感兴趣的可以去搜下,之前从技术渠道政策等方面,近期对人也加大了各种限制和关联但同时这块也会从长远来说让科技自主研发成为之后我们的主发展方向
中国女排13输在哪?两名副攻形同虚设,丁霞应该早一点上场中国女排13不敌意大利,无缘本届世锦赛四强,在朱婷和张常宁不在的情况下,这个结果并不是不可以接受。从三天前的03,到这一场的13,面对同一个对手,中国女排的表现有很大进步。但是比赛
宁德时代比亚迪领跌,新能源企业股价半数腰斩的背后毫无疑问,代表着未来方向的新能源车如今正在逐渐展现出强劲的发展势头,新能源品牌无论在市场定位声量上也大有赶超传统品牌之势。但是,在资本市场上却完全是另一番风景。在汽车工业的发源地欧
一夜三消息!普尔即将续约76人签下三连冠后卫哈登首次谈降薪北京时间10月12日,NBA季前赛正在火热进行当中,与此同时NBA的场外新闻同样不少。根据消息人士透露,普尔即将提前续约,最快下周76人签下勇士队三连冠后卫麦考补充球队的阵容深度哈
NBA一夜签裁动态湖人官宣一签一裁预计普尔下周与勇士续约北京时间10月12日,过去一夜NBA又有哪些签约和裁员动态?湖人再次官宣一签一裁,预计普尔下周与勇士续约,火箭连续裁掉两名球员,老鹰和独行侠执行多名球员的球队选项,太阳也裁员。湖人