Javascript 有条件地使用setState和redux state的正确方法
我有一个问题,关于在组件中使用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
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
});
}
}