useReducer

把「怎么改状态」从事件处理函数里抽出来,集中到一个纯函数。dispatch 只描述发生了什么,reducer 决定新状态。

useRef

ref 存不需要驱动界面的值:计时器 ID、上一次的值、DOM 节点。改 .current 不触发重渲染,所以别拿它当状态用。

useState

useState 给函数组件装上记忆:set 函数请求重渲染而不是改值,本次渲染里的状态是快照;对象与数组要返回新引用。