未捕获的类型错误:无法读取 null 的属性 - React.js
2022-07-05
3324
const deletePerson = (persons) => {
axios
.delete(`http://localhost:3001/persons/${persons.name}`)
.then(console.log(`done`))
.then(response => response.data)
.then(setPersons(Object.values(persons).filter(q => q.name !== false)))}
我是 React.js 的新手。 我遇到了一个问题,几天来一直在尝试解决。 我添加了用于删除请求的按钮,但以不同的方式,它返回了相同类型的错误: 未捕获的 TypeError:无法读取 null 的属性(读取“名称”)。
用例是我在结果方法中使用此按钮,它会自动过滤人员列表:
const Filter = (props) => {return (<> {props.persons.filter(person => person.name.toLowerCase().includes(props.showFiltered.toLowerCase())).map((filteredName, id) => (
<li key={id.toString()}>
{filteredName.name} {filteredName.number} <Button text='delete' handleClick={props.deletePerson} />
</li>
))}
</>)}
3个回答
看起来您使用的是基于整个对象的数组值,而不是对象内部的人员值。从外观上看,您正在尝试查找值为 false 的名称,该名称似乎与您那里的内容不匹配。
您可能正在寻找类似这样的内容
.then(setPersons(Object.values(personsList).filter(q => q.name !== persons.name)))}
Devon Ray
2022-07-05
TLDR; (已更新)
const deletePerson = (persons) => {
axios
.delete(`http://localhost:3001/persons/${persons.persons.name}`)
.then(console.log(`done`))
.then((response) => response.data)
.then(() => setPersons(persons["persons"].filter((q) => q.name !== false)));
};
说明:
使用
Object.values(persons)
将返回如下所示的嵌套数组:
[
[
{ "name": "Arto Hellas", "number": "040-123456", "id": 1 },
{ "name": "Ada Lovelace", "number": "39-44-5323523", "id": 2 },
{ "name": "Dan Abramov", "number": "12-43-234345", "id": 3 },
{ "name": "Mary Poppendieck", "number": "39-23-6423122", "id": 4 }
]
]
但是,您期望
q
变量为:
[
{ "name": "Arto Hellas", "number": "040-123456", "id": 1 },
{ "name": "Ada Lovelace", "number": "39-44-5323523", "id": 2 },
{ "name": "Dan Abramov", "number": "12-43-234345", "id": 3 },
{ "name": "Mary Poppendieck", "number": "39-23-6423122", "id": 4 }
]
因此,有两种方法可以解决此问题:
-
提取嵌套数组
Object.values(persons)
=>Object.values(persons)[0]
-
直接访问对象值
Object.values(persons)
=>persons["persons"]
2022-07-05
发生错误的原因可能是因为请求失败,因为您没有向
deletePersons
函数传递任何内容。
const Filter = (props) => {
return (
<>
{props.persons
.filter((person) =>
person.name.toLowerCase().includes(props.showFiltered.toLowerCase())
)
.map((filteredName, id) => (
<li key={id.toString()}>
{filteredName.name} {filteredName.number}
<Button text="delete" handleClick={() => props.deletePerson(props.persons)} />
</li>
))}
</>
);
};
2022-09-19