所以,我对 React 很陌生,无法解决这个问题。我正在尝试使用父组件从数据库中获取的信息预先填充表单。子组件应该将数据显示为默认值,然后在用户编辑表单时更改状态。这就是我将数据作为道具传递的方式(编辑 2):
componentDidMount() {
const ticketID = this.props.match.params.ticketID;
axios.get(`http://127.0.0.1:8000/api/tickets/${ticketID}`).then(res => {
this.setState({ ticket: res.data }, () => console.log(this.state.ticket));
});
}
{this.state && this.state.ticket ? (
<TicketForm
requestType="put"
ticketID={this.props.match.params.ticketID}
btnText="Update"
ticket={this.state.ticket}
/>
) : (
<div />
)}
这工作正常。我能够获取数据并将其记录在 console.log 中,但我无法将其设置为默认状态。表单保持空白,当我尝试在其上键入内容时会抛出警告:“组件正在更改要控制的文本类型的不受控制的输入。输入元素不应从不受控制切换到受控制(反之亦然)”。<--- 已解决(编辑 2)
我遵循了本教程https://www.youtube.com/watch?v=IK9k9hSuYeA&t=373s。
子组件如下:
class TicketForm extends React.Component {
constructor(props) {
super(props);
this.state = {
name: props.ticket.name || "",
description: props.ticket.description || ""
};
handleChange = e => {
this.setState({
[e.target.name]: e.target.value
});
};
(...)
render() {
return (
<div className="form-container">
<div className="card mb-3">
<div className="card-header">
<h2>{this.state.btnText} Ticket</h2>
</div>
<div className="card-body">
<form
onSubmit={e =>
this.onSubmit(e, this.props.requestType, this.props.ticketID)
}
)}
我花了几个小时试图解决这个问题并在这里阅读了一堆帖子,但仍然无法解决这个问题。任何帮助将非常感激。
编辑 1:我终于弄明白了为什么在构造函数上未定义 props。当我将票证作为道具传递时,票证仍在从数据库中获取,因此构造函数接收到的值仍然未定义。
编辑 2:尝试在父子节点上使用三元运算符,以确保仅在完全设置状态后才传递道具。
四季花海
鸿蒙传说
撒科打诨
相关分类