You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让接收三个参数的useReducer官方文档示例正常运行

问题根因定位

你代码的核心问题是调用CounterFunction组件时未传入必填的initialCount属性,导致init函数接收到的入参为undefined,初始状态的count值异常,后续加减操作都会得到NaN。

useReducer init参数工作机制

useReducer(reducer, initialArg, init)三参数调用规则如下:

  • 第一个参数为reducer函数,负责处理所有状态更新逻辑
  • 第二个参数为初始入参,会作为参数传递给init函数
  • 第三个参数init为初始化函数,组件首次渲染时会自动执行,执行入参就是上述第二个参数,返回值就是useReducer的初始状态值
  • 这种写法的优势是可以复用初始化逻辑,比如你代码中重置操作也调用同一个init函数,避免重复编写状态初始化代码
修复方案

两种可行方案任选其一即可:

方案1:给组件props设置默认值

修改CounterFunction的参数定义,给initialCount设置默认值:

// 修改前
// function CounterFunction({ initialCount }) {
// 修改后
function CounterFunction({ initialCount = 0 }) {

方案2:调用组件时传入初始值

修改Counter组件中CounterFunction的调用代码,传入指定初始值:

export function Counter() {
  return (
    <>
      <CounterFunction initialCount={0} />
    </>
  );
}
修复后完整可运行代码
import { useReducer } from "react";

function init(initialCount) {
  return { count: initialCount };
}

function reducer(state, action) {
  switch (action.type) {
    case "increment":
      return { count: state.count + 1 };
    case "decrement":
      return { count: state.count - 1 };
    case "reset":
      return init(action.payload);
    default:
      throw new Error();
  }
}

function CounterFunction({ initialCount = 0 }) {
  const [state, dispatch] = useReducer(reducer, initialCount, init);
  return (
    <>
      Count: {state.count}
      <button
        onClick={() => dispatch({ type: "reset", payload: initialCount })}
      >
        Reset
      </button>
      <button onClick={() => dispatch({ type: "decrement" })}>-</button>
      <button onClick={() => dispatch({ type: "increment" })}>+</button>
    </>
  );
}

export function Counter() {
  return (
    <>
      <CounterFunction />
    </>
  );
}

内容的提问来源于stack exchange,提问作者MestreALMO

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 11:27:00