我面临的问题是,我想在整个树状组件中模仿FlaskLogin current_user在React中的行为。对于不熟悉FlaskLogin的任何人,current_user
只会存储当前登录用户的会话。
为此,我决定使用React上下文api。我要做的是在顶级组件上,将UserProvider包裹在应用程序周围,这样:
<UserProvider value={this.state.user}>
// Main Component.
</UserProvider>
状态在构造函数中定义:
constructor() {
super();
this.state = {
user: {
id: -1,
username: ‘test username’,
email: 'test email’,
},
};
}
然后我在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.');
});
}
我可以在整个应用程序中获取此更新的上下文。这对于“ 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>
);
};
有人对如何解决此问题有任何建议,以便显示正确的上下文api值吗?
答案 0 :(得分:4)
您应该设置 enableReinitialize
属性。
<Formik
initialValues={{ email: context.email, username: context.username }}
enableReinitialize
答案 1 :(得分:0)
根据来自 github issue
的官方 Formik
,您应该添加 enableReinitialize
道具:https://github.com/formium/formik/issues/811#issuecomment-410813925