【问题标题】:reducer switch statements not working减速器开关语句不起作用
【发布时间】:2018-09-11 01:33:09
【问题描述】:

我刚开始使用 Redux 并尝试实现一个简单的 MERN 应用程序(用于练习)。 我的代码中的所有内容都运行良好,但我的 reducer 函数显示出意外的行为。当一个动作(从 express api 获取数据)被调用时,我的 reducer 正确地转到特定的 switch case 数据日志,但随后通过了三倍的默认 case,并且我记录的组件上的数据显示为 null。请帮忙。 这是我的代码:-

index.js

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import { BrowserRouter as Router } from 'react-router-dom';
import { Provider } from 'react-redux';
import thunk from 'redux-thunk';
import { createStore, applyMiddleware, combineReducers } from 'redux';
import articlesReducer from './store/reducers/articlesReducer';
import registerServiceWorker from './registerServiceWorker';

const rootReducer = combineReducers({
    articles: articlesReducer
});
const store = createStore(rootReducer, applyMiddleware(thunk));
const app = (
    <Provider store={store}>
        <Router>
            <App />
        </Router>
    </Provider>
);

ReactDOM.render(app, document.getElementById('root'));
registerServiceWorker();

App.js

import React, {Component} from 'react';
import {Switch, Route} from 'react-router-dom';
import './App.css';
import Home from './components/Home/Home';

class App extends Component {
    render() {
        return (
            <div>
                <Switch>
                    <Route exact path="/" component={Home} />
                </Switch>
            </div>
        );
    }
}
export default App;

articles.js

export const getAllArticles = () => {
    return dispatch => {
        return (
            fetch('http://localhost:5000/api/articles')
                .then(res => res.json())
                .then(data => {
                    dispatch({type: 'GET_ALL_ARTICLES', articles: data})
                })
        );
    };
};

articlesReducer.js

const initialState = {
    articles:null
};

const reducer = (state = initialState, action) => {
    switch (action.type) {
        case 'GET_ALL_ARTICLES':
            console.log('in reducer', action.type, action.articles[0]);
            return {
                ...state,
                articles: action.articles
            };
        default:
            console.log('In default');
            return state;
    }
};
export default reducer;

我的组件

import React, { Component } from 'react';
import { connect } from 'react-redux';
import { getAllArticles } from '../../store/actions/articles.js';

class MainPage extends Component {

    componentWillMount() {
        this.props.initArticles();
        console.log(this.props.articles);
    }

    render() {
        return (
            <div className="container">
                <br />
                <h1>Here comes the articles!!</h1>
            </div>
        );
    }
}
const mapStateToProps = state => {
    return {
        articles: state.articles
    };
};

const mapDispatchToProps = dispatch => {
    return {
        initArticles: () => dispatch(getAllArticles())
    };
};

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

我的控制台中的输出有点像这样:-

In default
In default
In default
{articles: null}
in reducer GET_ALL_ARTICLES {articles[0] Object}

我不知道是什么错误。提前感谢您的帮助。

【问题讨论】:

  • 代码太多了,请您尝试隔离错误行为吗?
  • 对不起,但我自己不知道错误来自哪里,主要与我的减速器部分有关,我猜在我的组件中(虽然不确定),actions.js 完美地发送了数据到reducer。
  • 我真的明白代码很大。但是,如果您真的看到它们只是很小的 sn-ps 并且可以清楚地理解。如果您能试一试,我将不胜感激。
  • 我认为您的文章属于state.articles.articles。第一个是在articles reducer 中,第二个是在articles reducer 中,它是articles 字段。
  • 我的reducer中的数据正确到达但没有到达组件和控制台输出中的三倍“默认”。

标签: javascript reactjs redux redux-thunk reducers


【解决方案1】:

我不确定这是否真的是问题所在,但您错误地访问了articles。你有一个带有articles reducer 的根 reducer:

const rootReducer = combineReducers({
    articles: articlesReducer
});

初始状态是:

const initialState = {
    articles:null
};

在你的 mapDispatchToProps 中你“导入”整个 reducer 状态:

const mapStateToProps = state => {
    return {
        articles: state.articles
    };
};

我想你想访问articles 属性

const mapStateToProps = state => {
    return {
        articles: state.articles.articles
    };
};

除此之外,一切似乎都很好。但是,正如评论中指出的那样,我会将 articles 初始化为空数组 []。

const initialState = {
    articles: []
};

【讨论】:

  • 是的,也最好把const initialState = [];
  • @Tomasz Mularczyk 我什么都试过了,现在我得到一个错误,TypeError: Cannot read property 'articles' of undefinedarticles: state.articles.articles
  • 另外,我不明白为什么我得到三个In default,然后是in reducer .... 的正确/预期输出
  • 嘿,在您提到的更改之后进行一些更新...我正在通过componentWillReceiveProps() 和render() 方法获取我的数据。而且,因此我可以在我的页面上显示它。万分感谢!! @Tomasz Mularczyk :-) 对不起,如果我花了你很多时间
猜你喜欢
  • 2016-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-03
  • 2014-04-12
  • 1970-01-01
相关资源
最近更新 更多