【发布时间】:2021-09-10 06:03:31
【问题描述】:
我正在尝试在 react 项目中使用 formik、typescript 和 recoil 制作一个多请求、多步骤的表单。我创建了一个自定义钩子,它返回三个函数,其中一个函数需要一个特定的 UUID 用于它正在使用的模型,以便它可以发出 PUT 请求。当我使用另一个相同的钩子函数发出 POST 请求时,这个 UUID 被设置为一个 Recoil Atom,然后我尝试在它下面的函数中访问它,但它没有正确显示。我试图等待它并将其分配给一个变量,但无济于事,当我在函数外部记录它时,状态返回我需要的值,但是当我将它记录在函数内部(我需要它的地方)时,它是空的。我正在尝试避免使用本地存储,因为这意味着要管理另一种类型的数据,这可能会破坏我的程序的其余部分。
这是钩子:
const useInstitution = () => {
const setCurrentId = useSetRecoilState(institutionId);
const currentId = useRecoilValue(institutionId);
console.log(currentId);
// The above line properly logs the UUID I want
const handleValues = useCallback((values: InstitutionFormType) => {
return {
...values,
institution_registered_number: values.institution_registered_number.replace(/\D+/g, ''),
institution_id: currentId || values.institution_id,
};
}, [currentId]);
const insertInstitution = useCallback(async (values, callback) => {
const newValues = handleValues(values);
const {
institution_logo_file,
} = newValues;
const response = await createInstitution(newValues);
setCurrentId(response?.data.institution_id);
}, [handleValues, setCurrentId]);
const institutionEdit = useCallback(async (values, callback) => {
const newValues = handleValues(values);
console.log(currentId);
// This line logs an empty value
}, [currentId, handleValues]);
return {
insertInstitution, institutionEdit, currentId,
};
};
export default useInstitution;
这是原子:
export const institutionId = atom({
key: 'institutionId',
default: '',
});
在这个钩子中,当 createInstitution 请求被调用并成功时,id 被设置为 Recoil Atom institutionId,我尝试将它记录在两个不同的行,一个在函数之外,一个在函数institutionEdit内,例如:
第一行是来自console.log的日志,在函数之外和钩子内部。第二行是机构编辑函数中的console.log。
为什么会这样?如何在钩子函数中正确访问它?
【问题讨论】: