javascript - 如果我有来自 React Hooks 中的父组件的道具,如何更新状态
问题描述
如果我有来自父组件的道具,我正在尝试获取更新的文本框值。
这是我的代码 -
const initialState = {
name: "",
age: 0
}
const UserAdd = (props:any) => {
const {selectedUser} = props;
const [state, setState] = useState<any>(initialState);
const dispatch = useDispatch();
const onChangeValue = (event:any) => {
const { name, value } = event.target;
setState((prevState:any) => (
{ ...prevState, [name]: value }
));
}
const onSubmit = (e:any) => {
e.preventDefault();
const { name } = e.target;
dispatch(addUser(state.name, state.age))
setState({ ...initialState });
}
const onUpdate = (e:any) => {
e.preventDefault();
const { name } = e.target;
console.log(state.name , state.age , "name-age")
}
return (
<div className="add-user">
<hr />
<h2>Add User</h2>
<hr />
{ selectedUser ?
(<form className="form-inline">
<input type="text" className="form-control mb-2 mr-sm-5 col-md-4" id="email2" placeholder="Enter user name" name="name" value={selectedUser.name} onChange={onChangeValue} />
<input type="text" className="form-control mb-2 mr-sm-5 col-md-4" id="pwd2" placeholder="Enter user age" name="age" onChange={onChangeValue} value={selectedUser.age} />
<button type="submit" onClick={onUpdate} className="btn btn-primary col-md-2 mb-2">Update</button>
</form>)
:
(
<form className="form-inline">
<input type="text" className="form-control mb-2 mr-sm-5 col-md-4" id="email2" placeholder="Enter user name" name="name" value={state.name} onChange={onChangeValue} />
<input type="text" className="form-control mb-2 mr-sm-5 col-md-4" id="pwd2" placeholder="Enter user age" name="age" onChange={onChangeValue} value={state.age} />
<button type="submit" onClick={onSubmit} className="btn btn-primary col-md-2 mb-2">Submit</button>
</form>
)
}
</div>
)
}
export default UserAdd;
当没有道具,即(没有 selectedUser)时,状态更改工作正常,我也可以调度动作。但是当 Props(selectedUser) 可用时,我无法编辑文本框字段并且无法获取更新状态。请有人帮助我。
解决方案
更深入地研究您的代码..当selectedUser
不是虚假的时候有不同的形式......当有选定的用户时:
value={selectedUser.name}
应该像其他表单的输入一样:
value={state.name}
你还需要添加 useEffect 来改变 prop 改变时的状态,你可以这样做:
useEffect(()=>{
setState((prevState:any) => (
{ ...prevState, name: selectedUser.name}
));
},[selectedUser.name])
useEffect
每当依赖项列表中的任何项目与上次渲染不同时(在这种情况下,每次更改 selectedUser.name 时)都会执行then
推荐阅读
- java - 流程图中的扫描仪| 爪哇
- angular - 将搜索过滤器添加到 Angular-6-datatable
- mysql - 如何仅从没有架构的选定表中转储数据
- ios - 为什么 tableview 数据源不会从 Realm Collection 观察者改变?
- javascript - Chrome JS 错误:混合内容:对于机器人
- apache-spark - Spark-提交 CoarseGrainedExecutorBackend 错误
- javascript - 如何使用 DataTables 和 Excel 解决 parseXML 问题?
- javascript - Karma - Jasmine 断开连接超时
- javascript - 当鼠标离开调用元素并停留在目标元素上时保持目标元素打开
- kubernetes - k8s - 删除集群时持久存储会发生什么/?