美文网首页
v-for + key 使数据改变时 DOM 重排

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

作者: 祈念念念 | 来源:发表于2019-01-04 21:49 被阅读0次

    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 。

    相关文章

      网友评论

          本文标题:v-for + key 使数据改变时 DOM 重排

          本文链接:https://www.haomeiwen.com/subject/maqxrqtx.html