useState 让函数组件拥有内部数据:返回 [当前值, 修改函数]。调用修改函数会让组件重新渲染,新值反映到"> useState 让函数组件拥有内部数据:返回 [当前值, 修改函数]。调用修改函数会让组件重新渲染,新值反映到"> useState 让函数组件拥有内部数据:返回 [当前值, 修改函数]。调用修改函数会让组件重新渲染,新值反映到">
React 词条目录
前端Wiki/React/进阶/状态与事件

useState 状态基础

useState 让函数组件拥有内部数据:返回 [当前值, 修改函数]。调用修改函数会让组件重新渲染,新值反映到界面。这是“数据驱动视图”在 React 中的直接体现。

两条铁律:1)只在组件顶层调用 Hooks,不能放在 if/for 里(Hooks 依赖调用顺序);2)state 是“快照”——本次渲染中的 count 永远是渲染时的值,连续调用 setCount(count + 1) 只生效一次。

  • useState(初始值) 返回 [值, setter],setter 触发重新渲染
  • 只能在组件顶层调用,顺序被 React 用来对应 Hooks
  • state 是快照:同步连续 set 同一变量只生效一次
HTML
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>useState</title>
<script src="https://unpkg.com/react@18/umd/react.development.js" crossorigin></script>
<script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js" crossorigin></script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
</head>
<body>
<div id="root"></div>
<script type="text/babel">
const { useState } = React;

function Demo() {
  const [count, setCount] = useState(0);
  const [text, setText] = useState('hello');

  return (
    <div style={{ padding: 16 }}>
      <p>count = {count}</p>
      <button onClick={() => setCount(count + 1)}>正确 +1</button>
      {' '}
      {/* 反面教材:两次同步 set 用的是旧 count,最终只 +1 */}
      <button onClick={() => { setCount(count + 1); setCount(count + 1); }}>
        连点两次(只+1)
      </button>

      <hr />
      <p>text = {text}</p>
      <input value={text} onChange={e => setText(e.target.value)} />
      <button onClick={() => setText('')}>清空</button>
    </div>
  );
}

ReactDOM.createRoot(document.getElementById('root')).render(<Demo />);
</script>
</body>
</html>
本节要点useState 是函数组件的数据来源:setter 一调,组件重渲染;state 是快照,别按同步思维连写。