【问题标题】:Redux state wont propagate to componentRedux 状态不会传播到组件
【发布时间】:2017-11-18 03:49:18
【问题描述】:

我一直在尝试使用 Reacts 组件功能制作组件。在这种情况下,我对 componentDidMount 特别感兴趣。

但是,无论我尝试什么,我的状态都不会传播到组件。

这是组件:

class MainPage extends React.Component
{
    componentDidMount() {
        this.props.actions.requestPosts();
    }
    render() {
        return(
            <div className="main-page">
                <PreviewList posts={this.props.posts}/>
            </div>
        );
    }
}

const mapStateToProps = state => ({
    posts: state.main_posts,
    errors: state.main_errors
});

const mapDispatchToProps = dispatch => {
    return {
        actions: {
            requestPosts: () => dispatch(requestPosts())
        }
    }
};

export default connect(mapStateToProps, mapDispatchToProps)(MainPage);

减速器:

export default (state = {main_posts: [], main_errors: []}, action) => {
    switch(action.type) {
        case USER_REQUESTS_POSTS_SUCCEEDED:
            return Object.assign({}, state, {
                main_posts: action.posts
            });
        case USER_REQUESTS_POSTS_FAILED:
            return Object.assign({}, state, {
                main_errors: action.errors
            });
        default:
            return state;
    }
};

为了简单起见,我没有包含导入语句。我使用 redux-thunk。我已经测试了这些动作,它们成功地到达了减速器。新状态成功创建并返回。然而,它根本没有到达所需的组件。

我已经尝试过研究,我只找到了改变状态的减速器的例子,但我看不到任何我改变状态的地方。我究竟做错了什么? (具有讽刺意味的是,该代码与我其他运行良好的 React 应用程序相似)。

如果有帮助,这里是我的商店:

export const history = createHistory();

const middleware = [
    thunk,
    routerMiddleware(history)
];

const reducers = {
    main: mainReducer,
    router: routerReducer
};

const store = createStore(
    combineReducers(reducers),
    {},
    applyMiddleware(...middleware)  
);

export default store;

编辑:根据要求,这是我的操作:

export const USER_REQUESTS_POSTS_SUCCEEDED = 'user/REQUESTS/POSTS/SUCCESS';
export const USER_REQUESTS_POSTS_FAILED = 'user/REQUESTS/POSTS/FAILURE';

export const requestPosts = () => {
    return function(dispatch) {
        return fetchPosts().then(
            posts => dispatch(requestPostsSucceeded(posts)),
            errors => dispatch(requestPostsFailed(errors))
        );
    };
};

function fetchPosts() {
    return Promise.resolve([{title: 'Test Post', content_short: 'Hello World', author: 'Extremo', category: 'development', tags: ['test'], date: '15.11.17'}]);
}

export const requestPostsSucceeded = (posts) => {
    return {type: USER_REQUESTS_POSTS_SUCCEEDED, posts: posts};
};

export const requestPostsFailed = (errors) => {
    return {type: USER_REQUESTS_POSTS_FAILED, errors: errors};
};

【问题讨论】:

  • 你能告诉我们requestPosts吗?
  • @nem035 我已经更新了我的问题。但是请记住,reducer 确实会接收帖子并使用帖子生成新状态。
  • 那么你在使用&lt;Provider&gt;吗?
  • @nem035 我正在使用 Provider 并将 store 作为参数传递,在内部我还使用带有历史记录的 ConnectedRouter,因为我使用了 react-router,并且在内部使用带有路由的 App。

标签: javascript reactjs redux redux-thunk


【解决方案1】:

来自商店定义

const reducers = {
    main: mainReducer,
    router: routerReducer
};

您应该使用 component reducer's key 访问您的组件状态

这是main

const mapStateToProps = state => ({
    posts: state.main.main_posts,
    errors: state.main.main_errors
});

【讨论】:

  • 我故意不使用以前的帖子。稍后我将编辑我的问题,以显示 requestPosts 到底在做什么!一分钟。
  • 在那里,我更新了答案并添加了操作。正在调用动作,reducer 接收动作信息并生成新状态.. 它只是没有到达组件。
  • @Extremo 感谢您的信息。请检查更新的答案
  • 谢谢!就是这样。我不敢相信解决方案就在我眼前,但我对此视而不见。典型的。
【解决方案2】:

你的mapStateToProps 函数应该是:

function mapStateToProps(state) {
  return {
    posts: state.main.main_posts,
    errors: state.main.main_errors
  }
}

您目前正在以undefined 的身份传递帖子和错误

【讨论】:

  • 感谢提示,检查是不必要的,但它仍然无法解决状态/道具未更新且未重新渲染的问题
  • 哦,我刚刚意识到你提到它永远不会被调度,而实际上它确实如此。有趣的是,它不应该有!因为我对其进行了测试,并且始终调用该操作并生成了帖子。嗯
  • 啊我现在看到问题了,你只需要修复你的mapStateToProps 钩子,我已经更新了答案
  • 谢谢!这行得通!我很高兴我们弄明白了。我自己看不到错误:)
猜你喜欢
  • 2020-09-12
  • 2021-01-21
  • 1970-01-01
  • 2020-09-18
  • 2017-12-15
  • 1970-01-01
  • 2020-02-08
  • 2019-01-19
  • 1970-01-01
相关资源
最近更新 更多