javascript - 重新渲染时反应自定义挂钩状态未更新
问题描述
使用反应挂钩重新填充表单以进行编辑时遇到问题。
父组件:Edit.js
const EditData = (props) => {
const { Id } = props.match.params;
const dispatch = useDispatch();
// calling redux action to get the data
useEffect(() => {
dispatch(getDataById(Id));
}, [Id]);
const data = useSelector((state) => state.data);
const initialState = {
Id: data.cardId || '',
Number: data.Number || '',
Date: data.Date,
};
//calling custom hook
const { handleChange, handleSubmit, values,errors } = useForm(
initialState,// passing initial state to custom hook
validateOnSubmit,
submit
);
// used to submit the data
function submit() {
dispatch(updateCard(values));
}
return (<DateForm
handleSubmit={handleSubmit}
handleChange={handleChange}
values={values}
/>);
};
自定义钩子:useform.js
const useForm = (initialState, validateOnSubmit, callback) => {
const [values, setValues] = useState(initialState);
const [errors, setErrors] = useState({});
const [isSubmitting, setIsSubmitting] = useState(false);
const handleChange = (event) => {
const { name, value } = event.target;
setValues({
...values,
[name]: value
});
};
const handleSubmit = (event) => {
event.preventDefault();
setErrors(validateOnSubmit(values));
setIsSubmitting(true);
};
useEffect(() => {
if (Object.keys(errors).length === 0 && isSubmitting) {
callback();
}
}, [errors]);
return {
handleChange,
handleSubmit,
values,
errors
};
};
当 API 调用完成时,react 会重新渲染自定义,但钩子的本地状态没有更新。
const useForm = (initialState, validateOnSubmit, callback) => {
console.log(initialState);
在第二次渲染时,我可以从 API 接收数据
const [values, setValues] = useState(initialState);
但是值没有得到更新,值仍然保持初始渲染的状态
我不知道为什么会这样。我刚开始使用反应钩子,请帮助我。
解决方案
正如OP在评论中所说:
当 API 调用完成时,initialState 变量会更新,我将 initialState 变量传递给 const [values, setValues] =
useState(initialState);
,所以它应该更新 values 变量吗?但事实并非如此!
它应该更新状态,初始状态被分配一次,直到组件卸载。
请参阅useState
API,它在延迟初始化中说明:
initialState
参数是初始渲染期间使用的状态。在随后的渲染中,它被忽略。
推荐阅读
- ios - XCTestCase with Auth0:如何解除安全警报“XXXX”想要使用“auth0.com”登录
- c# - 无法加载 DLL 'mclmcrrt9_4.dll'
- c# - C# Windows Forms App - 如何检测非窗体窗口关闭
- python-3.x - 是否有用于变量名称的 Python (3) lint,例如“len”(内置函数/保留字等)
- java - sim.start() 中的 RinSim 不一致 NullpointerException GraphSpatialRegistry
- php - 用PHP将HTML标签中的字符串中的第一个单词包装起来?
- css - 显示:flex 不工作
- c++ - C++ 项目需要用证书签署文件 (RSA-SHA256)
- qt - 为什么我的 Enaml ImageView 不能按比例缩小?
- json - 在 JSON 端点响应中返回 Doctrine 实体