前端BUG录-使用VUE做飘屏功能因为:key设置错误造成异常动画

简介: 如果你是想看怎么做?那么你可以直接去看我之前写的Vue 实现弹幕效果。正好这段时间内部在抽离常用组件,运营小姐姐最近迷上了飘屏功能,各种活动都要有个飘屏才罢休。然后就安排人抽离成组件了。结果这个组件在同一个位置绊倒了两个人,那么今天我们来分析一下。

复现BUG



BUG复现地址:https://www.lilnong.top/static/html/vue-bug-bullet.1.html

BUG修复地址:https://www.lilnong.top/static/html/vue-bug-bullet.2.html

BUG对比地址:https://www.lilnong.top/static/html/vue-bug-bullet.3.html


bVcHmGg.webp.jpg


可以直接查看对比地址,会发现左边的动画异常闪动,而且 DOM 没有被移除

弹幕逻辑


  1. 一秒 push 一条数据。


  1. 五条通道循环


  1. 动画 7s, animationend 事件移除第一个


分析问题


  1. 第一步,我们先排查逻辑,看看是否因为移除的时候不对,造成了数据错乱。可以看到我们是 shift,基于我们的定长动画,肯定是第一个先执行完成。


animationend(){
     this.list.push(this.bulletlist.shift())
},


.bullet-animation{animation: right2left 7s linear both;}


2.经过我们的观察,像是动画突然换行,并且前进了。然后我们打开控制台直接查看 DOM,发现是所有的内容改变,并不是 DOM 节点改变。


3.到了这个我们可以分析出了问题,DOM 被复用了,因为动画是作用在 DOM 上的,当前 DOM 的动画已经完成了。
那么 Vue 的 DOM 复用规则是什么呢?


https://cn.vuejs.org/v2/guide/list.html 当 Vue 正在更新使用 v-for 渲染的元素列表时,它默认使用“就地更新”的策略。如果数据项的顺序被改变,Vue 将不会移动

DOM 元素来匹配数据项的顺序,而是就地更新每个元素,并且确保它们在每个索引位置正确渲染。 https://cn.vuejs.org/v2/api/#ke

网络异常,图片无法展示
|
4. 通过上面的文档,我们可以看到,提供一个合理的 key 就可以强制渲染 DOM,可以触发过渡。那么我们就查看一下 key 设置的什么呢? :key="idx"


看来我们找到了问题,因为 idx 和 item 其实没有固定的对应关系的,所以 DOM 被复用了,应该使用 :key="item.id"


总结



让我们遇事不决,量子力学一哈。

  1. 在 Vue 中使用 v-for 应该搭配一个 :key 来使用。


  1. :key 需要是一个唯一值,比如 id。最好不要用 index。


  1. 如果需要强制更新 DOM,我们可以使用 :key 来告诉 Vue 引擎这是两个不同的元素。


相似问题


有的人可能会说,为什么我也用了下标为什么没有报错呢?

其实还有挺多相似问题的,核心点就是有没有进行过修改


  1. 比如说有排序移动,如果没有提供一个合理的 key,那么就会乱套


  1. 两个结构相似,但是没有使用 v-for,切换隐藏显示的时候。
相关文章
|
11天前
|
缓存 安全 JavaScript
前端安全:Vue应用中防范XSS和CSRF攻击
【4月更文挑战第23天】本文探讨了在Vue应用中防范XSS和CSRF攻击的重要性。XSS攻击通过注入恶意脚本威胁用户数据,而CSRF则利用用户身份发起非授权请求。防范措施包括:对输入内容转义、使用CSP、选择安全的库;采用Anti-CSRF令牌、同源策略和POST请求对抗CSRF;并实施代码审查、更新依赖及教育团队成员。通过这些实践,可提升Vue应用的安全性,抵御潜在攻击。
|
2天前
|
JSON JavaScript Java
从前端Vue到后端Spring Boot:接收JSON数据的正确姿势
从前端Vue到后端Spring Boot:接收JSON数据的正确姿势
9 0
|
3天前
|
前端开发 JavaScript 开发者
【专栏:HTML与CSS前端技术趋势篇】前端框架(React/Vue/Angular)与HTML/CSS的结合使用
【4月更文挑战第30天】前端框架React、Vue和Angular助力UI开发,通过组件化、状态管理和虚拟DOM提升效率。这些框架与HTML/CSS结合,使用模板语法、样式管理及组件化思想。未来趋势包括框架简化、Web组件标准采用和CSS在框架中角色的演变。开发者需紧跟技术发展,掌握新工具,提升开发效能。
|
4天前
|
JSON JavaScript 前端开发
前端框架vue的样式操作,以及vue提供的属性功能应用实战
前端框架vue的样式操作,以及vue提供的属性功能应用实战
|
4天前
|
JavaScript 前端开发 数据安全/隐私保护
优秀的前端框架vue,原理剖析与实战技巧总结【干货满满】(二)
优秀的前端框架vue,原理剖析与实战技巧总结【干货满满】(二)
|
4天前
|
JavaScript 前端开发 Python
优秀的前端框架vue,原理剖析与实战技巧总结【干货满满】(一)
优秀的前端框架vue,原理剖析与实战技巧总结【干货满满】(一)
|
4天前
|
开发框架 缓存 前端开发
|
9月前
|
Web App开发 前端开发 JavaScript
前端学习笔记202307学习笔记第五十七天-模拟面试笔记react-fiber解决了什么问题
前端学习笔记202307学习笔记第五十七天-模拟面试笔记react-fiber解决了什么问题
98 0
|
9月前
|
前端开发 定位技术
前端学习笔记202305学习笔记第二十三天-地图单线程配置
前端学习笔记202305学习笔记第二十三天-地图单线程配置
66 0
前端学习笔记202305学习笔记第二十三天-地图单线程配置
|
9月前
|
前端开发 API
前端学习笔记202307学习笔记第五十七天-模拟面试笔记react-react-redux的工作流程
前端学习笔记202307学习笔记第五十七天-模拟面试笔记react-react-redux的工作流程
55 0