javascript - 我无法正确地将用户输入添加到状态,当它出现时,地图不是函数错误
问题描述
我有一个简单的列表,它存储在 App 组件中。这用于显示所有人,我希望能够将新人添加到此列表中。我无法将输入添加到我的状态中,我收到一个错误,即 map 不是函数。我没有正确创建数组吗?
const App = () => {
const [persons, setPersons] = useState([
{
name: 'Artos Hellas',
id: 1
}
]);
const [newName, setNewName] = useState('');
const handleNewName = event => {
setNewName(event.target.value);
};
const addName = event => {
event.preventDefault();
const personObject = {
name: newName,
id: persons.length + 1
};
setPersons(persons.concat(personObject));
setPersons('');
};
const rows = () => persons.map(p => <li key={p.key}>{p.name}</li>);
return (
<div>
<h2>Phonebook</h2>
<form onSubmit={addName}>
<div>
name : <input value={newName} onChange={handleNewName} />
</div>
<div>
<button type="submit">add</button>
</div>
</form>
<h2>Numbers</h2>
<ul>{rows()}</ul>
</div>
);
};
解决方案
删除setPersons('');
语句,您可能想使用setNewName('')
:
const addName = event => {
event.preventDefault();
const personObject = {
name: newName,
id: persons.length + 1
};
setPersons(persons.concat(personObject));
// setPersons('');
setNewName('');
};
key
此外,您在渲染列表元素时得到了错误的道具:
// v Not p.key
const rows = () => persons.map(p => <li key={p.id}>{p.name}</li>);
此外,当您使用名为row
并调用它的函数时会感到困惑row()
,您可以尝试将其命名为类似操作renderRows
或仅使用ReactElement
数组:
const renderRows = () => persons.map(p => <li key={p.id}>{p.name}</li>);
<ul>{renderRows()}</ul>
// Or
const rows = persons.map(p => <li key={p.id}>{p.name}</li>);
<ul>{rows}</ul>
推荐阅读
- java - java中的UUID和sql server中的uniqueidentifier问题
- sql-server - SQL Server 2016 报表生成器不显示数据
- android - 我应该只写标识符还是在 Firestore 的字段文档中写所有数据?
- java - VisualVM not working on Windows 10: jpswin2
- php - UniSharp/Laravel Filemanager 将数据保存到数据库表
- elasticsearch - Elasticsearch:如果满足条件,则将字段从嵌套子级拉到父级
- python - 移动误差线图 wrt hist 图
- python - Scapy 字节与数据表示不同
- sql - 根据记录 SQL Server 获取百分比
- sql - 使用 SQL 查询的结果填充 Excel 用户表单文本框