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

Redux预加载状态遇未知键studentYears错误,求添加模拟JSON到组件的方法

解决Redux预加载状态"Unexpected key"错误并添加模拟JSON到组件的方法

这个错误的原因很明确——你在initialState里定义了studentYears这个状态项,但你的rootReducer并没有对应的reducer来管理它。Redux的combineReducers只会识别你传入的那些reducer键,所以它找不到studentYears对应的处理逻辑,就抛出了这个错误。下面是完整的解决步骤:

1. 创建专门处理studentYears的Reducer

首先新建一个studentYearsReducer.js文件,用来管理这个状态:

// studentYearsReducer.js
// 这里可以直接把你的模拟JSON作为初始状态
const initialStudentYearsState = [
  { id: 1, title: "Year 1", options: ["Firm 1", "Firm 2", "Firm 3"] },
  { id: 2, title: "Year 2", options: ["Firm 2", "Firm 3", "Firm 4"] },
  { id: 4, title: "Year 3", options: ["Firm 5", "Firm 6", "Firm 7"] }
];

// 暂时不需要处理任何action,先返回默认状态即可
export default function studentYearsReducer(state = initialStudentYearsState, action) {
  return state;
}

2. 将新Reducer添加到Root Reducer中

修改你的rootReducer代码,把刚才创建的studentYearsReducer导入并添加到combineReducers的参数里,确保键名和initialState里的studentYears一致:

// combineReducer
import { combineReducers } from "redux";
import { events, eventsHasErrored, eventsIsLoading, calendarView } from "./events";
import navigationReducer from "./navigationReducer";
import studentYearsReducer from "./studentYearsReducer"; // 导入新的reducer

const rootReducer = combineReducers({ 
  events, 
  eventsHasErrored, 
  eventsIsLoading, 
  calendarView, 
  navigationReducer,
  studentYears: studentYearsReducer // 添加这个键,和initialState中的对应
});
export default rootReducer;

3. (可选)调整Initial State

现在你可以选择保留initialState里的studentYears,或者直接删除它——因为我们已经在studentYearsReducer里定义了初始状态,Redux会自动合并这些状态。如果保留的话,确保键名和rootReducer里的完全一致(注意你原来的代码里有个小写id和大写Id的笔误,建议统一改成小写id):

const initialState = { 
  eventsHasErrored: false, 
  eventsIsLoading: true, 
  events: [], 
  calendarView: 0, 
  studentYears: [ 
    { id: 1, title: "Year 1", options: ["Firm 1", "Firm 2", "Firm 3"] }, 
    { id: 2, title: "Year 2", options: ["Firm 2", "Firm 3", "Firm 4"] }, 
    { id: 4, title: "Year 3", options: ["Firm 5", "Firm 6", "Firm 7"] } 
  ] 
};

4. 在组件中获取并使用这个状态

现在你可以通过Redux的连接方法在组件中拿到studentYears数据,生成选择列表:

函数组件(使用useSelector)

import { useSelector } from 'react-redux';

function YearSelector() {
  // 从Redux store中获取studentYears状态
  const studentYears = useSelector(state => state.studentYears);
  
  return (
    <div className="year-selectors">
      {studentYears.map(year => (
        <div key={year.id} className="year-group">
          <h4>{year.title}</h4>
          <select>
            {year.options.map((firm, index) => (
              <option key={index} value={firm}>
                {firm}
              </option>
            ))}
          </select>
        </div>
      ))}
    </div>
  );
}

export default YearSelector;

类组件(使用connect)

import React from 'react';
import { connect } from 'react-redux';

class YearSelector extends React.Component {
  render() {
    const { studentYears } = this.props;
    return (
      <div className="year-selectors">
        {studentYears.map(year => (
          <div key={year.id} className="year-group">
            <h4>{year.title}</h4>
            <select>
              {year.options.map((firm, index) => (
                <option key={index} value={firm}>
                  {firm}
                </option>
              ))}
            </select>
          </div>
        ))}
      </div>
    );
  }
}

// 把Redux状态映射到组件props
const mapStateToProps = state => ({
  studentYears: state.studentYears
});

export default connect(mapStateToProps)(YearSelector);

这样你的错误就会被修复,模拟的JSON数据也能顺利在组件中渲染成选择列表了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:14:54