如何在 AJAX 请求后使用反应上下文 api 值更新 Formik 初始值?

Fre*_*tal 7 javascript reactjs formik react-context

不过,我面临的问题是,我想在整个组件树状结构中模仿 React 中 FlaskLogin current_user 的行为。对于不熟悉 FlaskLogin 的任何人,current_user只需存储当前登录用户的会话。

为此,我决定使用 React 上下文 api。我所做的是在顶级组件中,我将一个 UserProvider 包裹在应用程序周围,如下所示:

<UserProvider value={this.state.user}>
    // Main Component.
</UserProvider>
Run Code Online (Sandbox Code Playgroud)

状态在构造函数中定义:

constructor() {
    super();
    this.state = {
      user: {
        id: -1,
        username: ‘test username’,
        email: 'test email’,
      },
    };
  }
Run Code Online (Sandbox Code Playgroud)

然后我在 componentDidMount 中调用一个 Ajax 请求来获取 current_user。

componentDidMount() {
    const state = this;
    post('/get_current_user').then(function success(data) {
      state.setState({
        user: {
          id: data.data.id,
          username: data.data.username,
          email: data.data.email,
        },
      });
    }).catch(function exception() {
      throw new Error('Failed to grab current user.');
    });
  }
Run Code Online (Sandbox Code Playgroud)

我可以在整个应用程序中获取这个更新的上下文。这对于“ProfilePicture”组件来说非常有用,因为它获取了正确的状态,但它不适用于使用 Formik 设置初始值。在 Formik 中,我正在创建更新用户名和电子邮件表单。问题是 Formik 在通过 AJAX 请求更新上下文 api 之前获取上下文 api 值。所以“测试用户名”将显示在用户名字段中,“测试电子邮件”将显示在电子邮件字段中。我的Formik表格如下:

const UserSettingsProfileForm = () => {
  return (
    <UserConsumer>
      {context => (
        <Formik
          initialValues={{ email: context.email, username: context.username }}
          validationSchema={userSettingsFormSchema}
          onSubmit={userSettingsOnSubmit}
          render={userSettingsForm}
        >
        </Formik>
      )}
    </UserConsumer>
  );
};
Run Code Online (Sandbox Code Playgroud)

有没有人对如何解决这个问题有任何建议,以便显示正确的上下文 api 值?

Jit*_*n B 11

你应该设置enableReinitialize道具。

<Formik
  initialValues={{ email: context.email, username: context.username }}
  enableReinitialize
Run Code Online (Sandbox Code Playgroud)