Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 有条件地使用setState和redux state的正确方法_Javascript_Reactjs_Redux_React Redux - Fatal编程技术网

Javascript 有条件地使用setState和redux state的正确方法

Javascript 有条件地使用setState和redux state的正确方法,javascript,reactjs,redux,react-redux,Javascript,Reactjs,Redux,React Redux,我有一个问题,关于在组件中使用setState和redux state的最佳实践是什么 例如:我有一个带有onClick事件的组件 在组件A的onClick事件中,我调度了一些redux操作,这些操作将更改reducer的redux状态: someOnClickFunc = () => { this.props.someReduxAction() } 我有一个组件b: import React, { Component } from 'react' import { connect

我有一个问题,关于在组件中使用setState和redux state的最佳实践是什么

例如:我有一个带有
onClick
事件的组件

在组件A的
onClick
事件中,我调度了一些redux操作,这些操作将更改reducer的redux状态:

someOnClickFunc = () => {
   this.props.someReduxAction()
}
我有一个组件b:

import React, { Component } from 'react'
import { connect } from "react-redux";
import { bindActionCreators } from "redux";

class ComponentB extends Component {
    constructor(props) {
        super(props);
        this.state = {
          someValue: false,
        };
      }
    render() {
        return (
            <div>
                {someValue}
            </div>
        )
    }
}

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

  export default connect(
    mapStateToProps,
  )(ComponentB);
但我不想用这个。州。。。我更喜欢这样使用此.setState:

  if (this.props.someReduxState.someVal == true) {
      this.setState({
        someValue: true
      })
    }
哪里是最好的地方

当我在render()componentdiddupdate之后执行此操作时,我遇到以下错误:

超过最大更新深度。当组件在componentWillUpdate或componentDidUpdate内重复调用setState时,可能会发生这种情况。React限制嵌套更新的数量以防止无限循环


我认为最好的方法是使用componentdiddupdate方法。但是有一个问题,你需要检查来自redux状态的新道具是否与已经存在的道具相同。只有这样,你才能继续改变你的状态。下面是一个例子:

componentDidUpdate(prevProps, prevState) {
    if(prevProps.somedata.data !== this.props.somedata.data) {
              this.setState({                  //update the state after checking
                 someProperty: value
               }); 
     }
}

您可以在
componentdiddupdate
中执行此操作,但还需要检查状态值是否与道具值不同(尚未设置)。但为什么要这么做呢?我猜你根本不需要这个,但还没有足够的证据表明你想做什么。我之所以这么做,是因为我需要将组件b的状态从组件a改变为组件a,如何用另一种方式?如果它们彼此不是父子,并且componentDidUpdate也会给出相同的错误,这看起来像是一个反模式。。。为什么你不能只使用商店里的状态?几乎可以肯定有更好的方法来做你想做的事情。我不明白在我的情况下如何使用这种方法。nextProps.someData将成为我的redux状态?编辑答案。生命周期方法接受两个参数。prevProps和prevState。使用
mapstatetops
可以在
this.props
中获得新的道具。您可以将以前的道具与新道具进行比较,并决定是否更新。通过更新,我指的是使用
this.setState
来改变状态。我这样使用它:if(prevProps.someReduxState.someVal!==this.props.someReduxState.someVal)这是正确的方式吗?它成功了。如果它对你有效,请投票回答:)。我相信这是正确的方法,您应该学习更多关于生命周期方法的知识,它们是如何工作的,以及如何响应优化技术。
componentDidUpdate(prevProps, prevState) {
    if(prevProps.somedata.data !== this.props.somedata.data) {
              this.setState({                  //update the state after checking
                 someProperty: value
               }); 
     }
}