【发布时间】: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