You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React组件出现Cannot read properties of undefined(reading 'advertHistory')错误求助

解决React RelateEdit组件中的"Cannot read properties of undefined (reading 'advertHistory')"错误

错误原因

组件首次渲染时,relate的初始值为undefined(因为useState()未设置初始值),而useFormik会在此时立即执行,直接访问relate.advertHistory这类属性自然会触发"读取undefined的属性"错误。另外,useEffect中的异步请求是在组件挂载后才发起的,请求完成前relate一直是undefined,这期间的渲染必然会导致报错。

修复方案

可以通过以下几种方式解决,推荐结合使用:

1. 给relate设置初始空对象

将useState()改为useState({}),这样初始时relate是一个空对象,访问它的属性时不会抛出错误,只会返回undefined,待异步请求完成后再更新为真实数据。

2. 使用可选链操作符(?.)安全访问属性

在访问relate的属性时添加?.,确保当relate为undefined或null时不会报错,直接返回undefined。

3. 处理受控输入框的undefined值

在input的value属性中添加|| "",避免因为值为undefined导致输入框显示"undefined"字符串,同时满足受控组件的要求。

修复后的完整代码

import axios from "axios";
import React, { useEffect, useState } from "react";
import { useParams } from "react-router-dom";
import { useFormik } from "formik";

function RelateEdit() {
  const { relate_id } = useParams();
  // 设置初始空对象
  const [relate, setRelate] = useState({});

  useEffect(() => {
    axios
      .get(`http://localhost:3000/real-estate/${relate_id}`)
      .then((data) => setRelate(data.data))
      .catch((error) => console.log(error));
  }, [relate_id]);

  // 使用可选链安全访问日志
  console.log(relate?.advertHistory);
  const formik = useFormik({
    initialValues: {
      advertHistory: relate?.advertHistory,
      buildingAge: relate?.buildingAge,
      city: relate?.city,
      deposit: relate?.deposit,
      district: relate?.district,
      dues: relate?.dues,
      floorLocation: relate?.floorLocation,
      furnished: relate?.furnished,
      heating: relate?.heating,
      neighbourhood: relate?.neighbourhood,
      numberOfBathrooms: relate?.numberOfBathrooms,
      numberOfRooms: relate?.numberOfRooms,
      situation: relate?.situation,
      title: relate?.title,
      url: relate?.url,
    },
    onSubmit: (values) => {
      axios
        .put(`http://localhost:3000/real-estate/${relate_id}`, values)
        .then((res) => console.log(res))
        .catch((error) => console.log(error));
    },
  });

  return (
    <div>
      {relate_id && relate && (
        <div>
          <form onSubmit={formik.handleSubmit}>
            <input
              type="text"
              onChange={formik.handleChange}
              name="advertHistory"
              value={formik.values.advertHistory || ""}
            />
            <br />
            <input
              type="text"
              onChange={formik.handleChange}
              name="buildingAge"
              value={formik.values.buildingAge || ""}
            />{" "}
            <br />
            <input
              type="text"
              onChange={formik.handleChange}
              name="city"
              value={formik.values.city || ""}
            />
            <br />
            <input
              type="text"
              onChange={formik.handleChange}
              name="deposit"
              value={formik.values.deposit || ""}
            />
            <br />
            <input
              type="text"
              onChange={formik.handleChange}
              name="district"
              value={formik.values.district || ""}
            />
            <br />
            <input
              type="text"
              onChange={formik.handleChange}
              name="dues"
              value={formik.values.dues || ""}
            />
            <br />
            <input
              type="text"
              onChange={formik.handleChange}
              name="floorLocation"
              value={formik.values.floorLocation || ""}
            />
            <br />
            <input
              type="text"
              onChange={formik.handleChange}
              name="furnished"
              value={formik.values.furnished || ""}
            />
            <br />
            <input
              type="text"
              onChange={formik.handleChange}
              name="heating"
              value={formik.values.heating || ""}
            />
            <br />
            <input
              type="text"
              onChange={formik.handleChange}
              name="neighbourhood"
              value={formik.values.neighbourhood || ""}
            />
            <br />
            <input
              type="text"
              onChange={formik.handleChange}
              name="numberOfBathrooms"
              value={formik.values.numberOfBathrooms || ""}
            />
            <br />
            <input
              type="text"
              onChange={formik.handleChange}
              name="numberOfRooms"
              value={formik.values.numberOfRooms || ""}
            />
            <br />
            <input
              type="text"
              onChange={formik.handleChange}
              name="situation"
              value={formik.values.situation || ""}
            />
            <br />
            <input
              type="text"
              onChange={formik.handleChange}
              name="title"
              value={formik.values.title || ""}
            />
            <br />
            <input
              type="text"
              onChange={formik.handleChange}
              name="url"
              value={formik.values.url || ""}
            />
            <button type="submit">Güncelle</button>
          </form>
        </div>
      )}
    </div>
  );
}
export default RelateEdit;

内容的提问来源于stack exchange,提问作者edebali erman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 01:22:36