代码之家  ›  专栏  ›  技术社区  ›  Enzo

React组件中的get-customhook事件

  •  0
  • Enzo  · 技术社区  · 2 年前

    我正在构建一个UI,该UI使用单击按钮时出现的窗体。

    当我提交表格并且突变结束时,我希望它关闭。

    然而,我不确定如何做到这一点,因为我的突变是在一个自定义挂钩中:

    export function useCreateContract({ queryKey }) {
      const queryClient = useQueryClient();
      const { enqueueSnackbar } = useSnackbar();
    
      const { isLoading, mutate } = useMutation({
        mutationFn: ({
          user_id,
          type,
        }) =>
          createContract(
            user_id,
            type,
          ),
        onSuccess: async () => {
          return queryClient
            .invalidateQueries({
              queryKey: queryKey,
            })
            .then(() => {
              enqueueSnackbar("Contract created");
            });
        },
      });
    
      const createContract = (
        user_id,
        type,
      ) => {
        return axios.post(`/api/contracts`, {
          user_id,
          type,
        });
      };
    
      return { mutate, isLoading };
    }
    

    我的表格:

    export function Form({ onCancel, onSuccess }) {
      const { id } = useParams();
    
      const { mutate, isLoading } = useCreateContract({
        queryKey: ["users", id, "contracts"],
      });
    }
    

    我希望我能打电话 onSuccess 当我的突变成功时。

    0 回复  |  直到 2 年前
        1
  •  0
  •   kapaakinos    2 年前

    不要试图从onSuccess/onError函数调用副作用-> https://tkdodo.eu/blog/breaking-react-querys-api-on-purpose

    我会这样处理的

    使用mutateAsync而不是mutate,并通过侦听finally()来等待代码完成。

     export function Form({ onCancel, onSuccess }) {
      const { id } = useParams();
    
      const { mutateAsync, isLoading } = useCreateContract({
        queryKey: ["users", id, "contracts"],
      });
    
      const handleSubmit = async (formValues) => {
        const req = await mutateAsync(formValues).finally(()=> onSuccess())
        
      }
    

    }

        2
  •  0
  •   Enzo    2 年前

    我使用解决了问题 mutateAsync 如kapaakinos所述

    这是我正在使用的代码:

    
    export function useCreateContract({ queryKey }) {
      const queryClient = useQueryClient();
      const { enqueueSnackbar } = useSnackbar();
    
      const { isLoading, mutate, mutateAsync } = useMutation({
        mutationFn: ({
          user_id,
          type,
        }) =>
          createContract(
            user_id,
            type,
          ),
        onSuccess: async () => {
          return queryClient
            .invalidateQueries({
              queryKey: queryKey,
            })
            .then(() => {
              enqueueSnackbar("Contract created");
            });
        },
      });
    
      const createContract = (
        user_id,
        type,
      ) => {
        return axios.post(`/api/contracts`, {
          user_id,
          type,
        });
      };
    
      return { mutate, mutateAsync, isLoading };
    }
    

    我在表格中这样使用:

      const { mutateAsync, isLoading } = useCreateContract({
        queryKey: ["users", id, "contracts"],
      });
    
    mutateAsync({
          user_id: parseInt(id),
          type: data.type,
        }).then(() => onSuccess());