javascript - React - 如何解决属性未定义问题
问题描述
在我的反应应用程序中,我有一个表格文件和另一个用于我的弹出模式,它应该由每个表格行中的编辑按钮激活。
每当我加载我的应用程序时,该应用程序都会引发指向我的模态文件的错误
**TypeError: Cannot read property 'name' of undefined**
23 | <Label for="title">Name</Label>
24 | <Input
25 | id="name"
> 26 | value={props.editEmployeeData.name}
| ^ 27 | onChange={(e) => {
28 | let { editEmployeeData } = props; // destructuring assignment
29 | editEmployeeData.name = e.target.value;
我试图找到解决方法,但没有任何效果。
我的表格组件看起来像这样
const EmployeeTable = () => {
const [state, setState] = React.useState({
employeesDetail: [],
editEmployeeData: {
id: "",
name: "",
phone_no: "",
email: "",
department: "",
job_title: "",
salary: "",
date_employed: "",
},
editEmployeeModal: false,
});
const _refreshBooks = ()=>{
axios
.get("http://localhost:8000/api/accounts/employees_hr/")
.then((response) =>
setState({
employeesDetail: response.data.results,
})
);
}
useEffect(() => {
_refreshBooks();
}, []);
// modal appear/disappear func
const toggleEditEmployeeModal = () => {
setState({
editEmployeeModal: !state.editEmployeeModal,
});
};
// Populate Edit book func - 'Edit button'
const editEmployeeData = (id, name, phone_no, email, department, job_title, salary, date_employed) =>{
setState({
editEmployeeData: {id, name, phone_no, email, department, job_title, salary, date_employed},
editEmployeeModal: !state.editEmployeeModal
})
}
// Edit func - 'Update Book button'
const updateRecord=()=>{
let {
name,
phone_no,
email,
department,
job_title,
salary,
date_employed,
} = state.editEmployeeData;
axios
.put(
"http://localhost:8000/api/accounts/employees_hr/" +
state.editEmployeeData.id,
{
name,
phone_no,
email,
department,
job_title,
salary,
date_employed,
}
)
.then((response) =>
_refreshBooks()
);
// close modal after edit and set the 'editEmployeeData' fields to empty
setState({
editBookModal: false,
editEmployeeData: {
id: "",
name: "",
phone_no: "",
email: "",
department: "",
job_title: "",
salary: "",
date_employed: "",
} //clear
});
}
const classes = useStyles();
const columns = [
// "id",
{ name: "name", label: "Name" },
{ name: "phone_no", label: "Contact" },
{ name: "email", label: "Email" },
{ name: "department", label: "Department" },
{ name: "job_title", label: "Title" },
{ name: "salary", label: "Salary" },
{ name: "date_employed", label: "Date Employed" },
{
name: "Action",
options: {
filter: true,
sort: false,
empty: true,
customBodyRender: (value, tableMeta, updateValue) => {
const i = tableMeta.rowIndex;
const data = state.employeesDetail;
return (
// open modal
<Button
color="success"
size="sm"
onClick={() =>
editEmployeeData(
data[i].id,
data[i].name,
data[i].phone_no,
data[i].email,
data[i].department,
data[i].job_title,
data[i].salary,
data[i].date_employed,
)
}
>
Edit
</Button>
);
},
},
},
];
return (
<div className={classes.root}>
{/* EDIT BOOK MODAL */}
<EditEmployeeModal
editEmployeeModal={state.editEmployeeModal}
editEmployeeData={state.editEmployeeData}
updateRecord={updateRecord}
toggleEditEmployeeModal={toggleEditEmployeeModal}
/>
至于我的模态文件,设置看起来像这样
const EditEmployeeModal = (props) => {
return (
<div className="App container">
<Modal isOpen={props.editEmployeeModal}>
<ModalHeader toggle={props.toggleEditEmployeeModal}>
Update Employee Record
</ModalHeader>
<ModalBody>
<FormGroup>
<Label for="title">Name</Label>
<Input
id="name"
value={props.editEmployeeData.name}
onChange={(e) => {
let { editEmployeeData } = props; // destructuring assignment
editEmployeeData.name = e.target.value;
props.setState({ editEmployeeData });
}}
/>
</FormGroup>
根据上面的代码设置,我错过了什么或做错了什么?
解决方案
另一种选择是使用解构具有默认值。
另一个问题是您没有将setState
as 道具传递给 Modal
const EditEmployeeModal = (props) => {
const { editEmployeeData: { name = "" } = {} } = props;
return (
<div className="App container">
<Modal isOpen={props.editEmployeeModal}>
<ModalHeader toggle={props.toggleEditEmployeeModal}>
Update Employee Record
</ModalHeader>
<ModalBody>
<FormGroup>
<Label for="title">Name</Label>
<Input
id="name"
value={name}
onChange={(e) => {
let { editEmployeeData } = props; // destructuring assignment
editEmployeeData.name = e.target.value;
props.setState({ editEmployeeData });
}}
/>
</FormGroup>
</ModalBody>
</Modal>
</div>)
}
推荐阅读
- excel - 如何使用级别值自动嵌套 Excel 电子表格的行?
- typescript - 是否可以在 TypeScript 中解构类型定义?
- r - 如何在绘图前不过滤数据的情况下在 ggplot2 中绘制 plot_model x 轴项的子集?
- r - 在 reshape 后使用 pivot_wider() 将第一列分成两列
- python - 如何使用 api.add_resource 在不同的文件中路由?
- corestore - 获取对象时的 CoreStore Xcode 数据错误问题
- python - 通过 Librosa 中的 fft_frequencies() 函数获取频率
- spring-webflux - 如何使用 sprint webclient 解析 json 响应
- javascript - 如何使用 AJAX 方法将来自 Github Gist 的 JSON 数据存储到数组中?
- html - 在哪里可以找到视频 html 元素的参考,因为 MDN 缺少很多