Операторы переключения редуктора не работают

Я только начал работать с Redux и пытался реализовать простое приложение MERN (для практики). Все в моем коде работает нормально, но моя функция редуктора показывает неожиданное поведение. Когда вызывается действие (которое получает данные из экспресс-api), мой редуктор правильно переходит к конкретным журналам данных случая переключения, но затем три раза передается случай по умолчанию, и данные на моем компоненте, которые я регистрирую, показывают 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;

article.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})
                })
        );
    };
};

articleReducer.js

const initialState = {
    articles:null
};

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

myComponent

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.info(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}

Не знаю, в чем ошибка. Заранее благодарим за помощь.

Слишком много кода, не могли бы вы попытаться изолировать ошибочное поведение, пожалуйста?

Axnyff 01.04.2018 19:58

Мне очень жаль, но я не знаю, откуда взялась ошибка, она в основном связана с моей частью редуктора, и я предполагаю, что в моем компоненте (хотя и не уверен), actions.js отлично отправляет данные в редуктор.

Hemakshi Sachdev 01.04.2018 20:00

Я действительно понимаю, что код довольно большой. Но если уж их увидеть, то они просто небольшие фрагменты и четко понятны. Я был бы очень признателен, если бы вы могли попробовать.

Hemakshi Sachdev 01.04.2018 20:07

Думаю, твои статьи есть в state.articles.articles. Первый, потому что он находится в редукторе статей, второй - в редукторе статей, это поле статей.

Ursus 01.04.2018 20:09

Данные в моем редукторе достигают должным образом, но не до компонента и трижды «По умолчанию» в выводе на консоли.

Hemakshi Sachdev 01.04.2018 20:10

@Ursus, я тоже пробовал, но потом в консоли показывает null вместо {articles: null}.

Hemakshi Sachdev 01.04.2018 20:12
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
6
1 125
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не уверен, действительно ли это проблема, но вы неправильно обращаетесь к articles. У вас есть корневой редуктор с редуктором articles:

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

какое начальное состояние:

const initialState = {
    articles:null
};

И в вашем mapDispatchToProps вы "импортируете" все состояние редуктора:

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

Я думаю, вы хотели получить доступ к свойству articles

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

В остальном вроде все в порядке. Однако, как указано в комментарии, я бы инициализировал articles как пустой массив [].

const initialState = {
    articles: []
};

ага, тоже лучше поставить const initialState = [];

Subin Sebastian 01.04.2018 20:15

@Tomasz Mularczyk Я все перепробовал, теперь выдает ошибку, что TypeError: Cannot read property 'articles' of undefined на articles: state.articles.articles

Hemakshi Sachdev 01.04.2018 20:24

Кроме того, я не понимаю, почему я получаю три In default, а затем правильный / ожидаемый результат in reducer ....

Hemakshi Sachdev 01.04.2018 20:26

Эй, вернемся с небольшим обновлением после упомянутых вами изменений ... Я получаю свои данные в componentWillReceiveProps() и методом render(). И, таким образом, я могу отобразить его на своей странице. Благодаря тонну!! @Tomasz Mularczyk :-) Извините, если я отнял у вас много времени

Hemakshi Sachdev 01.04.2018 20:46

Другие вопросы по теме