MapStateToProps 到同步上下文中的组件状态
MapStateToProps to component state in an sync context
我知道我们可以通过这样做轻松地在组件状态下发送 mapStateToProps
的内容:
constructor(props){
super(props);
this.state = {
filteredApps: this.props.apps
}
}
在这个用例中,this.state.filteredApps
填充了从 Redux 映射到道具的内容。
但是,如果 this.props.apps
仅在异步调用后才正确填充怎么办?在异步上下文中,this.props.apps
在初始化时可能是一个空数组,直到获取实际数据。以此为例:
class AppFilterer extends React.Component {
constructor(props) {
super(props);
this.state = {
filteredApps : this.props.apps
}
}
componentWillMount() {
this.props.getApps();
}
render(){ return <div> </div> }
}
const mapStateToProps = state => {
let { apps } = state.Admin;
return { apps };
};
export default connect(mapStateToProps, { getApps })(AppFilterer);
在这种情况下,我的 Redux 操作(被 Saga 捕获)this.props.getApps();
是充满我的 props
应用程序的调用,是从 componentWillMount
函数调用的.它被初始化为一个空数组,然后在调用完成后填充应用程序。
我希望在从 API 中获取这些应用程序后对其进行过滤,因此想将它们放入我的组件状态中,这样我就不会弄乱 Redux 状态。在这种情况下,更新组件状态的最佳做法是什么?换句话说,是否有任何方法可以获取已映射到 props 的 saga 的结果并将其设置为组件的状态,或者我是否正在寻找一个奇怪的模式并且应该以其他方式过滤它?
首先,API 调用进入 componentDidMount
而不是 componentWillMount
,后者现在也已弃用。请参考本指南:
其次,当你使用 redux state 并将其映射到 props 时,你不应该在你的组件本地状态中设置它,这不是一个好的做法。当您的承诺 return 时,您将收到更新的道具,并且在这种情况下您始终可以依赖道具。
但是如果你仍然想这样做,你可以覆盖 componentDidUpdate(prevProps)
,它将在你的道具或状态更新时被调用。如果您仍想这样做,可以在这里设置您的状态。
过滤器注意事项
您可以在 componentDidUpdate
方法中进行过滤,例如:
this.setState({filteredApps. this.props.apps.filter(<your filter logic>)})
我知道我们可以通过这样做轻松地在组件状态下发送 mapStateToProps
的内容:
constructor(props){
super(props);
this.state = {
filteredApps: this.props.apps
}
}
在这个用例中,this.state.filteredApps
填充了从 Redux 映射到道具的内容。
但是,如果 this.props.apps
仅在异步调用后才正确填充怎么办?在异步上下文中,this.props.apps
在初始化时可能是一个空数组,直到获取实际数据。以此为例:
class AppFilterer extends React.Component {
constructor(props) {
super(props);
this.state = {
filteredApps : this.props.apps
}
}
componentWillMount() {
this.props.getApps();
}
render(){ return <div> </div> }
}
const mapStateToProps = state => {
let { apps } = state.Admin;
return { apps };
};
export default connect(mapStateToProps, { getApps })(AppFilterer);
在这种情况下,我的 Redux 操作(被 Saga 捕获)this.props.getApps();
是充满我的 props
应用程序的调用,是从 componentWillMount
函数调用的.它被初始化为一个空数组,然后在调用完成后填充应用程序。
我希望在从 API 中获取这些应用程序后对其进行过滤,因此想将它们放入我的组件状态中,这样我就不会弄乱 Redux 状态。在这种情况下,更新组件状态的最佳做法是什么?换句话说,是否有任何方法可以获取已映射到 props 的 saga 的结果并将其设置为组件的状态,或者我是否正在寻找一个奇怪的模式并且应该以其他方式过滤它?
首先,API 调用进入 componentDidMount
而不是 componentWillMount
,后者现在也已弃用。请参考本指南:
其次,当你使用 redux state 并将其映射到 props 时,你不应该在你的组件本地状态中设置它,这不是一个好的做法。当您的承诺 return 时,您将收到更新的道具,并且在这种情况下您始终可以依赖道具。
但是如果你仍然想这样做,你可以覆盖 componentDidUpdate(prevProps)
,它将在你的道具或状态更新时被调用。如果您仍想这样做,可以在这里设置您的状态。
过滤器注意事项
您可以在 componentDidUpdate
方法中进行过滤,例如:
this.setState({filteredApps. this.props.apps.filter(<your filter logic>)})