如何使用Formik正确重复使用组件?
我正在重复使用一个表格来注册一个新的地址并更新当前地址,当我将值发送到Formik的输入时,需要很长时间(Likt 5-6秒),我认为这是后端延迟,但是在第一秒钟检查状态,我单击<<<代码>编辑按钮要填写表格后端返回200M,因此我认为有一种更好的方法来管理此数据,
useEffect(() => {
(async () => {
if (route.params?.idAddress) {
setNewAddress(false);
navigation.setOptions({ title: "Actualizar Dirección" });
const response = await getExactAddressesApi(
auth,
route.params.idAddress
);
const data = response.data;
formik.setFieldValue("id", data.id);
formik.setFieldValue("title", data.attributes.title);
formik.setFieldValue("name_lastname", data.attributes.name_lastname);
formik.setFieldValue("address", data.attributes.address);
formik.setFieldValue("city", data.attributes.city);
formik.setFieldValue("district", data.attributes.district);
formik.setFieldValue("phone", data.attributes.phone);
formik.setFieldValue("reference", data.attributes.reference);
}
})();
}, [route.params]);
const formik = useFormik({
initialValues: initialValues(),
validationSchema: Yup.object(validationSchema()),
onSubmit: async (formData) => {
setLoading(true);
try {
if (newAddress) {
const response = await addAddressApi(auth, formData);
if (response.error) throw "Error al agregar Dirección";
} else {
await updateAddressApi(auth, formData);
}
navigation.goBack();
} catch (error) {
Toast.show(error, {
position: Toast.positions.CENTER,
});
}
setLoading(false);
},
});
return(
<TextInput
label="Título"
style={FormStyle.input}
theme={FormStyle.themeInput}
placeholder="Ej: Mi Trabajo"
onChangeText={(text) => formik.setFieldValue("title", text)}
value={formik.values.title}
error={formik.errors.title}
/>
<TextInput
label="¿Quién Recibe?"
style={FormStyle.input}
theme={FormStyle.themeInput}
placeholder="Nombre de quien recibe"
onChangeText={(text) => formik.setFieldValue("name_lastname", text)}
value={formik.values.name_lastname}
error={formik.errors.name_lastname}
/>
)
中使用它
function initialValues() {
return {
title: "",
name_lastname: "",
address: "",
city: "",
district: "",
phone: "",
reference: "",
};
}
我还创建了一个函数,该函数返回空值以在Formik vermik validatorsChema
function validationSchema() {
return {
title: Yup.string().required(true),
name_lastname: Yup.string().min(3, true).required(true),
address: Yup.string().min(5, true).required(true),
city: Yup.string().required(true),
district: Yup.string().required(true),
phone: Yup.string().min(7, true).required(true),
reference: Yup.string().required(true),
};
}
getExactActAddresseSapi
export async function getExactAddressesApi(auth, idAddress) {
try {
const url = `${API_URL}/addresses/${idAddress}`;
const params = {
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${auth.token}`,
},
};
const response = await fetch(url, params);
const result = await response.json();
return result;
} catch (error) {
console.log(error);
return null;
}
}
I am reusing a form to register a new address and update current addresses, when i send values to input by formik it takes a long time (likt 5-6 seconds) I thought it's backend delay but checking status at first second i click on edit button
to fill the form the backend returns 200m so i think there is a better way to manage this data
useEffect(() => {
(async () => {
if (route.params?.idAddress) {
setNewAddress(false);
navigation.setOptions({ title: "Actualizar Dirección" });
const response = await getExactAddressesApi(
auth,
route.params.idAddress
);
const data = response.data;
formik.setFieldValue("id", data.id);
formik.setFieldValue("title", data.attributes.title);
formik.setFieldValue("name_lastname", data.attributes.name_lastname);
formik.setFieldValue("address", data.attributes.address);
formik.setFieldValue("city", data.attributes.city);
formik.setFieldValue("district", data.attributes.district);
formik.setFieldValue("phone", data.attributes.phone);
formik.setFieldValue("reference", data.attributes.reference);
}
})();
}, [route.params]);
const formik = useFormik({
initialValues: initialValues(),
validationSchema: Yup.object(validationSchema()),
onSubmit: async (formData) => {
setLoading(true);
try {
if (newAddress) {
const response = await addAddressApi(auth, formData);
if (response.error) throw "Error al agregar Dirección";
} else {
await updateAddressApi(auth, formData);
}
navigation.goBack();
} catch (error) {
Toast.show(error, {
position: Toast.positions.CENTER,
});
}
setLoading(false);
},
});
return(
<TextInput
label="Título"
style={FormStyle.input}
theme={FormStyle.themeInput}
placeholder="Ej: Mi Trabajo"
onChangeText={(text) => formik.setFieldValue("title", text)}
value={formik.values.title}
error={formik.errors.title}
/>
<TextInput
label="¿Quién Recibe?"
style={FormStyle.input}
theme={FormStyle.themeInput}
placeholder="Nombre de quien recibe"
onChangeText={(text) => formik.setFieldValue("name_lastname", text)}
value={formik.values.name_lastname}
error={formik.errors.name_lastname}
/>
)
I also created an function that return empty values to use it inside formik
function initialValues() {
return {
title: "",
name_lastname: "",
address: "",
city: "",
district: "",
phone: "",
reference: "",
};
}
Validatorschema
function validationSchema() {
return {
title: Yup.string().required(true),
name_lastname: Yup.string().min(3, true).required(true),
address: Yup.string().min(5, true).required(true),
city: Yup.string().required(true),
district: Yup.string().required(true),
phone: Yup.string().min(7, true).required(true),
reference: Yup.string().required(true),
};
}
getExactAddressesApi
export async function getExactAddressesApi(auth, idAddress) {
try {
const url = `${API_URL}/addresses/${idAddress}`;
const params = {
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${auth.token}`,
},
};
const response = await fetch(url, params);
const result = await response.json();
return result;
} catch (error) {
console.log(error);
return null;
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论