【问题标题】:React.memo issue with ReduxRedux 的 React.memo 问题
【发布时间】:2020-09-29 15:19:58
【问题描述】:

我有两个组件。

function Parent(props){

  const handleClick = () => {
   console.log(props.stateA);
  };

  return <div><Child text={stateB} handleClick={handleClick} /></div>
}

const mapStateToProps = (state) => {
  return {
    stateA: state.stateA // stateA will be changed somewhere else
    stateB: state.stateB
  }
};

export default connect(mapStateToProps)(Parent);
function Child(props) {
   return <div onClick={props.handleClick}>{props.text}</div>
}

export default React.memo(Child,(prev, next) => {
   return prev.text === next.text
});

我的问题是当 stateA 在某处发生更改时,单击 Child 将记录以前的 stateA。我无法访问最新的 stateA。

你可以看到,我不想Child在stateA改变时重新渲染,它应该只在stateB改变时重新渲染。但是我想在点击Child时访问Parent中的最新状态A。

有什么方法可以解决这个问题吗?

【问题讨论】:

    标签: reactjs redux react-redux react-hooks react-memo


    【解决方案1】:

    如果Parent 组件是功能组件,那么你可以这样使用

     const [valueA, setValueA] = useState('')
     useEffect(() => {
          setValueA(props.stateA)
     },[props.stateA])
    
     console.log(valueA) // latest Value of stateA
     return <div><Child text={stateB} handleClick={handleClick} /></div>
    

    我希望它对你有用。

    【讨论】:

    【解决方案2】:

    你应该可以访问props.stateA没问题

    const handleClick = () => {
       console.log(props.stateA);
    };
    

    因为您在handleClick 中访问了父母的道具。所以如果props.stateA 是陈旧的,那么合乎逻辑的结论是父母没有收到最新的道具。我们可以看看你是如何更新 props/state 的吗?

    【讨论】:

    • 父级确实收到了 stateA。我试过 {props.stateA} 在 dom 中显示它
    • 所以 props.stateA 不是陈旧的?尝试测试这个const handleClick = useCallback(() =&gt; { console.log(props.stateA); },[props.stateA]);
    • 它仍然得到相同的结果。我知道这就像这个问题stackoverflow.com/questions/57543996/… 但我不知道如何在我的情况下解决它。
    • 我明白了。在这种情况下没有简单的解决方案,因为 Child 总是有一个陈旧版本的 handleClick 和你的 memo 条件。我建议从父母那里删除备忘录,只在真正需要它的孩子身上使用它。我想我自己学到了一些新东西
    猜你喜欢
    • 2021-01-07
    • 1970-01-01
    • 1970-01-01
    • 2019-08-23
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 2018-03-16
    • 2020-03-23
    相关资源
    最近更新 更多