Hooks 是 React 16.8 的新增特性,可以让你在不编写类、不使用 state 的情况下使用 Class 的状态管理、生命周期等功能。

Hook 使用规则

Hook 就是 JavaScript 函数,但是使用它们会有两个额外的规则:

  • 只能在 React 的函数组件中调用 Hook。
    • 不要在循环、条件判断或者子函数中调用。
    • 不要在其他 JavaScript 函数中调用。
  • Hook 不能在 class 组件中使用

Hooks 官网文档

在 Hooks 获取数据

相当于 componentDidMount 获取数据一次,传空数组

  1. ...
  2. function App() {
  3. const [data, setData] = useState({ hits: [] });
  4. const [query, setQuery] = useState('redux');
  5. useEffect(() => {
  6. const fetchData = async () => {
  7. const result = await axios(
  8. `http://hn.algolia.com/api/v1/search?query=${query}`,
  9. );
  10. setData(result.data);
  11. };
  12. fetchData();
  13. }, []);
  14. return (
  15. ...
  16. );
  17. }
  18. export default App;

自定义Hook

useDataApi

  1. import React, { Fragment, useState, useEffect } from 'react';
  2. import axios from 'axios';
  3. const useDataApi = (initialUrl, initialData) => {
  4. const [data, setData] = useState(initialData);
  5. const [url, setUrl] = useState(initialUrl);
  6. const [isLoading, setIsLoading] = useState(false);
  7. const [isError, setIsError] = useState(false);
  8. useEffect(() => {
  9. const fetchData = async () => {
  10. setIsError(false);
  11. setIsLoading(true);
  12. try {
  13. const result = await axios(url);
  14. setData(result.data);
  15. } catch (error) {
  16. setIsError(true);
  17. }
  18. setIsLoading(false);
  19. };
  20. fetchData();
  21. }, [url]);
  22. return [{ data, isLoading, isError }, setUrl];
  23. };
  24. function App() {
  25. const [query, setQuery] = useState('redux');
  26. const [{ data, isLoading, isError }, doFetch] = useDataApi(
  27. 'https://hn.algolia.com/api/v1/search?query=redux',
  28. { hits: [] },
  29. );
  30. return null
  31. }
  32. export default App;

FAQ

我应该使用 Hook,class,还是两者混用?

  • 不推荐用 Hook 重写你已有的 class,除非打算重写它们。
  • 可以混合使用 class 组件和使用了 Hook 的函数组件。
  • Hook 应该成为编写 React 组件的主要方式,毕竟是趋势。

避免不必要的重新渲染

  • useCallback
  • useMemo
  • React.memo()

https://jancat.github.io/post/2019/translation-usememo-and-usecallback/

参考

官方 Hooks 文档

[译] 如何使用 React hooks 获取 api 接口数据

https://stackblitz.com/edit/react-xnrgaz

https://taro-docs.jd.com/taro/docs/hooks.html#usestate

React Hooks完全上手指南 衍良 蚂蚁金服