【问题标题】:react-redux can update child smart components without updating parents?react-redux 可以在不更新父母的情况下更新子智能组件?
【发布时间】:2017-01-29 03:36:35
【问题描述】:

想象一下下面的 React 结构:

SmartComponentA -> DumbComponentB -> SmartComponentC

还可以想象 SmartComponentA 和 SmartComponentC 在其mapStateToProps 函数中分别连接到不同的状态切片。

最后,假设我们将console.log 放在每个组件的渲染方法中。

当我实际尝试这个时,在第一次渲染时,我看到所有组件都按预期记录。但是,如果我更改 SmartComponentC 的数据,我只会看到一条日志消息(C 的日志消息),并且看不到 SmartComponentA 或 DumbComponentB 记录任何内容。这怎么可能? react-redux 如何让 React 在不更新父母的情况下更新孩子?

我会假设 shouldComponentUpdate 内部的 shouldComponentUpdatethe overriding connect 将意味着 SmartComponentA 不会被重新渲染(因为它的状态部分没有改变),因此会导致短路- 防止 SmartComponentC 重新渲染的电路。虽然 connect 的实现与纯渲染混合不同,两者都通过更改 shouldComponentUpdate 来工作,但纯渲染文档明确指出,如果父级不这样做,React 将“纾困”(正如他们所说) t需要重新渲染:

对于 C2 的子树和 C7,它甚至不必计算虚拟 DOM,因为我们在 shouldComponentUpdate 上进行了救助。

source

如果我的问题仍然不明确,这里是设置的伪代码,我在问为什么我可以继续输入 C 的输入,它只将 C 的消息记录到控制台而不是A和B(为什么不短路)

//////////////////////////////////////////////

const SmartComponentA = (props) => {
  console.log('rendering SmartComponentA');

  return <DumbComponentB bData={props.bData} />;
};

const mapStateToProps = (state) => { bData: state.bData };

export default connect(mapStateToProps)(SmartComponentA);

//////////////////////////////////////////////

const DumbComponentB = (props) => {
  console.log('rendering DumbComponentB');

  return (
    <div>
      {props.bData}
      <SmartComponentC />
    </div>
  );
}

export default DumbComponentB;

//////////////////////////////////////////////

const SmartComponentC = (props) => {
  console.log('rendering SmartComponentC');

  return (
    <div>
      <input value={props.cValue} onChange={props.changeCValue} />
    </div>
  );
}

const mapStateToProps = (state) => { cValue: state.cValue };

export default connect(mapStateToProps, { changeCValue })(SmartComponentC);
//////////////////////////////////////////////

在第一次渲染时,我会看到所有日志消息,然后如果我继续输入,每次按键时我只会看到 C 的日志消息。

【问题讨论】:

    标签: react-redux


    【解决方案1】:

    Prop 更改会触发 React 组件生命周期,这通常会触发每个子组件的生命周期,除非 -- 正如您所观察到的,该过程可以被 shouldComponentUpdate 短路。

    但是,prop 的变化不仅仅是触发组件生命周期的事情——状态变化也是如此。这就是连接功能的工作原理。 Connect 组件 subscribes to the store 和任何商店更改 checks to see 如果它将更新智能组件的道具(基于 mapStateToProps)。如果是这样,它将set it's own state 触发 Connect 组件及其子组件的生命周期函数。

    【讨论】:

    • 但这是否意味着 React 只重新渲染状态发生变化的组件,而不是整个渲染树?
    • 是的。它重新渲染状态发生变化的组件。以及其下游的任何组件。因此,如果您将记录器放在 DumbComponentD 中并从 SmartComponentC 传递道具,那么 D 也将重新渲染。
    • 好吧,好东西,我想这就是我要挂断的!
    猜你喜欢
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 2020-09-14
    • 2018-10-09
    • 2016-06-30
    • 2021-04-02
    • 1970-01-01
    相关资源
    最近更新 更多