React Redux:无法映射对象数组
如何映射返回的对象数组?当我单击按钮以获取博客时,我得到了此响应
现在在我的应用程序 js 中,
import React from 'react';
import Blog from '../components/Blog';
import Form from '../components/Form';
import Root from '../components/Root';
import { Router, Route, IndexRoute, browserHistory} from 'react-router';
import axios from 'axios';
import { connect } from 'react-redux';
class App extends React.Component {
render(){
return(
<Router history={browserHistory}>
<Route path={'/'} component={Root}>
<IndexRoute component={ () => (<Blog blog_posts={this.props.posts} fetchBlogs={this.props.fetchBlogs} />) } ></IndexRoute>
<Route path={'/form'} component={Form}></Route>
</Route>
</Router>
);
}
}
const mapStateToProps = (state) => {
return {
posts: state.blogs
};
};
const mapDispatchToProps = (dispatch) => {
return {
fetchBlogs : () => {
dispatch(
{ type: "FETCHING_BLOG" },
axios.get("https://jsonplaceholder.typicode.com/posts")
.then( (response) => {
dispatch({
type: "FETCHING_SUCCESS",
payload: response.data
})
} )
.catch( (err) => {
dispatch({
type: "FETCHING_ERROR",
payload: err
})
})
);
}
};
};
export default connect(mapStateToProps, mapDispatchToProps)(App);
我正在将
posts
从
mapStateToProps
(其中包含响应数据)通过 props 传递到
IndexRoute
中的博客组件中。
在我的博客组件中,我正在记录传递的 props(如上图所示)并且传递正常。现在是
blog_posts
。现在我正在映射
blog_posts
,但不起作用并返回
ncaught TypeError: Cannot read property 'map' of undefined
。请解释为什么它不起作用。也许
blog_post
应该包含另一个数组,值应该存储在那里???请解释我做错了什么
我的博客组件:
import React from 'react';
class Blog extends React.Component {
render(){
console.log("Passed", this.props);
let b = this.props.blog_posts.map(item => {
console.log(item)
});
return(
<div>
<button onClick={() => this.props.fetchBlogs()}>Fetch Users!</button>
</div>
);
}
}
export default Blog;
reducer:
const initBlogState = {
fetching: false,
fetched: true,
blogs: [],
error: null
};
export default function blogReducer (state = initBlogState, action) {
switch(action.type)
{
case "FETCHING_BLOG":
state = {
...state,
fetching: true
};
break;
case "FETCHING_SUCCESS":
state = {
...state,
fetched: true,
blogs: action.payload
};
break;
case "FETCHING_ERROR":
state = {
...state,
fetched: false,
error: action.payload
};
break;
default:
break;
}
return state;
};
提供商:
import React from 'react';
import ReactDOM from 'react-dom';
import App from './container/App';
import { Provider } from 'react-redux';
import store from './store';
ReactDOM.render(
<Provider store={store}>
<App />
</Provider>, document.getElementById('root'));
商店:
import { createStore, applyMiddleware } from 'redux';
import logger from 'redux-logger';
import blogReducer from './reducers/blogReducer';
import thunk from 'redux-thunk';
const store = createStore(
blogReducer,
{},
applyMiddleware(thunk, logger())
);
export default store;
关于
Uncaught TypeError: Cannot read property 'map' of undefined
您可以尝试为 Blog 组件定义默认的 prop 类型。
Blog.defaultProps = {
blog_posts: []
}
但这可能无法修复它,并且可能与您正在执行的其他错误有关。
更重要的是,map 函数应用于返回调用 .map 的集合的转换集合。 因此,在您的情况下,您没有从 map 返回任何对象,您正在使用(我想知道此代码如何没有报告编译错误,因为 map 应该返回一个值):
let b = this.props.blog_posts.map(item => {
console.log(item)
});
如果您只是想遍历集合,请使用 .forEach 而不是 .map,如果您的意图是使用 .map 将集合转换为新集合,那么您的函数应该 返回 一个值,而不仅仅是 console.log 某些东西。 它看起来应该像这样:
let b = this.props.blog_posts.map(item => {
console.log(item);
return item; // you can transform the item here however you like
});
虽然我认为没有必要在 .map 迭代中 console.log 任何内容。
您正在使用
axios
发送 ajax 请求,因此当您在
blog_posts
上调用
map
时,数据尚未返回。使用
redux-promise
:
https://github.com/acdlite/redux-promise
好的,我的问题已经解决了。当我单击
Blog
组件中的
fetch user
按钮时,map 函数已经触发(即使 axios 请求尚未完成返回数据)。因此,我创建了一个函数来检查 Reducer 初始状态中的
fetched
状态。使用这样的代码
if (this.props.fetched === true)
{
console.log("passed: ", this.props);
console.log("blogs: ", this.props.blog_post);
let b;
b = this.props.blog_post.blogs.map(item => {
return console.log(item)
});
}
然后我发现,在我的 Reducer 的初始状态下,
fetched
被错误地分配为
true
!所以我将其更改为
false