前端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,切换隐藏显示的时候。
相关文章
|
6天前
|
JavaScript 前端开发 API
Vue.js:现代前端开发的强大框架
【10月更文挑战第11天】Vue.js:现代前端开发的强大框架
58 41
|
4天前
|
前端开发 JavaScript 安全
在vue前端开发中基于refreshToken和axios拦截器实现token的无感刷新
在vue前端开发中基于refreshToken和axios拦截器实现token的无感刷新
28 4
|
5天前
|
JavaScript 算法 前端开发
深入剖析Vue中v-for的使用及index作为key的弊端
深入剖析Vue中v-for的使用及index作为key的弊端
13 2
|
22小时前
|
JavaScript 前端开发 Java
vue2知识点:Vue封装的过度与动画
vue2知识点:Vue封装的过度与动画
7 0
|
5天前
|
JSON 前端开发 JavaScript
Vue微前端新探:iframe优雅升级,扬长避短,重获新生
Vue微前端新探:iframe优雅升级,扬长避短,重获新生
27 0
|
5天前
|
JavaScript 前端开发 应用服务中间件
vue前端开发中,通过vue.config.js配置和nginx配置,实现多个入口文件的实现方法
vue前端开发中,通过vue.config.js配置和nginx配置,实现多个入口文件的实现方法
35 0
|
5天前
|
JavaScript 前端开发 应用服务中间件
Vue开发中,在实现单页面应用(SPA)前端路由时的hash模式和history模式的区别及详细介绍
Vue开发中,在实现单页面应用(SPA)前端路由时的hash模式和history模式的区别及详细介绍
13 0
|
6天前
|
监控 JavaScript 前端开发
深入了解Vue.js:构建现代前端应用的利器
【10月更文挑战第11天】深入了解Vue.js:构建现代前端应用的利器
10 0
|
5天前
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
|
5天前
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
17 0