【问题标题】:how to use fresh state inside the useeffect, but execute cleanup on unmount only如何在 useEffect 中使用新状态,但仅在卸载时执行清理
【发布时间】:2021-04-26 15:03:33
【问题描述】:

AFAIK,在 React 函数组件中,必须使用 useEffect 来实现 componentWillUnmount 功能,如下所示:

useEffect(()=>{
  return console.log("component unmounting");
},[])

我正在制作一个表单页面,并希望在用户退出页面时提交进度。 所以我正在考虑在清理中提交。

但如果我不将formData 状态放入依赖数组中,那么在清理过程中该状态将过时。
如果我确实将formData 放入依赖数组中,那么每次formData 发生变化时都会运行清理。

如何保持状态新鲜,但只在“真正的卸载”中运行清理?

const [formData, setFormData] = useState({
  input1: 'input1 default',
  input2: 'input2 default',
}); // track the form data


useEffect(()=>{
  return () => {
    axios.post(myFormSubmitURL, formData);
  }
}, []); // this will submit the stale data

useEffect(()=>{
  return () => {
    axios.post(myFormSubmitURL, formData);
  }
}, [formData]); // this will submit the data every time it changes

【问题讨论】:

    标签: reactjs post use-effect use-state


    【解决方案1】:

    您可以使用 react ref 和附加效果来存储表单状态的缓存,以便在组件卸载时使用。

    const formDataRef = useRef();
    const [formData, setFormData] = useState({
      input1: 'input1 default',
      input2: 'input2 default',
    }); // track the form data
    
    
    useEffect(()=>{
      return () => {
        axios.post(myFormSubmitURL, formDataRef.current); // <-- access current value
      }
    }, []);
    
    useEffect(()=>{
      formDataRef.current = { ...formData }; // <-- cache form updated data
    }, [formData]);
    

    【讨论】:

    • 哇非常感谢!!直到得到这个答案,我才意识到我可以使用 HTMLElements 以外的参考。只要 stackoverflow 允许我这样做,我就会接受答案(它说要等待 5 分钟)
    • @HyunwoongKang React ref 基本上只是一个存储桶,您可以在其中存储一个值,该值将在组件重新渲染中持续存在并保持稳定。 useRef "useRef 返回一个可变 ref 对象,其 .current 属性已初始化为传递的参数 (initialValue)。返回的对象将在组件的整个生命周期内持续存在。"
    猜你喜欢
    • 2021-04-27
    • 2020-11-16
    • 2021-09-08
    • 2021-11-23
    • 2019-12-27
    • 1970-01-01
    • 2022-11-15
    • 2022-01-24
    • 2021-03-06
    相关资源
    最近更新 更多