Hook
可以让你在不编写class的情况下使用state以及其他React特性
Hook的作用就是让你的函数组件中可以使用class中的一些生命周期和state等。
Hook规则
Hook就是JavaScript函数,但是使用它们会有两个额外的规则
- 只能在函数最外层调用Hook,不要在循环、条件判断或子函数中调用
- 只能在React的函数组件中调用Hook。(除了自定义Hook外)
useState方法
基本例子
- useState会返回一对值:
当前状态和一个让你更新它的函数。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17import React, { useState } from 'react';
function Example() {
// 声明一个叫 “count” 的 state 变量。
// 这个变量的初始值是0, 即useState里的初始值
// 更新这个变量的函数就是setCount
const [count, setCount] = useState(0);
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
useEffect
基本例子
1 | import React, { useState, useEffect } from 'react'; |
useEffect默认在第一次渲染后和每次更新之后都会执行。 React保证了每次渲染effect的同时DOM都已经更新完毕。- 与
componentDidMount和componentDidUpdate不同的是,使用useEffect调度的effect不会阻塞浏览器更新屏幕,这让你的应用看起来响应更快。
清除effect
当useEffect返回一个函数时,react将会在执行清除操作时调用它。
1 | ... |
仅在state更改是更新。
使Hook在count更改时更新
1 | useEffect(()=>{ |
仅在 props.friend.id 发生变化时,重新订阅
1 | useEffect(() => { |
useContext
1 | // ./mycontext; |
1 | // 在组件中使用 |
useReducer
1 | const [state, dispatch] = useReducer(reducer, initialState, init); |
基础例子
1 | function init(initialCount) { |
useRef
useRef 返回一个可变的 ref 对象,其 .current 属性被初始化为传入的参数(initialValue)。
返回的 ref 对象在组件的整个生命周期内保持不变。
useRef不仅可以取代原来的ref属性,还可以用于保存Hook属性的实例变量。
1 | // 用于普通ref |
自定义Hook
自定义Hook是一个函数,其名称以use开头,函数内部可以调用其他Hook。
- 两个组件中使用相同的Hook不会共享state,因为自定义 Hook 是一种重用状态逻辑的机制(例如设置为订阅并存储当前值),所以每次使用自定义 Hook 时,其中的所有
state和effect都是完全隔离的。
1 |
|