#reactjs #redux #react-redux
#reactjs #сокращение #реагировать-redux
Вопрос:
Я извлекаю сообщения из своих действий, и они не отображаются в
console.log(this.props.posts)
однако он отображается при действиях console.log
Вместо этого я получаю это
в идеале в posts:Array должен отображаться Array(2), Поэтому кажется, что redux не обновляет массив initialState posts
, что делает невозможным извлечение сообщений. И изменение action.data.data
на action.data
ничего не изменит.
actions.js
export const GetPosts = () => {
return (dispatch, getState) => {
return Axios.get('/api/posts/myPosts')
.then( (res) => {
const data = {
data: res.data
}
console.log(data); // logs data and i can see an array
dispatch({type: GET_POSTS, data })
})
}
}
Поэтому я обновляю состояние, чтобы я мог получить его в компоненте.
posts.js
import { POST_FAIL, GET_POSTS, POST_SUCC, DELETE_POST} from '../actions/';
const initialState = {
post: [],
postError: null,
posts:[]
}
export default (state = initialState, action) => {
switch (action.type) {
case POST_SUCC:
return ({
...state,
post:action.post
});
case POST_FAIL:
return({
...state,
postError: action.err.response.data
})
case GET_POSTS:
// console.log(action.data.data)
return {...state, posts: action.data.data}
// case DELETE_POST:
// return ({
// ...state,
// posts: action.posts.filter(post => post.id !== action.posts[0].id)
// })
default:
return state
}
}
Posts.js
import React, { Component } from 'react';
import PostList from './PostList';
import Axios from '../Axios';
import {connect} from 'react-redux';
import { withRouter, Redirect} from 'react-router-dom';
import {DeletePost, GetPosts} from '../actions/';
const Styles = {
myPaper:{
margin: '20px 0px',
padding:'20px'
}
,
wrapper:{
padding:'0px 60px'
}
}
class Posts extends Component {
state = {
posts: [],
loading: true,
}
componentWillMount(){
this.props.GetPosts();
// renders an empty posts array
console.log(this.props.posts);
}
onDelete = (id) => {
Axios.post(`/api/posts/delete/${id}`);
this.setState({
posts: this.state.posts.filter(post => post.id !== id)
})
}
render() {
const {loading, posts} = this.state;
if (!this.props.isAuthenticated) {
return (<Redirect to='/signIn' />);
}
if(loading){
return "loading..."
}
return (
<div className="App" style={Styles.wrapper}>
<h1> Posts </h1>
{/* <PostList posts={this.props.posts}/> */}
</div>
);
}
}
const mapStateToProps = (state) => ({
isAuthenticated: state.user.isAuthenticated,
// i know i have to use state.post.posts but i wanted to get an idea if the
// initialize state updated at all
posts: state.post
})
const mapDispatchToProps = (dispatch, state) => ({
// newPost: (post) => dispatch(newPost(post)),
// DeletePost: (id) => dispatch( DeletePost(id))
GetPosts: () => dispatch( GetPosts())
});
export default withRouter(connect(mapStateToProps,mapDispatchToProps)(Posts));
Ответ №1:
Ваш редуктор устанавливает свойство posts
состояния:
case GET_POSTS:
// console.log(action.data.data)
return {...state, posts: action.data.data}
Ваш компонент сопоставляет свойство post
состояния со свойством вашего компонента posts
:
const mapStateToProps = (state) => ({
isAuthenticated: state.user.isAuthenticated,
// i know i have to use state.post.posts but i wanted to get an idea if the
// initialize state updated at all
posts: state.post
})
Комментарии:
1. спасибо за вашу помощь, это действительно не решает проблему. Я пытаюсь заставить this.props.posts отображаться в консоли. журнал — это все. Или лучший способ обновить состояние.
2. я не могу получить его с помощью this.state.posts, вы на это намекали?
3. Я исправил проблему, мне пришлось действительно прочитать то, что вы написали, принося свои извинения.