什么是Hooks
Hooks let you use state and other React features without writing a class.
类组件的不足
- 状态逻辑难以复用:缺少复用机制,渲染属性和高阶组件导致层级冗余
- 趋向复杂难以维护: 生命周期中混杂不相干的逻辑,相干逻辑分散在不同什么周期
- this指向困扰:内联函数过度创建新句柄,类成员函数不能保证this的指向
Hooks的优势
- 函数组件无this问题
- 自定义Hook方便复用状态逻辑
- 副作用的关注点分离
声明
按照约定,所有的hooks函数都应该以use开头
useState()
import React, { Component, useState } from 'react'
useState
- useState()返回一个变量,
如果一个组件有多个state,那么useState怎么知道哪一次调用返回哪一个state
按照第一次运行的次序返回
eslint-pulgin-react-hooks
- 安装
npm install eslint-pulgin-react-hooks -D
- 增加配置
"eslintConfig": {
"extends": "react-app",
"plugins": "react-hooks",
"rules": {
"react-hooks/rules-of-hooks": "error"
}
},
如果count的值是1,给setCount(1),组件会不会重新渲染???
副作用
- 绑定事件
- 网络请求
- 访问DOM
副作用的调用时机
- Mount之后 ComponentDidMount
- Update之后 ComponentDidUpdate
- Unmount之前 ComponentWillUnmount
在react hooks中都可以使用useEffect代替
- useEffect的第二个参数是一个数组,数组的每一项都不变的情况下,
- 不传数组意味着每次渲染后都执行
- 传入空数组,只会执行一次
useContext()
// 创建Context
const CountContext = createContext()
function Counter() {
const count = useContext(CountContext)
return (
<h1>{count}</h1>
)
}
useMemo
import React, { useMemo, useState } from 'react'
function Counter(props) {
return (
<h1>{props.count}</h1>
)
}
function App() {
const [count, setCount] = useState(0)
//调用时机
const double = useMemo(() => {
return count * 2
}, [count === 3])
const half = useMemo(() => {
return double / 2
}, [double])
return (
<div>
<button
type='button'
onClick={() => { setCount(count + 1) }}
>
Click:{count},
double:{double}
</button>
<Counter count={count} />
</div>
)
}
export default App