未捕获的类型错误:刷新后无法读取未定义的属性(读取‘0’)
2022-10-21
571
我这里有一个奇怪的问题,所以我正在使用 redux,这是我从 Reducer 状态中选择产品的组件代码。
import './productInfo.css';
import { useParams } from 'react-router-dom';
import { getProduct } from '../../actions/productActions';
import { connect } from 'react-redux';
import { useEffect, useState } from 'react';
const ProductInfo = (props) => {
const [usedProduct, setUsedProduct] = useState(props)
const {id} = useParams();
useEffect(() => {
props.getProduct(id);
}, [usedProduct])
let newUsedProduct = usedProduct;
console.log(usedProduct.products[0].name)
return (
<div>
</div>
);
}
const mapStateToProps = (state) => {
return{
products : state.myProduct.product
}
}
export default connect( mapStateToProps, { getProduct })(ProductInfo);
所以当我第一次启动组件时,它可以工作,我从 Reducer 状态中获得了必要的数据,但是当我刷新页面时,它给了我这个错误: Uncaught TypeError:无法读取未定义的属性(读取“0”) 在这行代码中:
console.log(usedProduct.products[0].name)
我完全迷路了!
2个回答
当您重新加载页面时,所有 React 状态(包括 Redux 状态)都会丢失,因为它们仅存在于内存中。组件应处理可能丢失的数据。
示例:
const ProductInfo = ({ getProduct, products }) => {
const { id } = useParams();
useEffect(() => {
getProduct(id);
}, [id, getProduct]);
useEffect(() => {
console.log(products?.[0]?.name); // <-- log in effect
}, [products]);
return (
<div>
...
</div>
);
};
const mapStateToProps = (state) => ({
products: state.myProduct.product || [], // <-- provide fallback
});
export default connect(mapStateToProps, { getProduct })(ProductInfo);
我还建议更新代码以使用
react-redux
钩子。
示例:
import { useDispatch, useSelector } from 'react-redux';
const ProductInfo = () => {
const dispatch = useDispatch();
const products = useSelector(state => state.myProduct.product || []);
const { id } = useParams();
useEffect(() => {
dispatch(getProduct(id));
}, [id, getProduct]);
useEffect(() => {
console.log(products?.[0]?.name); // <-- log in effect
}, [products]);
return (
<div>
...
</div>
);
};
export default ProductInfo;
Drew Reese
2022-10-21
Redux 存储(默认设置)不会通过刷新持久化,您需要使用一些持久化方法(将其存储在 localstorage 或类似的东西中)或者您需要在读取之前始终重新填充存储。
Wraithy
2022-10-21