Не удалось получить данные обратно из actionCreator - PullRequest
0 голосов
/ 10 апреля 2019

В последнее время я работаю в избыточности и пытаюсь получить в свои руки, я пытался асинхронный вызов с помощью redux-thunk.
Я показываю соответствующие файлы.
Posts.js
Этот файл вызывает getPosts () в componentdidmount, который в свою очередь пытается получить данные от actionCreator.

 import React,{Component} from 'react'
import Axios from 'axios'
import CardPost from '../Post/Post'
import Container from 'react-bootstrap/Container'
import Row from 'react-bootstrap/Row'
import Col from 'react-bootstrap/Col'
import classes from './Posts.module.css'
import {Link,Route} from 'react-router-dom'
import {connect} from 'react-redux'
import {getPost} from '../../Store/action/posts'
class Posts extends Component{


    componentDidMount(){
        this.props.getPosts()
    }

    render(){
        let post =<p>Loading data...</p>
       if(this.props.bulkPost.length>0){
           console.log("rendering again")
            post =  this.props.bulkPost.map((item)=>{
            return(

    <Col as={Link} to={"/posts/"+item.id} className={classes.topMargin} key={item.id} sm={4}> 
        <CardPost/>
    </Col>

            )

           })
       }
        return(
            <>
            <div>
                 <Container>
                        <Row> 
                            {post}
                        </Row>
               </Container>
            </div>

        </>
        )
    }
}

const mapStateToProps = state=>{
    return{ 
        bulkPost: state.pos.posts,
        // oneLineData: state.full.fetchedText
    }
}

const mapDispatchToProps = dispatch =>{
    return{

        // onDeleteResult: (id)=>dispatch(actionCreator.deleteResult(id)),
        getPosts:()=>dispatch(getPost())
    }
}

export default connect(mapStateToProps, mapDispatchToProps)(Posts)  

Это мой actionCreator posts.js
Он используетсворачивает промежуточное программное обеспечение thunk и пытается получить данные Async, при проверке по console.log (res) данные извлекаются в файл.

    import {POSTS} from '../action/actionType'
import Axios from 'axios'

export const savePost = (res)=>{
    return{
        posts: res,
        type:POSTS

    }
}

export const getPost = ()=>{
    return (dispatch)=>{
        Axios.get("https://jsonplaceholder.typicode.com/posts/").then((response)=>{    
        dispatch(savePost(response.data));
        })
    }
}

А теперь третий файл, в котором данные должны быть идеально отправлены и возвращены нам

    import * as actionType from '../action/actionType'
const intitalState = {
    posts:[]
}

const reducer = (state=intitalState, action)=>{
    switch(action.type){
        case actionType.POSTS:
                console.log(state)
                const post  = state.posts.slice(0,4);
                const updatedPost = post.map((post)=>{
                    return{
                    ...post
                    }
                })
                    return{
                        ...state,
                        posts:updatedPost
                    }
    }
    return state
}

export default reducer

Здесь сообщения о состоянии не заполняются методом отправки вПервый файлМожет кто-нибудь помочь, пожалуйста, что я делаю здесь не так?
Редактировать: это полный рабочий проект онлайн
https://codesandbox.io/s/4xwlwl70v0

1 Ответ

0 голосов
/ 10 апреля 2019

В вашем actioncreator вы можете отправить действие напрямую:

import Axios from 'axios'
import {POSTS} from '../action/actionType'

export const getPost = ()=>{
    return (dispatch)=>{
        Axios.get("https://jsonplaceholder.typicode.com/posts/").then((response)=>{    
            dispatch({
                type: POSTS,
                posts: response.data
            });
        })
    }
}

В вашем редукторе вы отображаете результаты API-вызова. Я не вижу цели картирования результата? Сообщения от создателя действия доступны на action.posts.

import * as actionType from '../action/actionType'
const initalState = {
    posts: []
}

const reducer = (state = initalState, action)=>{
    switch(action.type){
        case actionType.POSTS:
            const posts = action.posts.slice(0,4);
            return{
                ...state,
                posts: posts
            }
    }
    return state
}

export default reducer;

Не видя ваших комбинированных регудеров, это опечатка?

const mapStateToProps = state=>{
    return{ 
        bulkPost: state.pos.posts, // maybe state.post.posts ?
        // oneLineData: state.full.fetchedText
    }
}
...