发布于 2026-01-06 0 阅读
0

如何编写 ReactJs 自定义钩子

如何编写 ReactJs 自定义钩子

自从我们在项目代码库中引入 Hooks 以来,已经过去了相当长一段时间。Hooks 的出现使得代码更易于重用、更简洁、更易读,编写起来也更令人满意。它们无疑代表了 ReactJs 开发的未来。
除了库本身提供的基础 Hooks 之外,你还可以编写自己的 Hook!(无论是小型 Hook 还是大型 Hook :D)。这类 Hook 被称为自定义 Hook。React 官方文档中是这样定义的:自定义 Hook 是一个 JavaScript 函数,其名称以“` use”开头,并且可以调用其他 Hook。在本篇简短的教程中,我将展示如何实现这一点!(……以及如何使用 TypeScript)

状态钩子(反自定义钩子)

本示例将展示如何实现一个简单的自定义计数器钩子。它内部使用了 React 的 useState 函数,并将状态信息以及其他几个函数打包到一个对象中返回。返回的对象使用了简写属性名语法。

const useCount = () => {  
  const [count, setCount] = useState<number>(0);  

  const increment = () => setCount(count + 1);  
  const decrement = () => setCount(count - 1);  
  const increaseBy = (increaser: number) => setCount(count + increaser);  
  const decreaseBy = (decreaser: number) => setCount(count + decreaser);  

  return { count, increment, decrement, increaseBy, decreaseBy };  
};
Enter fullscreen mode Exit fullscreen mode

现在,这个钩子可以在函数组件内的任何位置使用。
使用示例:

   const { count, increment, decrement, increaseBy, decreaseBy } = useCount();
   <div>
        <div>{count}</div>  
        <button onClick={increment}>increment</button>  
        <button onClick={decrement}>decrement</button>  
        <button onClick={() => increaseBy(20)}>increase by 20</button>  
        <button onClick={() => decreaseBy(20)}>decrease by 20</button>
  </div>
Enter fullscreen mode Exit fullscreen mode

useEffect 钩子(自定义获取钩子)

这个例子展示了如何在自定义钩子中使用 useEffect。也许你想用类似的方法来改进你的数据获取操作?
或者,如果你添加了大量的事件处理程序,也可以为此编写一个自定义钩子!

const useFetch = (requestUrl: string) => {  
  // set your fetch data and error types instead of any  
  const [data, setData] = useState<any>(null);  
  const [error, setError] = useState<any>(null);  
  const [isLoading, setIsLoading] = useState<boolean>(true);  

  React.useEffect(() => {  
      const fetchData = async () => {  
      setIsLoading(true);  
      try {  
          const response = await fetch(`${requestUrl}`);  
          const json = await response.json();  
          setData(json);  
      } catch (err) {  
          setError(err);  
      }  
      setIsLoading(false);  
    }; 
  }, [requestUrl]);  

  return { data, error, isLoading };  
};
Enter fullscreen mode Exit fullscreen mode

UseEffect 的自定义钩子非常实用。不妨看看Bruno Lemos最初开发的useWhyDidYouUpdate钩子。

结论

从这些简洁明了的示例中可以看出,这些钩子非常实用。它们最大的优点在于极高的复用性,即使在不同的项目中也能轻松使用。
如果你创建了一个优秀的钩子,你肯定可以在任何其他项目中使用它!是不是很棒?此外,任何你想要、需要或想到的钩子都可以创建。如果你发现代码中存在重复的模式,例如使用状态或响应特定事件,不妨尝试将其放入自定义钩子中。

以下是一些其他人制作的优秀 hooks 的参考资料:
https://usehooks.com/
https://github.com/rehooks/awesome-react-hooks

你有哪些定制的鱼钩?目前为止你觉得它们怎么样?
如果你还有什么想补充的,请在评论区告诉我 :)

文章来源:https://dev.to/bornfightcompany/how-to-reactjs-custom-hooks-1617