I've read dozens of pages on React State hooks including:
We dont know how React state hook work
Why calling react setState method doesn't mutate the state immediately?
I can't figure out how to, run SetState(xxxx) then use the new State data to determine the next set of data I need to load during the initial page data load.
After trying with multiple useEffects with it's own defined dependency array argument, in an attempt to force an immediate rerender so that the state data will be updated, it still doesn't work.
Fails because formDetails.roleIdSelected, and the whole formDetails state is still at initial state.
Sample Code:
function PersonForm(props){
const [departmentList, setDeparmentList] = useState([]);
const [departmentIdSelected, setDepartmentIdSelected] = useState(1);
const [roleList, setRoleList] = useState([]);
const {idPerson} = useParams();
const [roleIdSelected, setRoleIdSelected] = useState("");
const [formDetails, setFormDetails] = useState({ //initial values
firstName: "",
lastName :"",
departmentIdSelected: "",
roleIdSelected : "",
})
useEffect(()=>{ //Grab list of departments from API on DidMount
setDeparmentList(getAllDepartments());
},[])
useEffect(()=>{ //Grab the specific person data when the idPerson state is updated (DidUpdate)
getRunPerson(idPerson);
},[idPerson])
useEffect(()=>{ //Find the Role Entity by the roleID of the person, once a change in formDetails state is detected (DidUpdate)
if(idPerson !== "new"){
const roleEntity = getRole(formDetails.roleIdSelected);
setDepartmentIdSelected(roleEntity.DepartmentId); //FAIL because formDetails is actually stale
}
},[formDetails])
const getRunPerson = (id) =>{
const person = getPerson(id);
setFormDetails({
firstName:person.fname,
lastName : person.lname,
roleIdSelected : person.roleId,
});
setRoleIdSelected(person.roleId);
}
......
return(
<React.Fragment>
<div className="table table-dark">
<TextField placeHolder = "Type Here" label = "First Name" statekey={Object.keys(formDetails)[0]} onChangeText={handleValueChange} value ={formDetails.firstName} />
<TextField placeHolder = "Type Here" label = "Last Name" statekey={Object.keys(formDetails)[1]} onChangeText={handleValueChange} value = {formDetails.lastName}/>
{console.log("formDetails.departmentIdSelected: ", formDetails.departmentIdSelected)}
<SelectField label = "Department" statekey={Object.keys(formDetails)[2]} options={departmentList} onChange = {handleValueChange} value = {departmentIdSelected}/>
</div>
</React.Fragment>)
}