React 类组件和 React 功能组件更改 redux store 后访问 props 的区别

Posted

技术标签:

【中文标题】React 类组件和 React 功能组件更改 redux store 后访问 props 的区别【英文标题】:Difference in accessing props after change in redux store between React class component and React functional component 【发布时间】:2020-11-27 13:05:26 【问题描述】:

我很难理解为什么在基于类的组件和功能组件中,相同的步骤会产生不同的结果。下面我有一个例子来说明这种差异。

   class Test extends Component 
      handleSubmit = e => 
        e.preventDefault();
        this.props.form.validateFields(async (err, values) => 
 
            await this.props.saveUserDetailsAction(values);

            const  error  = this.props; // expected modified prop 

            if (!error.status) 
              this.props.router.push("/route");
             
        );
      ;
    

const mapStateToProps = ( app ) => (
 error: app.error
);

const mapDispatchToProps = 
  saveUserDetailsAction,
;

export default compose(
  withRouter,
  connect(
    mapStateToProps,
    mapDispatchToProps
  )
)(Test);

类组件中的当前错误属性反映了异步函数 saveUserDetailsAction 完成后 redux 存储中的更改,在这种情况下,如果请求失败,则会调度一个动作。

saveUserDetailsAction 函数显示更新后的 props 后访问错误 props。

编写为功能组件的相同代码不会产生相同的结果。在 saveUserDetailsAction 函数完成后访问 error 属性并不能反映 store 中的变化。

  const Test = (props) => 
      const handleSubmit = e => 
        e.preventDefault();
        props.form.validateFields(async (err, values) =>      

            await props.saveUserDetailsAction(values);

            const  error  = props;  // unchanged prop when accessed here

            if (!error.status) 
              props.router.push("/route");
            
        );
      ;
    

const mapStateToProps = ( app ) => (
 error: app.error
);

const mapDispatchToProps = 
  saveUserDetailsAction,
;

export default compose(
  withRouter,
  connect(
    mapStateToProps,
    mapDispatchToProps
  )
)(Test);

【问题讨论】:

【参考方案1】:

在我看来,这是一种反模式,您需要等待另一个循环才能获得正确的错误道具。功能组件是正确的行为。 你需要做的是在这里找到一种返回错误的方法:

const  error  = await props.saveUserDetailsAction(values);

Redux 存储错误变量仍然可以在另一个组件中使用

其他方法是使用 useEffect(() => , [error]) 并区分 3 种状态“​​尚未提交”、“提交时没有错误”、“提交时出错”,但我不推荐它

【讨论】:

以上是关于React 类组件和 React 功能组件更改 redux store 后访问 props 的区别的主要内容,如果未能解决你的问题,请参考以下文章

React 功能组件在重新挂载后停止渲染状态更改

React组件化-类组件和函数组件介绍

react---Hooks的基本使用---巷子

React - 父类组件功能改变子组件的类

如何编写扩展功能组件的 ES6 类 React 组件?

在 React 中将类组件转换为功能组件