开发者问题收集

获取无法读取未定义的属性(读取‘map’)?

2022-01-24
33

我在使用这个小测试组件时遇到了麻烦,我遗漏了什么?这只是一个简单的小问题,似乎映射在哪里中断了。我不知道我是否错误地传递了值,或者是什么

import React from "react";

export default function App() {
  const [state, setState] = React.useState({
    input: "",
    items: [],
    error: false
  });

  const { input, items, error } = state;

  const changeState = (state) => {
    return setState(state);
  };

  if (input.length > 10) {
    React.useEffect(() => {
      changeState({ error: false });
    });
  }

  const handleUpdateInput = (e) => {
    if (e.key === "Enter") {
      changeState({ items: [e.target.value, ...items] });
      changeState({ input: "" });
    }
  };

  const removeItem = (item) => {
    changeState({ items: items.filter((i) => i !== item) });
  };

  return (
    <div>
      <input
        onChange={(e) => {
          changeState({ input: e.target.value });
        }}
        value={input}
        onKeyPress={handleUpdateInput}
      />
      {items.map((item, index) => {
        return (
          <div key={index}>
            {item} <span onClick={removeItem(item)}>X</span>
          </div>
        );
      })}
      {error && <div>Input is too long!</div>}
    </div>
  );
}
1个回答

当你使用钩子设置状态时,传入的值将是 精确 的新状态 - 如果它恰好是一个对象,它将不会与旧状态合并,就像类组件一样。

因此,例如,你需要将

changeState({ error: false });

更改为

changeState({ ...state, error: false });

并在你设置状态的所有其他地方执行相同操作。

但更好的方法(我推荐,并且 React 推荐)是从一开始就使用单独的状态变量:

const [items, setItems] = useState([]);

通过将

changeState({ items: [e.target.value, ...items] });

更改为

setItems([e.target.value, ...items]);

进行设置,并对 inputerror 也遵循相同的模式。

CertainPerformance
2022-01-24