在突变期间显示加载按钮
Show loading button during mutation
我有一个组件可以创建使用自定义挂钩进行突变的公告 -
function CreateAnnouncement() {
const [text, setText] = useState('')
const [isCreating, setIsCreating] = useState(false)
const { mutate } = useCreateAnnouncement()
const handleSubmit = () => {
const body = { text }
mutate({ body }, {
onMutate: () => {
setIsCreating(true)
},
onSuccess: () => {
setIsCreating(false)
}
})
}
return (
<form onSubmit={handleSubmit}>
<LoadingButton
variant="contained"
loadingIndicator="Saving..."
loading={isCreating}
>
Create Announcement
</LoadingButton >
</form>
)
}
当突变开始时,我想在LoadingButton
中将loading
设置为true
。
但是,mutate
没有 onMutate
副作用。
那么,有没有办法知道突变何时开始使用 mutate
?
更新
接受的答案显示了解决问题的一种方法。
我发现了一个更简单的方法 -
在 LoadingButton
组件内使用 useMutation
挂钩中的 isLoading
-
const { mutate, isLoading } = useCreateAnnouncement()
<LoadingButton
loadingIndicator="Saving..."
loading={isLoading}
>
Create Announcement
</LoadingButton >
当执行作为 onMutate 选项传递的回调时切换加载标志应该是正确的,所以您做对了。您可以使用 onSettled
取消设置标志,以便在成功和错误时停止指示加载。
错误可能出在 LoadingButton 中吗?
您可以在 onSuccess
函数内部和 CreateAnnouncement
returns 之前的行中添加 console.log()
语句并记录 isCreating
?
更新
如果您想在组件中定义 onMutate
,您的自定义挂钩需要将这些选项转发给 useMutation
调用:
const createProjectError = 'SOME ERROR MESSAGE';
type Error = ErrorType<typeof createProjectError>;
export const useCreateProject = (
config?: MutationOptions<Project, Error, CreateProject>
) => {
// invoke some other hooks
return useMutation<Project, Error, CreateProject>(
async createModel => {
const response = await api.createProject(createModel);
if (!response.ok) {
throw new Error(createProjectError);
}
await queryClient.invalidateQueries(QueryKeys.GET_PROJECTS);
return response.body;
},
{
onError: () => {
// some side effect
},
onSuccess: () => {
// some side effect
},
...config,
}
);
};
我有一个组件可以创建使用自定义挂钩进行突变的公告 -
function CreateAnnouncement() {
const [text, setText] = useState('')
const [isCreating, setIsCreating] = useState(false)
const { mutate } = useCreateAnnouncement()
const handleSubmit = () => {
const body = { text }
mutate({ body }, {
onMutate: () => {
setIsCreating(true)
},
onSuccess: () => {
setIsCreating(false)
}
})
}
return (
<form onSubmit={handleSubmit}>
<LoadingButton
variant="contained"
loadingIndicator="Saving..."
loading={isCreating}
>
Create Announcement
</LoadingButton >
</form>
)
}
当突变开始时,我想在LoadingButton
中将loading
设置为true
。
但是,mutate
没有 onMutate
副作用。
那么,有没有办法知道突变何时开始使用 mutate
?
更新
接受的答案显示了解决问题的一种方法。
我发现了一个更简单的方法 -
在 LoadingButton
组件内使用 useMutation
挂钩中的 isLoading
-
const { mutate, isLoading } = useCreateAnnouncement()
<LoadingButton
loadingIndicator="Saving..."
loading={isLoading}
>
Create Announcement
</LoadingButton >
当执行作为 onMutate 选项传递的回调时切换加载标志应该是正确的,所以您做对了。您可以使用 onSettled
取消设置标志,以便在成功和错误时停止指示加载。
错误可能出在 LoadingButton 中吗?
您可以在 onSuccess
函数内部和 CreateAnnouncement
returns 之前的行中添加 console.log()
语句并记录 isCreating
?
更新
如果您想在组件中定义 onMutate
,您的自定义挂钩需要将这些选项转发给 useMutation
调用:
const createProjectError = 'SOME ERROR MESSAGE';
type Error = ErrorType<typeof createProjectError>;
export const useCreateProject = (
config?: MutationOptions<Project, Error, CreateProject>
) => {
// invoke some other hooks
return useMutation<Project, Error, CreateProject>(
async createModel => {
const response = await api.createProject(createModel);
if (!response.ok) {
throw new Error(createProjectError);
}
await queryClient.invalidateQueries(QueryKeys.GET_PROJECTS);
return response.body;
},
{
onError: () => {
// some side effect
},
onSuccess: () => {
// some side effect
},
...config,
}
);
};