v-for + key 使数据改变时 DOM 重排


title: v-for + key 使数据改变时 DOM 重排
date: 2019-01-02 22:26:19
tags: [Vue]
categories: Vue


疑问

最近做 Vue重构有赞商城 的项目时碰到一个问题:在购物车页面,左滑删除商品后,删除按钮的样式依然存在。

点击删除前:


youzan1.jpg

点击删除后,样式依然存在:


youzan2.jpg

原因

  1. 首先,购物车中的商品都是用 v-for 渲染的,而我是通过 ref 结合 下标index 拿到商品的 DOM 节点的。
  2. 我左滑点击删除时,实际上我做的是对数据删除的操作,而不是直接对 DOM 进行操作。所以其实 DOM 结构还是存在的
  3. v-for 把数据填充到 DOM 结构的时候有“就地复用”的策略。简单理解就是会复用原有的 DOM 结构,尽量减少 DOM 重排(重新生成布局)来提高性能。( v-for 在渲染时用的是虚拟 DOM ,将旧的和新的对比,根据差异再对 DOM 进行真实的渲染。)

解决方案

  1. 还原 DOM 样式
    在删除商品的方法中,将样式还原即可:
this.$refs[`goods-${shopIndex}-${goodsIndex}`][0].style.left = '0px'
  1. 绑定唯一识别key
    key 为每个节点提供身份标识,数据改变时会重排,所以最好绑定唯一标识。
    注意:如果用index标识可能得不到想要的效果,所以我在项目中使用了商品的 id 来作为 key 。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • # 传智播客vue 学习## 1. 什么是 Vue.js* Vue 开发手机 APP 需要借助于 Weex* Vu...
    再见天才阅读 3,624评论 0 6
  • vue概述 在官方文档中,有一句话对Vue的定位说的很明确:Vue.js 的核心是一个允许采用简洁的模板语法来声明...
    li4065阅读 7,275评论 0 25
  • 响应式布局的理解 响应式开发目的是一套代码可以在多种终端运行,适应不同屏幕的大小,其原理是运用媒体查询,在不同屏幕...
    懒猫_6500阅读 805评论 0 0
  • Vue是一个前端js框架,由尤雨溪开发,是个人项目 Vue近几年来特别的受关注,三年前的时候angularJS霸占...
    6e5e50574d74阅读 559评论 0 0
  • 我弟弟有一个玩具,可以学习音乐、可以学习拼读单词、可以考考你、学习单词、可以学习字母。上面有...
    王启萱阅读 307评论 0 0