You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

提交后无需刷新页面,如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 00:45:43