【问题标题】:Couldn't able to get data back from actionCreator无法从 actionCreator 取回数据
【发布时间】:2019-08-31 12:26:41
【问题描述】:

最近我一直在使用 redux 并试图动手,我尝试了 redux-thunk 的异步调用。
我正在显示相关文件。
Posts.js
此文件在 componentdidmount 中调用 getPosts(),作为回报尝试从 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
它利用 redux thunk 中间件并尝试异步获取数据,在通过 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

【问题讨论】:

  • 我在这里没有看到您使用的中间件,例如 redux-thunk,因为您现在正在制作异步动作创建者,但看起来您已经有了答案。
  • 是的,我在 actionCreator 中使用过它,因为 redux 总是同步的,thunk 让它异步。如果我错了请纠正我,我真的是 redux 的初学者/\
  • 没错,redux 不能开箱即用地处理异步 JavaScript,这就是 Redux Thunk 等中间件的目的。

标签: reactjs redux redux-thunk


【解决方案1】:

在您的 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
            });
        })
    }
}

在您的 reducer 中,您正在映射 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;

没有看到你的 combineRecduers,这是一个错字吗?

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

【讨论】:

  • 不,我已经合并了它们,我在帖子中有一个链接到在线开发环境的链接,你可以看到我已经合并了两者
  • 我映射了结果,因为 redux dosent 支持异步调用,所以必须映射结果,看我的概念可能有点坏,但我认为应该是这样的
  • 您不必映射结果。默认情况下,Redux 操作创建者不支持异步操作,例如获取数据,这就是您使用 thunk 的原因。我已将我的更改应用到您的代码中,它可以工作,codesandbox.io/s/r772pov6zp
  • 在你的减速器中, const post = state.posts.slice(0,4); state.posts 是一个空数组。这就是为什么您永远不会收到任何帖子返回到该组件
  • 哇,你是救命稻草,让我在代码中看看我做错了什么
猜你喜欢
  • 1970-01-01
  • 2020-08-16
  • 2021-09-29
  • 2019-04-08
  • 1970-01-01
  • 2022-01-27
  • 1970-01-01
  • 1970-01-01
  • 2016-10-30
相关资源
最近更新 更多