从本指南中,我在这里找到:
https://daveceddia.com/where-fetch-data-redux/
我有一个漂亮的标准减速器,可以处理数据,加载和错误:
import {
FETCH_PRODUCTS_BEGIN,
FETCH_PRODUCTS_SUCCESS,
FETCH_PRODUCTS_FAILURE
} from './productActions';
const initialState = {
items: [],
loading: false,
error: null
};
export default function productReducer(state = initialState, action) {
switch(action.type) {
case FETCH_PRODUCTS_BEGIN:
return {
...state,
loading: true,
error: null
};
case FETCH_PRODUCTS_SUCCESS:
return {
...state,
loading: false,
items: action.payload.products
};
case FETCH_PRODUCTS_FAILURE:
return {
...state,
loading: false,
error: action.payload.error,
items: []
};
default:
return state;
}
}
然后是调用动作并根据这些状态进行绘制的组件:
import React from "react";
import { connect } from "react-redux";
import { fetchProducts } from "/productActions";
class ProductList extends React.Component {
componentDidMount() {
this.props.dispatch(fetchProducts());
}
render() {
const { error, loading, products } = this.props;
if (error) {
return <div>Error! {error.message}</div>;
}
if (loading) {
return <div>Loading...</div>;
}
return (
<ul>
{products.map(product =>
<li key={product.id}>{product.name}</li>
)}
</ul>
);
}
}
const mapStateToProps = state => ({
products: state.products.items,
loading: state.products.loading,
error: state.products.error
});
export default connect(mapStateToProps)(ProductList);
这在第一次使用时效果很好:
产品为空。因此,第一个渲染将显示空白列表。第二次(获取完成后)产品将有商品。
现在,问题是,如果我离开组件然后再次进入(例如,使用react-router),会发生什么情况。
第一次,它将使用redux存储中的缓存信息进行绘制。然后,在提取之后,我将重新绘制新列表。
有什么办法可以避免这种情况吗?
我想过几个“解决方案”,但我不确定它们是否行得通/是好的做法:
答案 0 :(得分:0)
将我想要的产品存储在Redux中,并且仅在与用户选择的产品匹配时渲染产品。如果不匹配,则获取请求的产品。