更新日期: 2025 年 6 月 10 日

在學會 React 元件後,你可能會發現一個問題:當畫面重新渲染時,元件內的變數好像會「歸零」?

舉個例子,如果你寫了一個 let count = 0 ,但當使用者點按按鈕後畫面更新, count 還是從 0 開始。

那該怎麼辦呢?這就是 React 提供的第一個 Hook —— useState 派上用場的地方!

const list = document.createElement('ul');
for (let i = 0; i < items.length; i++) {
  const li = document.createElement('li');
  li.textContent = items[i];
  list.appendChild(li);
container.appendChild(list);
function LightSwitch() {
  const [isOn, setIsOn] = useState(false);        // 控制燈泡開關
  const [color, setColor] = useState('yellow');   // 控制燈泡顏色
  return (
      <p>狀態:{isOn ? '💡 開' : '🌑 關'},顏色:{color}</p>
      <button onClick={() => setIsOn(!isOn)}>切換開關</button>
      <button onClick={() => setColor('blue')}>變藍色</button>
    </div>
      <h2>點擊了 {count}</h2>
      <button onClick={() => setCount(count + 1)}>再點一下</button>
    </div>
      <p>💡 燈泡目前:{isOn ? ‘💡 開著’ : ‘🌑 關著’}</p>
      <button onClick={() => setIsOn(!isOn)}>
        {isOn ? ‘關燈’ : ‘開燈’}
      </button>
function LightBulb() {
  const [isOn, setIsOn] = useState(false);
  return (
      <p>💡 燈泡目前:{isOn ? '💡 開著' : '🌑 關著'}</p>
      <button onClick={() => setIsOn(!isOn)}>
        {isOn ? '關燈' : '開燈'}
      </button>
    </div>
setCount(count + 1);
setCount(count + 1); // 這兩行其實不會 +2,因為 count 值還沒更新

正確方式:

setCount(prev => prev + 1);
setCount(prev => prev + 1); // 這樣才會變成 +2

state 更新後不會立即反映在 console.log

setCount(5);
console.log(count); // ❌ 還是舊值

為畫面還沒更新完,想看到新值請用 useEffect 等待 render。