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

React-Redux中getState()返回undefined问题排查求助

问题

我编写了以下Redux action creator代码:

export const SMSAdmin_Filter_User = (userName) => (dispatch, getState) => {
    var st = getState();
    ...
}

运行时调试器显示getState()是已定义的函数,但执行后变量st却为undefined。我在其他多个action creator中成功使用过getState,不清楚此处失效的原因。

该action以Promise形式调用,因为存在大量用户增量获取的异步逻辑,调用位置代码如下:

componentDidMount() {
        var el = document.getElementById("userList");
        if (el) {
            el.focus({ preventScroll: true });
        }
        // console.log("SMSAdmin")
        new Promise((res,rej)=>this.props.SMSAdmin_Get_Users());
        // .then(() => {
        //     this.setState({ users: this.props.SMSAdmin.users });
        // });
    }

    filterUsers = () => {
        let target = document.getElementById("userName");
        let name = target?.value?.toLowerCase();
        new Promise((res, rej)=>SMSAdmin_Filter_User(name?.trim()));
    }

filterUsers()还会在render函数中调用,以确保SMSAdmin_Get_Users()新增用户时列表能同步更新。

我的mapDispatchToProps代码:

const mapDispatchToProps = (dispatch) => {
    return {
        SMSAdmin_Get_Users: () => { return dispatch(SMSAdmin_Get_Users()) },
        SMSAdmin_Load_User: (userId, userName, oldData = null, startVal = 0, number = 20) => {
            return dispatch(SMSAdmin_Load_User(userId, userName, oldData, startVal, number))
        },
        SMSAdmin_Update_User: (user, province, credits) => { return dispatch(SMSAdmin_Update_User(user, province, credits)) },
        SMSAdmin_setCurrentUpload: (userName) => { return dispatch(SMSAdmin_setCurrentUpload(userName)) },
        SMSAdmin_Filter_User: (userName) => { return dispatch(SMSAdmin_Filter_User(userName)) },
    }
}

Redux store创建代码:

import { createStore, applyMiddleware } from 'redux';
import thunk from 'redux-thunk';
import logger from 'redux-logger';
import { reducers } from './reducerMain.js';

export const ConfigureStore = () => {

    const store = createStore(
        reducers,
        applyMiddleware(thunk, logger)
    );

    return store;
}

因涉及多个关联文件及保密数据,无法提供在线沙箱。

解决方案

核心问题:未通过绑定后的props调用action

你在filterUsers中直接调用了原始的SMSAdmin_Filter_User函数,而非this.props.SMSAdmin_Filter_User。只有经过mapDispatchToProps包装、通过props调用的action,才会被redux-thunk中间件处理,让getState正确绑定到Redux store,从而获取到状态值。

1. 修正filterUsers的调用方式

filterUsers = () => {
    let target = document.getElementById("userName");
    let name = target?.value?.toLowerCase();
    // 改用props中绑定好的方法调用action
    this.props.SMSAdmin_Filter_User(name?.trim());
}

2. 移除不必要的Promise包装

你手动用new Promise包裹action调用的写法既多余又错误——Promise回调内未调用res或rej,会导致Promise一直处于pending状态。如果你的thunk action本身是异步逻辑,只需让action creator返回Promise即可,无需手动包装:

componentDidMount() {
    var el = document.getElementById("userList");
    if (el) {
        el.focus({ preventScroll: true });
    }
    // 直接调用props中的方法,若action返回Promise可直接链式调用then
    this.props.SMSAdmin_Get_Users()
    .then(() => {
        this.setState({ users: this.props.SMSAdmin.users });
    });
}

3. 禁止在render中调用filterUsers

render函数仅负责UI渲染,在此处调用filterUsers会导致每次渲染都触发action,可能引发无限循环或不必要的状态更新。正确的做法是在数据更新时触发过滤逻辑,比如通过componentDidUpdate监听props变化:

componentDidUpdate(prevProps) {
    // 当用户列表数据变化时,重新执行过滤
    if (prevProps.SMSAdmin.users !== this.props.SMSAdmin.users) {
        this.filterUsers();
    }
}

完成以上调整后,getState()就能正确获取到Redux store的状态,st也不会再是undefined。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 07:05:33