获取无法读取未定义的属性(读取‘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]);
进行设置,并对
input
和
error
也遵循相同的模式。
CertainPerformance
2022-01-24