reactjs - React useEffect 在页面刷新后不会调度 redux 操作
问题描述
我正在尝试从来自 API 的以下数据对象呈现数据。
{
"code": 0,
"c": "verified",
"d": "verified",
"leaseInfo": {
"infoId": 6
},
"cpfPrice": "500.00",
"carCurrentLocation": {
"id": 1,
"carId": "df47a56a395a49b1a5d06a58cc42ffc4"
},
"n": "verified",
"p": "false",
"ownerCarInfo": {
"brand": "Ferrari",
"model": "0"
},
"serviceFeeRate": 0.10,
"depositPrice": "100.00",
"pics": [
{
"picid": 49,
"carId": "df47a56a395a49b1a5d06a58cc42ffc4"
},
],
"items": {
"itemid": 5,
"carId": "df47a56a395a49b1a5d06a58cc42ffc4"
}
}
我react-redux
用来调度一个动作,在那里我将获得一个名为“ carDetails
”的状态下的数据。
但是,当我尝试访问数据时,如果我的组件被刷新,carDetails
就会变成undefined
“ Cannot read property ownerCarInfo of undefined.
”
我carDetails
在我的 React 组件中获取和解构这样的数据:
import React, {useEffect} from 'react';
import { useDispatch, useSelector } from 'react-redux';
const CarInfo = ({ match }) => {
const dispatch = useDispatch();
const details = useSelector((state) => state.carDetails);
const { loading, carDetails } = details;
const {pics, carCurrentLocation, items, ownerCarInfo} = carDetails;
useEffect(() => {
dispatch(getCarDetails(match.params.id));
}, [dispatch, match]);
return (
<div>
{loading ? (
<Loader></Loader>
) : (
<>
<p>{d.depositPrice}</p>
<p>{ownerCarInfo.brand}</p>
</>
)}
</div>
); )
}
只要组件或React
应用程序不刷新,它就会检索数据并正确显示。页面一刷新,carDetails
就变成一个空数组。
这是getCarDetails()
动作:
export const getCarDetails = (id) => async (dispatch, getState) => {
try {
dispatch({
type: CAR_DETAILS_REQUEST,
});
const { userLogin } = getState();
const { userInfo } = userLogin;
const config = {
headers: {
Authorization: userInfo.token,
'Content-Type': 'application/json',
},
};
const { data } = await axios.get(
`${BASE_API}/car/info/getDetails/${id}/${userInfo.bscId}`,
config
);
dispatch({
type: CAR_DETAILS_SUCCESS,
payload: data,
});
} catch (error) {
dispatch({
type: CAR_DETAILS_FAIL,
payload:
error.response && error.response.data.msg
? error.response.data.msg
: error.msg,
});
}
};
这是我的减速机:
export const carsDetailsReducer = (state = { carDetails: [] }, action) => {
switch (action.type) {
case CAR_DETAILS_REQUEST:
return { loading: true };
case CAR_DETAILS_SUCCESS:
return { loading: false, carDetails: action.payload };
case CAR_DETAILS_FAIL:
return { loading: false, error: action.payload };
default:
return state;
}
};
这就是我carDetails
在 redux 商店中声明的方式。
const reducer = combineReducers({
carDetails: carsDetailsReducer,
});
是什么原因导致carDetails
未定义并且useEffect
在页面刷新时未运行?
解决方案
如果您正在使用您的操作,那么在您调用 API 时,axios
您的操作应该看起来像这样。async
await
如果您在api
链接中传递 API 汽车 ID,则传递id
参数:
import axios from "axios";
export const loadData = (id) => async (dispatch) => {
dispatch({
type: "CAR_DETAILS_REQUEST",
});
const detailData = await axios.get("http:\\****/id");
dispatch({
type: "CAR_DETAILS_SUCCESS",
payload: {
success: detailData.data,
},
});
};
减速器:
const initailState = { carDetails: [], loading: true };
export const carsDetailsReducer = (state = initailState, action) => {
switch (action.type) {
case CAR_DETAILS_REQUEST:
return { ...state,
loading: true
};
case CAR_DETAILS_SUCCESS:
return {...state,
loading: false,
carDetails: action.payload
};
case CAR_DETAILS_FAIL:
return { ...state,
loading: false,
error: action.payload };
default:
return ...state;
}
};
您的useEffect应该仅在获取数据时起作用:
import React, {useEffect} from 'react';
import { useDispatch, useSelector } from 'react-redux';
const CarInfo = ({ match }) => {
const dispatch = useDispatch();
const details = useSelector((state) => state.carDetails);
const { loading, carDetails } = details;
const {pics, carCurrentLocation, items, ownerCarInfo} = carDetails;
useEffect(() => {
dispatch(getCarDetails(id));
}, [dispatch]);
return (
<div>
{loading ? (
<Loader></Loader>
) : (
<>
<p>{d.depositPrice}</p>
<p>{ownerCarInfo.brand}</p>
</>
)}
</div>
你也可以在没有 auseEffect
的情况下使用它,方法是创建如下onclick()
函数:
const loadDetailHandler = () => {
dispatch(getCarDetails(id));
};
return (
<div onClick={loadDetailHandler} >
</div>
推荐阅读
- flutter - 创建信使墨水瓶
- c# - 读取文件中的所有行并拆分多个字符串c#
- python - 找到将随机数插入字符串的所有可能性?(Python)
- google-cloud-functions - Flutter_Stripe 包 - 使用付款表创建市场(+Firebase 云功能)
- python - 如何在特定标签中查找现有数字,但该标签存在多次(beautifulsoup)
- wordpress - 使用数字登录 wordpress jwt auth api & (otp)
- android - 我在 android studio 上运行应用程序时遇到问题
- testing - 测试舵图模板
- django - 如何优化 Django oscars 搜索视图?
- python - 如何打印完整金字塔的金字塔?