开发者问题收集

React Redux:无法映射对象数组

2017-01-17
4716

如何映射返回的对象数组?当我单击按钮以获取博客时,我得到了此响应

image1 image 2

现在在我的应用程序 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);

我正在将 postsmapStateToProps (其中包含响应数据)通过 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;
3个回答

关于

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 任何内容。

cvetanov
2017-01-17

您正在使用 axios 发送 ajax 请求,因此当您在 blog_posts 上调用 map 时,数据尚未返回。使用 redux-promise https://github.com/acdlite/redux-promise

Ryan Aleksander
2017-01-18

好的,我的问题已经解决了。当我单击 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

Mark Warren
2017-01-18