使用`useCallback`来更新状态的函数吗?

huangapple go评论63阅读模式
英文:

Should I use useCallback for a function that updates state?

问题

我有一个在React组件中的函数handleFileSelect。它对输入文件进行一些处理,并根据处理结果更新一些状态,这将触发组件重新渲染。

但重新渲染会导致函数被重新创建。那么之前处理的信息会丢失吗?

  • 那么,我是否应该使用类似useCallback的东西来防止函数的重新创建?

  • 如果是这样的话,是不是我应该对大多数函数都这样做?

const handleFileSelect = async(event: ChangeEvent<HTMLInputElement>) => {

  if (event.target.files && event.target.files.length > 0) {

    setFormDisabled(true); // 更新状态
    const file = event.target.files[0];

    if (!imageWithinSizeLimit(file)) {
      sendToast('error', '文件大小超出允许范围!请选择小于0.5MB的文件')
      clearImageInput();
      setFormDisabled(false); // 更新状态
      return;
    }

    const valid = await validateImageType(file);

    if (valid) {
      const fileReader = new FileReader();
      fileReader.readAsDataURL(file)
      fileReader.onload = function(ev) {
        // @ts-ignore
        imagePreviewRef.current?.setAttribute("src", ev.target.result)
      }
      setImageValid(true);   // 更新状态
      setFormDisabled(false) // 更新状态
    } 
    else {
      clearImageInput();
      sendToast('error', "我们只接受PNG或JPEG格式的头像图片")
      setFormDisabled(false) // 更新状态
    }
  }
}
英文:

I have a function handleFileSelect inside a React Component. It does some processing on the input file, and based on that it updates some states, which would trigger a rerender of the component.

But rerenders cause the function to be re-created. So will all the previous processed info be lost?

  • So should I use something like useCallback to prevent re-creation of my function?

  • And if that is the case, should'nt I do this for most functions?

<!-- begin snippet: js hide: false console: true babel: false -->

<!-- language: lang-js -->

const handleFileSelect = async(event: ChangeEvent &lt; HTMLInputElement &gt; ) =&gt; {

  if (event.target.files &amp;&amp; event.target.files ? .length &gt; 0) {

    setFormDisabled(true); // state-update
    const file = event.target.files[0];

    if (!imageWithinSizeLimit(file)) {
      sendToast(&#39;error&#39;, &#39;File size beyond allowed range! Choose a file lesser than 0.5MB&#39;)
      clearImageInput();
      setFormDisabled(false); // state-update
      return;
    }

    const valid = await validateImageType(file);

    if (valid) {
      const fileReader = new FileReader();
      fileReader.readAsDataURL(file)
      fileReader.onload = function(ev) {
        // @ts-ignore
        imagePreviewRef.current ? .setAttribute(&quot;src&quot;, ev.target.result)
      }
      setImageValid(true);   // state-update
      setFormDisabled(false) // state-update
    } 
    else {
      clearImageInput();
      sendToast(&#39;error&#39;, &quot;We only accept PNG or JPEG files as Avatar images&quot;)
      setFormDisabled(false) // state-update
    }
  }
}

<!-- end snippet -->

答案1

得分: 1

简单回答: 不需要。

如果您不需要将您的函数作为依赖项进行跟踪,或者您不在另一个组件内创建组件,那么您就不需要使用 useCallback。

英文:

Simple answer: No.

If you don't need to track your function as dependency or you don't create component inside another component, then you don't need useCallback

huangapple
  • 本文由 发表于 2023年2月6日 22:00:12
  • 转载请务必保留本文链接:https://go.coder-hub.com/75362293.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定