Reactjs 重新渲染时从道具设置值后,React useState未更新

Reactjs 重新渲染时从道具设置值后,React useState未更新,reactjs,material-ui,react-hooks,use-state,Reactjs,Material Ui,React Hooks,Use State,我不太会反应和使用钩子 我想要实现的是,在单击submit按钮后,获取必要的预期值,然后通过将状态设置为new Object,将所有字段重置为空白 我能够获得必要的值,我希望将状态值设置为新的默认对象将重置文本字段的值,但似乎我失败了 有人能告诉我为什么会发生这种行为吗 顺便说一句:使用材质ui文本字段 安装程序可在以下位置获得: 以下是我的组件结构: <Register/> | | --> <StudentDetails/> |

我不太会反应和使用钩子

我想要实现的是,在单击submit按钮后,获取必要的预期值,然后通过将状态设置为new Object,将所有字段重置为空白

我能够获得必要的值,我希望将状态值设置为新的默认对象将重置文本字段的值,但似乎我失败了

有人能告诉我为什么会发生这种行为吗

顺便说一句:使用材质ui文本字段

安装程序可在以下位置获得:

以下是我的组件结构:

<Register/>
    |
    | --> <StudentDetails/>
    |       |
    |       |
    |       | --> <PersonDetails/>
    |       |
    | - - - x --> <GuardianDetails/>
            |       |
            |       | --> <PersonDetails/>
            |       | --> <PersonDetails/>
            |
            | --> <ButtonSubmit/>
寄存器组件

const[studentDetails,setStudentDetails]=useState(newstudent())
const[baseStudent,setBaseStudent]=useState(新的BaseStudnet())
const[guardian,setGuardian]=使用状态(新的guardian())
const handleSubmit=(学生:BaseStudent)=>{
挫折学生(学生)
setStudentDetails(Object.assign(studentDetails,baseStudent))
//--调用api
....
setBaseStudent(新BaseSudent())
setGuardian(新Guardian())
}
const handleGuardian=(监护人)=>{
监护人(监护人)
setStudentDetails(Object.assign(studentDetails,guardian)}
}
返回(
)
个人详细信息组件

const{person,onChange}=props
const[person,setPerson]=useState(person?person:new person())
const handleFirstName=(e)=>{
setPerson(Object.assign(person,{firstName:event.target.value}))
handleChange()
}
.................
常量handleChange=()=>{
if(onChange){
一次更换(人)
}
}
返回(
{handleFirstName(e)}
/>
........
)
学生部分

const{onSubmit,value}=props
const[student,setStudent]=usetState(值?值:new BaseStudent())
const getPerson=(person)=>{
setStudent(Object.assign(学生,{person:person})
}
常量handleChangeId=(e)=>{
setStudent(Object.assign(student,{id:e.event.target.value})
}
常量handleSubmit=()=>{
如果(未提交){
提交(学生详细信息)
}
}
返回(
{handleId(e)}
/>
提交
)
监护人组件

const{value,onChange}=props
const[guardian,setGuardian]=useState(值?值:new guardian());
const[mother,setMother]=useState(newpersonstate(newperson());
const[father,setFather]=useState(newpersonstate(newperson());
const handleMother=(personMother){
setMother(人名)
setGuardian(Object.assign(监护人{母亲:母亲})
handleChange({母亲:母亲})
}
....
const hanldeChange=(父项)=>{
setGuardian(Object.assign(guardian,parent))
if(onChange){
onChange(监护人)
}
}
返回(
)

在无法运行代码的情况下查看代码有点困难,但是第一眼看到可能会导致问题的东西:在Register组件的
handleSubmit
中,您正在调用
setBaseStudent
,然后在下一行中使用
baseStudent
。别忘了不会执行setBaseStudent同步地,因此下一行将使用旧值
baseStudent
。在
handleGuardian
@Grabofus中相同,我添加了存储库,您可以查看它您似乎在
PersonDetails
中有一个重复的
person
声明。您从道具中获取它,并将其设置为
useState
。Just查看了repo,我发现的第一个问题是您的
GuardianPanel
组件将guardian对象作为道具接收,调用api时也会重置该道具。但是
GuardianPanel
组件创建了自己的状态来存储guardian数据,情况应该不是这样。两者都是
guardian
/
setGuardian
应该作为来自父组件的道具进行传递。我想这同样适用于个人详细信息。
Person {
    firstName
    lastName
    middleName
    .....
}
Guardian {
    father : Person
    mother: Person
}

BaseStudent {
    id: number
    person: Person
}

Student: BaseStudent {
    guardian: Guardian
}