- setState是异步的,如果写多个 setState,只有最后一个有效
- useState 可以传入一个函数,初始化
- useState 调用必须规规矩矩的来
- 调用 hooks 必须是 react组件,不能是函数
- 必须在顶层调用
- 不能在 循环和条件块里
useState特性
- 第二个参数是更新函数,不会合并参数
- 每次渲染都会创建一个新的函数,每次渲染,都是独立的闭包
- useState 会返回一对值:当前状态和一个让你更新它的函数
- 更新函数类似 class 组件的 this.setState,但是它不会把新的 state 和旧的 state 进行合并
- 先解构老的值,然后新值覆盖老的值
- 先解构老的值,然后新值覆盖老的值
- useState 唯一的参数就是初始 state
- 更新函数类似 class 组件的 this.setState,但是它不会把新的 state 和旧的 state 进行合并
- initialState 参数只会在组件的初始渲染中起作用,后续渲染时会被忽略
- 如果,传入的 state和之前的 state一样,就不会渲染
- React 使用 Object.is 比较算法 来比较 state
- React 使用 Object.is 比较算法 来比较 state
getDerivedStateFromProps
修改 state的方法
class组件写法
class Counter extends Component {
state = {
visible: false
}
static getDerivedStateFromProps (props, state) {
if (props.count >= 10) {
return { visible: true }
}
}
}
hooks组件写法
function Counter(props) {
const [visible, setVisible] = useState(false)
if (props.count >= 10) {
setVisible(true)
}
}
tsx
import React, { useState } from 'react'
interface Props {}
function App: <React.FC>(props) {
const [count, setCount] = useState<number>(0)
}
useState原理
- useState返回一个 useReducer
- useReducer 返回 [workInProgressHook.memoizedState, dispatch]
tuple元祖类型:[S, Dispatch
- state状态
- 更新状态的函数,是一个事件驱动的异步更新过程
```typescript
function useState
():
function useState(initialState: S | (() => S)): [S, Dispatch
workInProgressHook.memoizedState