useState
: State的HookuseEffect
: 副作用的HookcomponentDidMount
:componentDidUpdate
:componentWillUnmount
:useRef
: ref的HookReact组件可以分为类组件和函数式组件,两者最明显的不同就是在语法上,函数组件是一个纯函数,它接收一个props对象返回一个react元素。而类组件需要去继承React.Component并且创建render函数返回react元素,这将会要更多的代码,虽然它们实现的效果相同。
在较新的react版本看中添加了hooks,使得我们可以在函数组件中使用useState钩子去管理state,使用useEffect钩子去使用生命周期函数。从这个改版中我们可以看出作者更加看重函数组件,而且react团队曾提及到在react之后的版本将会对函数组件的性能方面进行提升。
Hook 是一些可以让你在函数组件里“钩入” React state 及生命周期等特性的函数。Hook 不能在 class 组件中使用 —— 这使得你不使用 class 也能使用 React。
React官网是这样描述Hooks的:Hook 是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性。Hook 将组件中相互关联的部分拆分成更小的函数(比如设置订阅或请求数据),而并非强制按照生命周期划分。你还可以使用 reducer 来管理组件的内部状态,使其更加可预测。
useState
: State的HookState Hook让函数组件也可以有state状态, 并进行状态数据的读写操作。
const [xxx, setXxx] = React.useState(initValue)
参数: 第一次初始化指定的值在内部作缓存;
返回值: 包含2个元素的数组, 第1个为内部当前状态值, 第2个为更新状态值的函数。
可以多次使用useState()
。
setXxx(newValue)
: 参数为非函数值, 直接指定新的状态值, 内部用其覆盖原来的状态值
setXxx(value => newValue)
: 参数为函数, 接收原本的状态值, 返回新的状态值, 内部用其覆盖原来的状态值
import React, { useState } from 'react'; function Example() { // 声明一个叫 “count” 的 state 变量。 const [count, setCount] = useState(0); // 加的回调 setXxx()第二种写法 function add() { setCount(count => count + 1); } return ( <div> <p>You clicked {count} times</p> <button onClick={() => setCount(count + 1)}> Click me to + 1 </button> <button onClick={() => setCount(add)}> Click me to add 1 </button> </div> ); } export default Example
useEffect
: 副作用的HookEffect Hook 可以让你在函数组件中执行副作用操作(用于模拟类组件中的生命周期钩子)。
我们之前可能已经在React组件中执行过数据获取、订阅或者手动修改过DOM。我们统一把这些操作称为“副作用”,或者简称为“作用”。它跟 class 组件中的 componentDidMount
、componentDidUpdate
和 componentWillUnmount
具有相同的用途,只不过被合并成了一个 API。
useEffect
放在组件内部让我们可以在 effect 中直接访问 count
state 变量(或其他 props)。useEffect(() => { // 在此可以执行任何带副作用操作 return () => { // 在组件卸载前执行 // 在此做一些收尾工作, 比如清除定时器/取消订阅等 } }, [stateValue]) // 如果指定的是[], 回调函数只会在第一次render()后执行
可以多次使用useEffect
。
componentDidMount
:useEffect(() => { // 在此可以执行任何带副作用操作,来初始化代码 }, [stateValue]) // 如果指定的是[], 回调函数只会在第一次render()后执行
componentDidUpdate
:useEffect(() => { // 在此可以执行任何带副作用操作 }, [stateValue]) // 如果指定的是[], 回调函数只会在第一次render()后执行,此时不能为空,数组内的值为所监控的state的值,如果不加此参数,默认为所有的state的值 // 例如如下代码 useEffect(() => { document.title = `You clicked ${count} times`; }, [count]); // 仅在 count 更改时更新
componentWillUnmount
:useEffect(() => { return () => { // 在组件卸载前执行 // 在此做一些收尾工作, 比如清除定时器/取消订阅等 } })
import React, { useState, useEffect } from 'react'; function Example() { const [count, setCount] = useState(0); useEffect(() => { document.title = `You clicked ${count} times`; }); return ( <div> <p>You clicked {count} times</p> <button onClick={() => setCount(count + 1)}> Click me </button> </div> ); }
useRef
: ref的HookRef Hook可以在函数组件中存储/查找组件内的标签或任意其它数据,跟React.createRef()
类似。
useRef
返回一个可变的 ref 对象,其 .current
属性被初始化为传入的参数(initialValue
)。返回的 ref 对象在组件的整个生命周期内保持不变。
const refContainer = useRef()
ref 对象的 .current
属性为相应的 DOM 节点。
function TextInputWithFocusButton() { const inputEl = useRef(null); const onButtonClick = () => { // `current` 指向已挂载到 DOM 上的文本输入元素 inputEl.current.focus(); }; return ( <> <input ref={inputEl} type="text" /> <button onClick={onButtonClick}>Focus the input</button> </> ); }