【发布时间】: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