javascript - 页面重新加载后无法从 redux 存储中获取数据
问题描述
我成功地创建了一个名为market(父组件)的组件,它在组件安装到屏幕时通过调度的操作从我的 firestore 数据库中获取数据,以便将数据库的内容存储在我的 redux 存储中。我现在从 redux 存储中检索我的数据并将它们映射到名为CardItem的子组件中,当被选中时,获取所选项目的 id 并将其传递给路由参数,并将我推送到名为User的路由。我现在将用户路由连接到我的 redux 存储,目的是从中提取数据并使用通过路由参数传递的 id 过滤选择的用户,以便在componentDidMount()中设置状态生命周期方法。我的逻辑是成功的,直到我尝试重新加载路由,然后使我的 redux 存储中的数据消失(第一次重新加载后状态返回未定义)。
对此的任何见解都非常感谢,我是否从 redux 存储中提取数据并使用通过路由参数传递的 id 过滤用户,而不是必须将另一个操作发送到数据库并随后进行过滤?
下面是市场(父组件)和嵌套用户(子组件)路由。
市场成分
...
class market extends Component{
componentDidMount = () => {
this.props.fetch()
// console.log(this.props.data)
};
// state={
// }
userSelectHandler= (id)=> {
this.props.history.push({pathname: '/user/'+ id})
}
render(){
let list=null
if(this.props.loading){
list=(<Spinner/>)
}
if(this.props.data){
list=(
this.props.data.map((data)=>(
<CardItem userSelect={()=>this.userSelectHandler(data.id)} key={data.id} data={data}/> ))
)
}
return (
<section>
<SearchBar/>
{list}
</section>
)
}
}
const mapStateToProps= state=> {
return{
data: state.market.data,
loading: state.ui.loading
}
}
const mapDispatchToProps= dispatch=>{
return{
fetch: ()=>dispatch(fetchData())
}
}
export default connect(mapStateToProps,mapDispatchToProps)(market)
用户组件...类用户扩展组件{
componentDidMount= ()=>{
let copyData= [...this.props.user]
copyData= this.props.user.filter(user=> user.id === +this.props.match.params.id)
console.log(copyData[0])
this.setState({
user: copyData[0]
})
}
state={
user:null
}
componentDidUpdate= ()=> {
console.log('will update')
console.log(this.props.user)
}
render(){
let card = (<Spinner/>)
if(this.state.user){
card=(
<article className={classes.CardBox}>
<aside className={classes.CardBox_profDetails}>
<p>{this.state.user.name}</p>
<p></p>
</aside>
<aside className={classes.CardBox_pricingDetails}>
<p>{this.state.user.rate}/rmb</p>
<p>{this.state.user.range}rmb</p>
</aside>
</article>
)
}
return(
<>
{card}
</>
)
}
}
const mapStateToProps= state => {
return{
user: state.market.data
}
}
export default connect(mapStateToProps)(User)
解决方案
这是因为您的应用程序中有路由数据依赖于其他互斥的路由。
换句话说,这归结为您的应用程序架构,您的应用程序逻辑在错误的位置,或者您的路由结构应该更改
从广义上讲,在我看来,您有两种选择。
- 制作
market
顶级路线和user
市场cardItem
的孩子。例如,使用 React Router v3,您的路由结构可能类似于以下内容:
<Route path="market" component={MarketContainer}>
<Route path="user" component={UserContainer} />
<Route path="card-item" component={CardItemContainer} />
</Route>
您的应用程序路由将嵌套如下,并呈现为children
顶级market
路由,可以访问它请求的数据ComponentWillMount
/market/user
/market/card-items
并且您的MarketContainer
渲染方法将渲染children
道具类似于:
render() {
const { loading, children } = this.props;
if (loading) {
return <Spinner/>;
}
return (
<section>
<SearchBar/>
{children} // your children would be able to access to data in the redux store and handle rendering themselves
</section>
);
}
- 使用副作用库,例如
redux-saga
处理您的应用程序控制流,但这完全是另一个考虑/问题
希望有帮助
推荐阅读
- java - Android 应用没有互联网连接 - 无需权限
- android - QoS=1 与 MqttAsyncClient 订阅未命中消息
- python - 多处理并非在所有 CPU 内核上运行
- javascript - 刷新 div 后 CSS 样式不起作用
- c# - Asp.net Core 2.1 日志记录
- javascript - 如何在电子 js 中创建模态?(javascript、html、css)
- laravel - 当我在 laravel 中更改与 auth 链接的默认表“用户”时,它会导致我的 API 出现未经授权的结果,
- azure - 如何使用构建管道部署 Azure 数据工厂资源?
- python - import pystan._api failed:ImportError: DLL load failed: 找不到指定的模块
- python - Maya Python // 错误:没有对象匹配名称,For 循环的结果