【问题标题】:Action object doesn't reach the reducer when using redux-thunk使用 redux-thunk 时操作对象未到达减速器
【发布时间】:2017-07-13 22:08:18
【问题描述】:

我正在使用 react-typescript-redux 制作一个待办事项应用程序,并想从我的服务器获取待办事项。当我在容器中使用 this.props.getTodos['todo1','todo2'] 对 todos 进行硬编码时,一切正常,但是当我尝试异步执行它时,使用 this.props.requestTodos() - 它没有。当我使用this.props.requestTodos() 来自服务器的响应到达getTodos actionCreator 但由于某种原因操作对象没有到达reducer,所以状态没有得到更新。我该如何解决? actionCreators:

export const getTodos = (todoItems: ReadonlyArray<string>) => {
    return {
        type: Constants.GET_TODOS as typeof Constants.GET_TODOS,
        payload: {todoItems},
    };
};

export const requestTodos = () => {
    return (dispatch: any) => {
        // tslint:disable-next-line:no-expression-statement
        axios('/todos')
        .then((todos: any) => getTodos(JSON.parse(todos.data).todos))
        .catch((err: any) => console.log(err));
    };
};

商店:

const defaultState: IDefaultState = {
    todoItems: [],
};

const store = createStore(
    rootReducer,
    defaultState,
    applyMiddleware(
        thunk,
        createLogger(),
    ));

减速机:

const rootReducer = combineReducers({
    todoItems,
});

TodoItems(减速器):

function todoItems(state = ([] as ReadonlyArray<string>), action: any): any {
  switch (action.type) {
    case Constants.GET_TODOS:
      return [
        ...state,
        action.payload.todoItems,
      ];
    default:
      return state;
  }
}

容器组件:

class TodoList extends React.Component<IProps, {}> {

    public componentDidMount(): any {
        // tslint:disable-next-line:no-expression-statement
        this.props.requestTodos();
    }

    public render(): JSX.Element {
        const todoItems = this.props.todoItems.map((text, i) => (
            <TodoItem key={i} text={text} />
        ));

        return(
            <div>
                <ul className='todo-list'>
                    {todoItems}
                </ul>
            </div>
        );
    }

}

【问题讨论】:

    标签: reactjs redux react-redux redux-thunk


    【解决方案1】:

    看起来您正在调用 getTodos(),但实际上并没有调度它。试试这个:

    .then((todos: any) => dispatch(getTodos(JSON.parse(todos.data).todos)))
    

    【讨论】:

    • 废话,我忘了把它包起来!现在它起作用了。谢谢,伙计。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    • 1970-01-01
    • 1970-01-01
    • 2017-11-28
    • 2018-02-02
    • 1970-01-01
    • 2018-03-20
    相关资源
    最近更新 更多