提交后无需刷新页面,如何从Redux获取最新值?
问题分析与解决方案
你的核心问题是提交后Redux中details.name未即时更新,且本地维护的nameValue状态导致表单与Redux状态脱节,必须刷新才能同步。以下是针对性的解决步骤:
1. 移除本地nameValue状态
不需要额外用useState管理输入值,Formik本身已内置表单状态管理能力,本地状态会造成多源状态不一致。直接使用Formik提供的values.name作为输入框值即可。
2. 确保Redux Action正确更新Store
你的setTargetGoalName Action必须在API调用成功后,将最新名称同步到Redux Store中。示例如下(假设使用Redux Thunk):
export const setTargetGoalName = (data) => async (dispatch) => { try { // 调用更新名称的API const response = await axios.put(`/api/policies/${data.policyId}/name`, { name: data.name }); // 更新Redux Store中的details.name dispatch({ type: 'UPDATE_DETAILS_NAME', payload: response.data.name }); } catch (error) { console.error('名称更新失败:', error); } };
只有Store中的details.name被正确更新,组件才能无需刷新获取最新值。
3. 调整Formik与输入组件代码
将依赖本地状态的逻辑替换为Formik内置方法,修改后代码如下:
// 移除本地状态 // const [nameValue, setNameValue] = useState(details.name); <Formik validationSchema={ValidationSchema} initialValues={{ name: details.name, // 初始值仍从Redux获取 }} validateOnChange validateOnBlur onSubmit={values => { if (values.name) { setTargetGoalName({ policyId: policyDetails?.policyId, name: values.name, }); } }} > {({ errors, touched, values, handleChange, handleBlur, handleSubmit, setFieldTouched }) => ( <form onSubmit={handleSubmit}> <InputText id="name" type="text" name="name" placeholder="Enter your name" value={values.name} // 使用Formik的内置状态值 error={touched.name && errors.name ? errors.name : false} onBlur={handleBlur} onChange={(e) => { handleChange(e); // 仅使用Formik的handleChange处理输入 setFieldTouched("name", false); }} /> </form> )} </Formik> // 此处会自动同步Redux更新后的最新值 <p>{details.name}</p>
4. 确认组件能感知Redux状态变化
确保组件通过useSelector正确获取Redux状态:
import { useSelector } from 'react-redux'; // 根据你的Reducer结构调整路径 const details = useSelector(state => state.yourReducer.details);
当Store中details.name更新时,组件会自动重新渲染,显示最新值。
内容的提问来源于stack exchange,提问作者Alyssa Reyes
相关产品推荐
相关产品推荐

