Redux не обновляет initialState

#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. Я исправил проблему, мне пришлось действительно прочитать то, что вы написали, принося свои извинения.