列表滚动时缓存失效,样式错乱怎么办?
我在做移动端商品列表页,用的是 Vue + keep-alive 缓存组件。但每次从详情页返回,列表的滚动位置虽然保留了,可部分 item 的样式却乱了——比如价格颜色变错、按钮状态重置。
我怀疑是组件复用时 class 没更新,但数据明明是对的。试过给每个 item 加 key,也检查过生命周期钩子,还是不行。下面是我 item 的 CSS 片段:
.product-item {
padding: 12px;
border-bottom: 1px solid #eee;
}
.product-item.on-sale .price {
color: #ff4d4f;
}
.product-item.sold-out .price {
color: #999;
}
是不是缓存和动态 class 冲突了?该怎么解决?
先说最直接的解决办法:
1. 检查你的 v-for 的 key,必须用唯一 id 别用 index
2. 重点检查 item 组件内部的 class 绑定方式
你提供的 CSS 本身没问题,问题出在数据到 class 的映射上。估计你是这样写的:
这种方式在缓存复用时容易出问题。我的做法是直接用 computed 返回完整的 class 字符串:
然后模板里用
:class="itemClass"。如果还不行,就在 item 组件里加一个 watch 强制刷新:
不过
$forceUpdate是下策,最好还是找到根本原因。另一个容易忽略的点:检查你列表数据本身有没有问题。是不是返回列表时数据被部分覆盖了?特别是如果你的数据是从 Vuex 或接口返回的,确认返回后数据是完整的。
你用的是 item 组件还是直接在列表里写的模板?如果是单独的组件,很可能是组件内部的响应式数据没跟上外部的变化。