React Hooks入门

React 在 16.8 的版本中添加了 React Hooks 。之前,我们如果想使用 state,则必须要创建类组件,现在利用 Hooks,函数组件也可以使用 state 了(当然,不仅仅是 state)

Why Hooks?

我们在写组件的时候,经常遇到一些复杂的组件由于是 stateful 无法拆分,这类问题很普标,包括像动画、表单处理、获取远程数据。

  • 大的组件不易拆分且难测试
  • 组件之间活生命周期之间逻辑重复
  • 模式复杂,像 render props 和 HOC

What Are Hooks?

现在 React apps 有很多复用逻辑的方法。但是对非展示逻辑的代码复用却比较困难。函数似乎是一种完美的代码复用方式。在函数之间提取公共逻辑很容易。但是,函数却不能存储 React state。Hook 解决了这个问题。Hooks 允许您通过执行单个函数调用来使用函数中的 React 功能(如 state)。React 提供了一些内置的 Hooks,这些钩子可以访问到 state,lifecycle,context。

由于 Hooks 是正规的 JS 函数,所以你可以组合 React 内置的钩子来生成你自己的钩子。

Show Code

看一下最简单的用法:

1
2
3
4
5
6
7
8
9
10
11
12
import React, { useState } from "react";

function Example() {
const [count, setCount] = useState(0);

return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>Click me</button>
</div>
);
}

利用内置的钩子,创建一个 Custom Hooks:

live demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// useWindowWidth.js

import React, { useState, useEffect } from "react";

export default function useWindowWidth() {
const [width, setWidth] = useState(window.innerWidth);
useEffect(() => {
const handleResize = () => setWidth(window.innerWidth);
window.addEventListener("resize", handleResize);
return () => {
window.removeEventListener("resize", handleResize);
};
});
return width;
}
1
2
3
4
5
6
7
8
9
10
11
12
// index.js

import React, { useState } from "react";
import ReactDOM from "react-dom";
import useWindowWidth from "./useWindowWidth";

function Width(props) {
const width = useWindowWidth();
return <div>{width}</div>;
}
const rootElement = document.getElementById("root");
ReactDOM.render(<Width />, rootElement);