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

Redux中userState.user非空,访问role却报'user为null'错误求助

问题分析与解决方案

嘿,我一眼就揪出了两个导致你报错的问题,咱们一步步来解决:

1. 渲染时的属性路径写错了!

你在render里打印的是this.props.userState.user,但判断角色的时候却写成了this.props.userState.role——这明显是路径错误!正确的访问路径应该是this.props.userState.user.role,毕竟你的Redux state里user是userState下的子属性。

2. 初始渲染时user为null,直接访问role会触发报错

组件第一次渲染时,Redux的userState初始值是{ user: null, finished: false },这时候firebase的onAuthStateChanged还没触发,getUser请求也还没完成,user还是null状态。这时候直接访问user.role,自然会抛出TypeError: Cannot read properties of null (reading 'role')。

修正后的完整组件代码

我们需要先判断user是否存在,再去访问它的role属性,同时修正路径问题:

class ResultsMain extends Component {
  componentDidMount() {
    firebase.auth().onAuthStateChanged(user => {
      if (user)
        getUser(user.email)
          .then(foundUser => {
            console.log('User found:', foundUser);
            this.props.doSetUser(foundUser);
          })
          .catch((err) => {
            console.log(err)
            this.props.history.push('/');
          });
    });
  }

  render() {
    const { user } = this.props.userState;
    console.log("THE PROPS", user)
    
    // 先判断user是否存在,再检查角色
    if (user && user.role === "teacher") {
      return <TeacherSearchPage/>;
    } 
    // 可选:如果user还没加载完成,返回loading状态提升用户体验
    if (!user) {
      return <div>Loading...</div>;
    }
    return <Results />;
  }
}

function mapStateToProps(state) {
  return {
    userState: state.userState,
  }
}

function mapDispatchToProps(dispatch) {
  return {
    doSetUser: user => dispatch(userActions.setUser(user)),
  }
}

export const resultsMainPage = ReactRedux.connect(mapStateToProps, mapDispatchToProps)(ResultsMain);

额外优化(可选)

如果你使用的是ES2020及以上的语法,可以用可选链操作符?.简化空值判断:

if (user?.role === "teacher") {
  return <TeacherSearchPage/>;
}

这样即使user是null或undefined,也不会抛出错误,而是直接返回undefined,条件不成立。

你的Reducer代码是没问题的,SET_USER action正确更新了userState.user的值,只要foundUser确实包含role属性,就能正常渲染对应组件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:42:56