javascript - 更新后如何重新渲染 Formik 值 - React Native?
问题描述
我有一个屏幕用于更新以前的数据“姓名、电子邮件、年龄等”。第一次我调用一个从服务器名称获取数据的函数getProfileData()
用户写入新数据后,我发送该“更新配置文件”的 POST 请求
这是成功的,但在那之后,我想用新数据重新渲染这个表单,所以我调用getProfileData()
函数来获取新数据,但是重新渲染输入值不起作用!它仍然是以前的数据
我也尝试过,componentDidUpdate()
但遗憾的是没有重新渲染:)
那么我该如何解决呢?
代码
getProfileData = async () => {
let USER_TOKEN =
'....';
let AuthStr = `Bearer ${USER_TOKEN}`;
let response = await API.get('/profile', {
headers: {Authorization: AuthStr},
});
let {
data: {data},
} = response;
let password = '';
let password_confirmation = '';
let {name, email, avatar, age, gender, country_id} = data;
let initialValues = [];
initialValues.push({
name,
password,
password_confirmation,
email,
avatar,
age,
gender,
country_id,
});
this.setState({initialValues: initialValues, loading: false}, () =>
reactotron.log(this.state.initialValues[0]),
);
};
updateProfile = async value => {
let USER_TOKEN =
'....';
let AuthStr = `Bearer ${USER_TOKEN}`;
const headers = {
'Content-Type': 'application/json',
Authorization: AuthStr,
};
let response = await API.post('/update_profile', value, {
headers: headers,
});
let {
data: {data},
} = response;
alert(data);
this.getProfileData(); // called
};
componentDidMount() {
this.getCountryList();
this.getProfileData();
}
componentDidUpdate(prevProps, prevState) {
if (prevState.initialValues !== this.state.initialValues) {
console.log('componentDidUpdate', this.state.initialValues);
this.setState({initialValues: this.state.initialValues});
}
}
用户界面
<Formik
validationSchema={formSchema}
initialValues={this.state.initialValues[0]}
onSubmit={(values, actions) => {
this.updateProfile(values);
reactotron.log(values), actions.resetForm();
}}>
{({
handleChange,
handleBlur,
touched,
errors,
handleSubmit,
values,
setFieldValue,
}) => (
<View>
<Item style={styles.item} floatingLabel>
<Label style={styles.formLabel}>name</Label>
<Input
style={styles.value}
rounded
onChangeText={handleChange('name')}
onBlur={handleBlur('name')}
value={values.name}
/>
</Item>
<Text style={styles.errorText}>
{touched.name && errors.name}
</Text>
</View>
)}
</Formik>
解决方案
您可以enablereinitialize
在 formik 上使用 prop。
<Formik
enableReinitialize
...
/>
默认情况下它是假的,但如果它是真的,如果你的 initialValues 改变会发生什么,它会重新渲染。所以你可以存储你initialValues
的状态。
例如
state = {
initialValues: { name: '', ...}
}
当您更新配置文件数据时,只需更新该状态。
setState({initialValues: newInitialValues })
https://jaredpalmer.com/formik/docs/api/formik#enablereinitialize-boolean
推荐阅读
- javascript - Jest 在错误时禁用大量 html 元素转储
- flutter - 如何在颤动中动态添加创建pdf中的项目?
- twilio - Twilio Worker Statistics 中的 startDate 和 endDate
- arrays - 大小大于 210 万时 C 数组初始化错误
- angular - 访问primeng表中childs表中的parents表变量
- typescript - 使用 Typescript 处理图像 - NextJS
- python - Django rest 框架:如何创建自定义的自动生成字符串字段?
- html - 用于移动设计的 css true 100vh
- javascript - 如何使用 React 测试库获取共享相同文本的按钮?
- python - 是否可以检查变量是否满足存储为字符串的逻辑表达式?