代码之家  ›  专栏  ›  技术社区  ›  j_d

这是shouldComponentUpdate的合理实现吗?

  •  2
  • j_d  · 技术社区  · 7 年前

    我已经使用React很多年了,但是从来没有一个可行的实现方法 shouldComponentUpdate

    但是,这样的东西有什么问题:

    shouldComponentUpdate(nextProps, nextState) {
      const propsChanged = JSON.stringify(this.props) !== JSON.stringify(nextProps)
      const stateChanged = JSON.stringify(this.state) !== JSON.stringify(nextState)
      return propsChanged || stateChanged
    }
    

    这样合适吗?这会以意想不到的方式失败吗?

    JSON.stringify 直接比较字符串也会是非常快的操作。

    总的来说,这种方法在我看来是合理的,但我想知道我是否遗漏了任何明显的缺陷。

    3 回复  |  直到 7 年前
        1
  •  4
  •   T.J. Crowder    7 年前

    这会以意想不到的方式失败吗?

    JSON.stringify 必须进行深度对象遍历 无论如何

    它失败的一种方式是 JSON.stringify文件 可以为等效对象返回不同的字符串(这是指定的行为):

    const o1 = {a: 1, b: 2};
    const o2 = {b: 2, a: 1};
    const str1 = JSON.stringify(o1);
    const str2 = JSON.stringify(o2);
    console.log(str1);
    console.log(str2);
    console.log(str1 === str2);

    创建 以不同的顺序。这可能不会发生在你的顶级道具或状态属性上,但是从属对象呢? this.setState({foo}); 哪里 foo 是在不同时间以不同方式创建的对象…)

        2
  •  0
  •   Daniel Hilgarth Richard    7 年前

    不,这不是一个合理的实施。 JSON.stringify 是一个潜在的缓慢操作。

    PureComponent ? 这只是一个肤浅的比较,但这还不够吗?

        3
  •  0
  •   Tarek Essam    7 年前

    使用loadash.isEual方法 lodash