懒猫

文章 评论 浏览 28

懒猫 2022-05-04 13:57:53

3 (1)

vue和react虽然都采用了diff算法。 但是diff设计是截然不同的, vue采用依赖收集追踪,可以更加细粒度的更新组件,即给模板使用到的每一个属性绑定监听, 而react是采用自顶而下的更新策略,每次小的改动都会生成一个全新的vdom。

不管是什么diff算法,核心都是一样的,key的作用主要是为了高效的更新虚拟DOM列表,key 值是用来判断 VDOM 元素项的唯一依据 。 使用key不保证100%比不使用快,这就和Vdom不保证比操作原生DOM快是一样的,这只是一种权衡,其实对于用index作为key是不推荐的,除非你能够保证他们不会发生变化。这个key要体现唯一,通常推荐使用server给的SQL-ID。通常接口返回的又没有SQL-ID,怎么办呢,又不能用随机数,只能用index代替喽!

推荐使用shortid生成唯一key的数组,和数据数组一起使用,省去提交数据时再重组数组。

案例:

import React from 'react';
import shortid from 'shortid';

class Demo extends React.Component {
    constructor(props) {
    super(props);
    this.state = {
      data: ['a', 'b', 'c']
    }
    this.dataKeys = this.state.data.map(v => shortid.generate());
  }
  
    deleteOne = index => { // 删除操作
        const { data } = this.state;
        this.setState({ data: data.filter((v, i) => i !== index) });
        this.dataKyes.splice(index, 1);
    }
    
    render() {
      return (
          <ul>
               {
                   data.map((v, i) => 
                    <li 
                        onClick={i => this.deleteOne(i)}  
                        key={this.dataKeys[i]}
                    >
                        {v}
                    </li>
                    )
               } 
            </ul>
      )
  }
}

另外需要指明的是:

  • key不是用来提升react的性能的,不过用好key对性能是有帮组的。
  • 不能使用random来使用key
  • key相同,若组件属性有所变化,则react只更新组件对应的属性;没有变化则不更新。
    -key值不同,则react先销毁该组件(有状态组件的componentWillUnmount会执行),然后重新创建该组件(有状态组件的constructor和componentWillUnmount都会执行)

React小技巧汇总

第 1 题:写 React / Vue 项目时为什么要在列表组件中写 key,其作用是什么?

懒猫 2022-05-04 13:51:28

@mqyqingfeng 感觉(false || obj.b)()像是一个自调用立执行函数,所以是函数调用模式.

JavaScript 深入之从 ECMAScript 规范解读 this

更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文