前端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,切换隐藏显示的时候。
相关文章
|
12天前
|
JSON 前端开发 搜索推荐
惊!这些前端技术竟然能让你的网站实现个性化推荐功能!
【10月更文挑战第30天】随着互联网技术的发展,个性化推荐已成为提升用户体验的重要手段。前端技术如JavaScript通过捕获用户行为数据、实时更新推荐结果等方式,在实现个性化推荐中扮演关键角色。本文将深入解析这些技术,并通过示例代码展示其实际应用。
43 4
|
12天前
|
前端开发 JavaScript 开发者
前端开发的终极技巧:如何让你的代码既简洁又高效,还能减少bug?
【10月更文挑战第30天】前端开发充满挑战与创新,如何编写简洁高效且少bug的代码是开发者关注的重点。本文介绍五大技巧:1. 模块化,提高代码复用性;2. 组件化,降低代码耦合度;3. 使用现代框架,提高开发效率;4. 统一代码规范,降低沟通成本;5. 利用工具,优化代码质量。掌握这些技巧,让前端开发更高效。
27 1
|
24天前
|
缓存 JavaScript 测试技术
Vue 代理设置
【10月更文挑战第14天】Vue 代理设置是 Vue 项目开发中非常重要的一个环节。通过合理的代理设置,我们可以解决跨域问题,提高开发效率和用户体验。
32 1
|
30天前
|
JavaScript 算法 前端开发
深入剖析Vue中v-for的使用及index作为key的弊端
深入剖析Vue中v-for的使用及index作为key的弊端
25 2
|
1月前
|
前端开发 JavaScript
前端中的“+”连接符,居然有鲜为人知的强大功能!
【10月更文挑战第9天】前端中的“+”连接符,居然有鲜为人知的强大功能!
42 0
前端中的“+”连接符,居然有鲜为人知的强大功能!
|
1月前
|
数据可视化 JavaScript 前端开发
低代码可视化工具--vue条件判断v-if可视化设置-代码生成器
低代码可视化工具--vue条件判断v-if可视化设置-代码生成器
32 2
|
1月前
|
JavaScript 前端开发 API
|
1月前
|
JavaScript API UED
vue.js怎么实现全屏显示功能
【10月更文挑战第7天】
18 1
|
1月前
|
资源调度 JavaScript UED
如何使用Vue.js实现单页应用的路由功能
【10月更文挑战第1天】如何使用Vue.js实现单页应用的路由功能
|
1月前
|
前端开发 开发工具 git
如何清理 docker 磁盘空间+修改 Gitea 服务器的 Webhook 设置+前端一些好学好用的代码规范-git hook+husky + commitlint
如何清理 docker 磁盘空间+修改 Gitea 服务器的 Webhook 设置+前端一些好学好用的代码规范-git hook+husky + commitlint
33 5