数组状态上的 PureComponent 浅比较仍然重新呈现页面

Posted

技术标签:

【中文标题】数组状态上的 PureComponent 浅比较仍然重新呈现页面【英文标题】:PureComponent shallow compare on array state stil re-renders page 【发布时间】:2021-09-12 05:34:20 【问题描述】:

如何对 PureComponent 进行浅比较以检查数组是否相等?

我有这门课:

class Login extends React.PureComponent 

  constructor() 
    super();
    this.state = 
      errorMsg: []
    
  

  signIn = async (fields) => 
   ......
    try 
      ......
      if (data.status === true) 
       ......
       else 

        // error message is still the same after constant login fails
        this.setErrorMsg(`$data.msg`);
      

     catch (error) 
     
    

  

  setErrorMsg(errorArr) 
    this.setState( errorMsg: [errorArr] );
  

  render() 
    ......
    this.state.errorMsg.map((err) =>
        <Alert
         className="p-1"
         variant="danger"
         show=err
         transition=false
         key=err
        >
        err
        </Alert>
    )
    ......
  

this.state.errorMsg 更新为相同的值后,它仍然重新渲染,因为["Credentials is wrong"] === ["Credentials is wrong"] 返回false。如何动态地对数组状态进行浅比较?

【问题讨论】:

【参考方案1】:

这就是浅比较的工作原理。 PureComponents 不适用于this。您可以传递特定的数组元素,例如 errMsg[0]

来自文档:

仅当您希望拥有简单的道具和状态时扩展 PureComponent,或者当您知道深层数据结构已更改时使用 forceUpdate()。或者,考虑使用不可变对象来促进嵌套数据的快速比较。

【讨论】:

我试过了:shouldComponentUpdate(nextProps, nextState) return JSON.stringify(this.state.errorMsg) !== JSON.stringify(nextState.errorMsg); 这可能出了什么问题? JSON.stringify(this.state.errorMsg) !== JSON.stringify(nextState.errorMsg);应该返回假。是否有其他东西触发了重新渲染? 没错,我希望它在 shouldComponentUpdate 中返回 false。但我认为我必须使用不可变的 js

以上是关于数组状态上的 PureComponent 浅比较仍然重新呈现页面的主要内容,如果未能解决你的问题,请参考以下文章

React 的 PureComponent Vs Component

React 中的 PureComponent 和 Component 对比

React 中的 PureComponent 和 Component 对比

React 组件之 Component PureComponent Function Component

PureComent要和immutable一起使用

[react] 如何解决引用类型在pureComponent下修改值的时候,页面不渲染的问题?