我试图在组件卸载时使用useEffect清理状态,但在我try 设置状态时它会干扰我.我的代码基于在客户端中单击并将此客户端ID设置为发送API请求:


const setClient = () => {
    setClientIdForRegister(id)
    setClientNameForRegister(nome)
  }

return (
    <ClientSearchResultInfos onClick={setClient}>
      <div className="client_and_email">
        <h2>{nome}</h2>
        <span>{email}</span>
      </div>
      <CaretRight size={30} />
    </ClientSearchResultInfos>
)

请求:

const handleRegisterReceipt = async (data: FormDataProps) => {
    try {
      const dataToSend = {
        cliente: {
          id: clientIdForRegister,
        },
        dataPagamento: data.dataPagamento,
        valor: data.valor,
      }

      const response = await api.post('/pagamentos', dataToSend)
}

当用户在客户端中单击时,应该使用客户端的名称设置表单输入值:

useEffect(() => {
    const getClientName = async () => {
      if (clientNameForRegister) {
        setValue('cliente', clientNameForRegister)
      }
    }

    getClientName()
  }, [setValue, clientNameForRegister])

我在父组件useEffect中使用了返回,因此当我离开页面并返回时,id和名称再次为空

// parent component: 

const cleanUp = () => {
    setClientNameForRegister(null)
    setClientIdForRegister(null)
  }

  useEffect(() => {
    return cleanUp
  })

但这会导致发送的clientIdForRegister始终为空,因为组件总是重新呈现并运行清理.

我也试过这样做:

// parent component:

const isMountedRef = useRef<boolean>(true)

  useEffect(() => {
    return () => {
      isMountedRef.current = false

      if (isMountedRef.current) {
        setClientNameForRegister(null)
        setClientIdForRegister(null)
      }
    }
  })

这种方式不会将clientIdForRegister设置为null,但在卸载组件时不会清除名称和ID.

有没有一种方法可以在用户每次离开页面时清除状态,同时仍然发送clientIdForRegister?

推荐答案

您try 的第一个方法是最佳实践,您只是错过了结尾处的",[]",这导致在每次重新渲染时都返回.

这种方式返回只在组件卸载时执行,因此像这样将工作:

const cleanUp = () => {
    setClientNameForRegister(null)
    setClientIdForRegister(null)   
    }

  useEffect(() => {
    return cleanUp()   
    }, [])

Typescript相关问答推荐

Angular 17 Select 错误core.mjs:6531错误错误:NG 05105:发现意外合成监听器@transformPanel.done

TypeScript将键传递给新对象错误

替代语法/逻辑以避免TS变量被分配之前使用." "

如何判断输入是否是TypeScript中的品牌类型?

无法将select选项的值设置为ngFor循环中的第一个元素

如何访问Content UI的DatePicker/中的sx props of year picker?'<>

从typescript中的对象数组中获取对象的值作为类型'

使某些(嵌套)属性成为可选属性

访问继承接口的属性时在html中出错.角形

如何使用模板继承从子组件填充基础组件的画布

是否可以判断某个类型是否已合并为内部类型?

刷新页面时,TypeScrip Redux丢失状态

创建Angular 为17的动态形状时出错

如何创建由空格连接的多个字符串的类型

为什么上下文类型在`fn|curred(Fn)`的联合中不起作用?

创建一个TypeScrip对象并基于来自输入对象的约束定义其类型

抽象类对派生类强制不同的构造函数签名

如何静态键入返回数组1到n的函数

TypeScript中的这些条件类型映射方法之间有什么区别?

为什么TS条件返回要求不明确的强制转换而不是精确的强制转换?