reactjs - React hooks 应用程序适用于以下静态数据,但在迭代真实数据时出错
问题描述
React hooks 应用程序可以很好地处理以下传递到下拉选择框中的静态选项数据。但是在集成到后端并迭代数据时,它会抛出错误Cannot read property 'name' of undefined
错误。有人可以请教可能是什么问题。
const options = [
{ name: 'Aaaan', email:"aaan@test.com", id: 1},
{ name: 'Baaa', email:"baaa@test.com", id: 2},
{ name: 'Crooo', email:"crooo@test.com", id: 3},
{ name: 'Daaa', email:"daaa@test.com", id: 4}
];
TypeError: Cannot read property 'name' of undefined
(anonymous function)
C:/project/work/devchoice/src/components/nominatePerson.js:121
118 | <div key={i}>
119 | <div className="row eachrecord">
120 | <div className="column" >
> 121 | <label className="nomlabel">{x[i].name} <b>>></b></label>
| ^ 122 | </div>
123 | <input
124 | required type='textarea'
View compiled
NominatePerson
C:/project/work/devchoice/src/components/nominatePerson.js:116
113 | </div>
114 | <form onSubmit={handleSubmit(sendNomination)}>
115 | <div className="nomineesSelectedList">
> 116 | <h4>Selected Nominees</h4>
| ^ 117 | {manageNominees.map((x, i) =>
118 | <div key={i}>
119 | <div className="row eachrecord">
NominatePerson.js
const NominatePerson = () => {
const maxOptions = 3;
const [manageNominees, setManageNominees] = useState([]);
const [nomRegister, setNomRegister] = useState([]);
const { register, handleSubmit, watch, formState: { errors }, reset} = useForm();
useEffect(() => {
const fetchData = async () => {
// const email = localStorage.getItem("loginEmail");
try {
const res = await Axios.get('http://localhost:8000/service/nomineeslist');
setManageNominees(res.data);
console.log("Get the list of nominees :" + res.data);
} catch (e) {
console.log(e);
}
}
fetchData();
}, []);
const handleTypeSelect = (e) => {
const copy = [...manageNominees];
copy.push(e);
setManageNominees(copy);
};
const handleTypeRemove = (e) => {
const copy = [...manageNominees];
let index = copy.indexOf(e);
copy.splice(index, 1);
setManageNominees(copy);
const updateList = nomRegister.map((item) => {
return { ...item };
});
//delete the specific array case depends on the id
updateList.splice(index, 1);
setNomRegister(updateList);
};
const sendNomination = () => {
console.log("Arry has: "+JSON.stringify(nomRegister));
};
manageNominees.forEach(option=>{
option.displayValue=option.name+"\t"+option.email;
})
const handleChange = (e, i) => {
const { name, email, value } = e.target;
const updateList = nomRegister.map((item) => {
return { ...item };
});
const emailList = selectedOption.map((x, j) => {
return x[j].email;
});
//change the specific array case depends on the id
updateList[i] = { ...updateList[i], name: name, email:emailList[i], reason: value };
setNomRegister(updateList);
};
return (
<div className="App">
<div className="navbar-nav">
<div className="leftNavItem">
<a><Link to={'/dashboard'} className="nav-link"> <b>Dashboard</b> </Link></a>
</div>
</div>
<h1>Nominate a person</h1>
<div className="nomineeSelectBox">
<div id="dialog2" className="triangle_down1"/>
<div className="arrowdown">
<Multiselect
onSelect={handleTypeSelect}
onRemove={handleTypeRemove}
options={manageNominees.length + 1 === maxOptions ? [] : manageNominees}
displayValue="displayValue"
showCheckbox={true}
emptyRecordMsg={"Maximum nominees selected !"}
/>
</div>
</div>
<div className="nominationcount">
</div>
<form onSubmit={handleSubmit(sendNomination)}>
<div className="nomineesSelectedList">
<h4>Selected Nominees</h4>
{manageNominees.map((x, i) =>
<div key={i}>
<div className="row eachrecord">
<div className="column" >
<label className="nomlabel">{x[i].name} <b>>></b></label>
</div>
<input
required type='textarea'
placeholder="Please provide reason for nomination.."
key={i}
id={i}
name={x[i].name}
className='nomineechoosed'
onChange={(e) => handleChange(e, i)}
/>
</div>
</div>
)}
<div className="row">
<div className="buttongroup">
<input id="Submit" type="submit" value="Submit"/>
<input id="Cancel" type="button" value="Cancel"/>
</div>
</div>
</div>
</form>
</div>
)
}
export default NominatePerson
解决方案
x
在回调函数中map
是对象。
manageNominees.map((x, i) =>{console.log(x)});
将为您打印完整的对象。
请参阅array.map的文档。
现在您看到的错误是因为name
在x
. 所以你应该尝试设置{x?.name}
.
编辑:正如 Ala Hamadi 在评论中提到的,?.
可选链接有助于检查嵌套对象上是否存在属性/键。
请参阅文档以获取可选链接运算符 (?.)
推荐阅读
- php - 如何比较数组元素中的数字然后从开始php获取常用数字
- pandas - 熊猫 | 使用位于另一个 Dataframe 中的两个整数值之间的整数过滤 DF 行
- php - 带有日期的CRUD,如何编辑日期?
- arrays - 熊猫数据框中的 Numpy 数组 - 如何规范化值,保持原始结构?
- flutter - 如何仅重建 Listview 中的特定项目?
- c# - 预期的方法名称 - VB.NET 到 C# 的转换
- flutter - 如何设置基本 url 来抖动 http 包?
- android - 尽管代码相同,但 Android 应用程序的行为不同
- html - 如何在触发 flex-wrap 时正确对齐,但在其他情况下对齐内容空间?
- docker - 如何在 Windows 10 企业版中将域用户添加到组 (docker-users)?无法启动 Docker Windows 桌面