无法读取未定义的属性(读取 'split')React

Cannot read properties of undefined (reading 'split') React

传递产品 ID 后,我将被重定向到产品详细信息页面。在该页面中,我有产品的详细信息,例如名称、目的地、价格和日期等。当我使用 redux 并从 mongodb 获取数据时,日期保存为 2021-11-23T18:00:00.000Z 这种格式。因此,在我的产品详细信息页面中获取数据后,我使用 flight?.data?.date.split("T")[0] 仅显示日期。但是在点击按钮进入商品详情页面后,却出现如下错误TypeError: Cannot read properties of undefined (reading 'split')。但是当我从代码中删除 split 部分时,它工作正常。我想唯一的原因是代码在加载数据之前是 运行 。因此,为此我尝试通过分派加载操作在数据加载之前显示加载微调器。但它不起作用。我已经将 redux thunk 用于其他操作,这就是我在 Action 中添加异步的原因。否则它会给我 dispatch is not defined.

详情页

import { CircularProgress } from "@mui/material";
import React, { useEffect } from "react";
import { useSelector, useDispatch } from "react-redux";
import { useParams } from "react-router-dom";
import { getFlight, loadingStatus } from "../../actions/flights";
import "./Details.css";

const FlightDetails = () => {
  const flight = useSelector((state) => state.flights);
  console.log("flight", flight.loading);

  const dispatch = useDispatch();
  const { id } = useParams();

  useEffect(() => {
    dispatch(loadingStatus(true));
    dispatch(getFlight(id));
    dispatch(loadingStatus(false));
  }, [id, dispatch]);

  return (
    <div className="details_parent">
      {flight.loading ? (
        <CircularProgress />
      ) : (
        <div className="details_container">
          <div className="form_data">
            <span>From</span>
            <h3>{flight?.data?.from}</h3>
          </div>
          <div className="form_data">
            <span>To</span>
            <h3>{flight?.data?.to}</h3>
          </div>
          <div className="form_data">
            <span>Airline</span>
            <h3>{flight?.data?.airline}</h3>
          </div>
          <div className="form_data">
            <span>Trip type</span>
            <h3>{flight?.data?.flightType}</h3>
          </div>
          <div className="form_data">
            <span>Date(yyyy-mm-dd)</span>
            <h3>{flight?.data?.date.split("T")[0]}</h3>
          </div>
          <div className="form_data">
            <span>Price</span>
            <h1>${flight?.data?.price}</h1>
          </div>
        </div>
      )}
    </div>
  );
};

export default FlightDetails;

减速器

const initialState = {
  data: [],
  loading: false,
};
const reducer = (state = initialState, action) => {
  switch (action.type) {
    case "GET_FLIGHTS":
      return { ...state, data: action.payload };

    case "GET_FLIGHT":
      return { ...state, data: action.payload };

    case "CREATE_FLIGHT":
      return { ...state, data: { ...action.payload } };

    case "SEARCH":
      return { ...state, data: action.payload };

    case "LOADING":
      return { ...state, loading: action.payload };

    default:
      return state;
  }
};

export default reducer;

操作数

export const loadingStatus = (status) => async (dispatch) => {
  dispatch({
    type: "LOADING",
    payload: status,
  });
};

React 在 运行 任何 useEffect 调用之前运行第一个渲染。将您的初始加载状态更改为 true。

const initialState = {
  data: [],
  loading: true,
};

为什么你不使用 flight?.data?.date?.split("T")[0]

但在这种情况下,您必须将 loading in initial data of reducer 设置为 true

const initialState = {
  data: [],
  loading: true,
};

我没有设置单独的操作来更改加载状态,而是在操作中获取数据之前设置了调度。在返回承诺后,我再次将调度设置为 false。

获取具体航班数据的操作

export const getFlight = (id) => async (dispatch) => {
  try {
    dispatch({
      type: "LOADING",
      payload: true,
    });

    const { data } = await api.fetchFlight(id);

    dispatch({
      type: "GET_FLIGHT",
      payload: data,
    });
    dispatch({
      type: "LOADING",
      payload: false,
    });
  } catch (error) {
    console.log(error);
  }
};