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

React中修改State对象单个键值报错:Cannot read properties of null

解决React State更新时TypeError: Cannot read properties of null (reading 'value')的问题

这个错误的核心原因是React合成事件的池化机制:React会复用事件对象,在事件处理函数执行完成后,会把事件对象的属性重置为null。而setState的更新回调是异步执行的,当回调触发时,原来的事件对象已经被回收,所以访问event.target就会抛出Cannot read properties of null的错误。

你的chng函数没报错只是偶然情况,本质上和chgd存在同样的风险,正确的修复方式是提前从事件对象中提取需要的值,再在setState回调中使用:

const chng = event => {
  // 先提取value,保存到局部变量
  const selectedGame = event.target.value;
  setOtp(prevValues => {
    return { ...prevValues, opts: selectedGame };
  });
};

const chgd = event => {
  const selectedDay = event.target.value;
  setOtp(prevValues => {
    return { ...prevValues, das: selectedDay };
  });
};

修改后的完整代码如下:

import React, { useState } from "react";

const options = ["cricket", "football", "hockey"];
const days = ["weekday", "weekend"];

function App() {
  const [otp, setOtp] = useState({ opts: "", das: "" });

  const chng = event => {
    const selectedGame = event.target.value;
    setOtp(prevValues => {
      return { ...prevValues, opts: selectedGame };
    });
  };

  const chgd = event => {
    const selectedDay = event.target.value;
    setOtp(prevValues => {
      return { ...prevValues, das: selectedDay };
    });
  };

  return (
    <div className="App">
      <h1>Which game</h1>
      {options.map(value => (
        <div key={value}>
          <input
            type="radio"
            name="options"
            id={value}
            value={value}
            onChange={chng}
          />
          <label htmlFor={value}>{value}</label>
        </div>
      ))}
      <h1>Which Day</h1>
      {days.map(value => (
        <div key={value}>
          <input
            type="radio"
            name="days"
            id={value}
            value={value}
            onChange={chgd}
          />
          <label htmlFor={value}>{value}</label>
        </div>
      ))}
      <p>Will Play {otp.opts} on {otp.das}</p>
    </div>
  );
}

export default App;

另外,你之前在chgd里加的if (event.target && event.target.value)判断没有实际作用——判断是同步执行的,但setState回调是异步的,当回调执行时event.target已经被重置为null了,所以提前提取值才是根本解决方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 16:03:28