发布于 2024 年 2 月 26 日,星期一
Vue3的Transition组件在处理动画效果时,开发者可能会遇到一些常见问题,如动画不触发、样式冲突、性能瓶颈等。这些问题往往源于对Vue3的响应式系统和Transition组件工作机制的理解不足。本质上,Vue3的Transition依赖于CSS过渡和动画,以及JavaScript钩子函数来控制元素的显示和隐藏。开发者需要正确配置transition和animation属性,确保样式优先级正确,并合理使用v-if和v-show指令来触发过渡效果。此外,性能优化也是关键,避免在频繁更新的组件中使用复杂的过渡效果,以免影响用户体验。
系列首发于公众号『非同质前端札记』https://mp.weixin.qq.com/s?__biz=MzkyOTI2MzE0MQ==&mid=2247485576&idx=1&sn=5ddfe93f427f05f5d126dead859d0dc8&chksm=c20d73c2f57afad4bbea380dfa1bcc15367a4cc06bf5dd0603100e8bd7bb317009fa65442cdb&token=1071012447&lang=zh_CN#rd ,若不想错过更多精彩内容,请“星标”一下,敬请关注公众号最新消息。
<template>
<!-- 错误写法 -->
<Transition><!-- xxxx --></Transition>
</template>
<script setup></script>
上述代码错误信息:
有趣的是,官方文档https://cn.vuejs.org/guide/built-ins/transition.html 中并没有提到 Transition
子元素不能包含注释。
第一步:看到 Cannot read properties of undefined (reading 'loc')
,习惯性(Uncaught (in promise) ReferenceError: xxxxx is not defined
) 地在本地 Transition.vue
页面中寻找 loc
变量,结果没有找到。然后我在全局查找,还是没有找到 loc
变量。(其实这一步是多余的,因为错误信息 [plugin:vite:vue] Cannot read properties of undefined (reading 'loc')
,并不是由于本地文件没有 loc
变量导致的,而是因为源码内部插件报的错误。)
Transition
组件内必须包含 一个元素
或 只有一个根元素的组件
且不能是注释, 才能通过运行时编译。第三步:尝试修改。在 Transition
组件里包含一个元素,发现它通过了。
第四步: 看单测源码 warnTransitionChildren.spec.ts
https://github.com/vuejs/core/blob/f924bd68bc2bcb8e920e83134450658e7c55929b/packages/compiler-dom/__tests__/transforms/warnTransitionChildren.spec.ts,对于喜欢深入了解的同学可以看一下。
Transition
组件 子元素不能包含注释
,这会导致无法通过运行时编译,导致组件不能正确渲染。(我踩了半小时的坑,不要跟我一样)
Transition
子元素不允许多个组件或元素,否则编译不通过,根据单测源码得知,如果需要多个分支,可以使用 v-if, v-if-else
来确定具体分支。Transition
子元素的组件中可以包含注释,但是不要包含太多,不然会影响渲染效率。希望大家能从我的经验中获得一些收获,避免重复踩坑。
Q:(question)
R:(result)
A:(attention matters)
D:(detail info)
S:(summary)
Ana:(analysis)
T:(tips)