react同步请求_React系列十七 - Redux(三)中间件

来源|coderwhy

一. 中间件的使用

1.1. 组件中异步请求

在之前简单的案例中,redux中保存的counter是一个本地定义的数据,我们可以直接通过同步的操作来dispatch action,state就会被立即更新。

但是真实开发中,redux中保存的很多数据可能来自服务器,我们需要进行异步的请求,再将数据保存到redux中。

在之前学习网络请求的时候我们讲过,网络请求可以在class组件的componentDidMount中发送,所以我们可以有这样的结构:

4b782bf42933c80e0328ed6cdf16a8b8.png

组件中发送网络请求

我现在完成如下案例操作:

  • 在Home组件中请求banners和recommends的数据;
  • 在Profile组件中展示banners和recommends的数据;

redux代码进行如下修改:

在reducer.js中添加state初始化数据和reducer函数中处理代码:

const initialState = {  counter: 0,  banners: [],  recommends: []}function reducer(state = initialState, action) {  switch (action.type) {    case ADD_NUMBER:      return { ...state, counter: state.counter + action.num };    case SUB_NUMBER:      return { ...state, counter: state.counter - action.num };    case CHANGE_BANNER:      return { ...state, banners: action.banners };    case CHANGE_RECOMMEND:      return { ...state, recommends: action.recommends };    default:      return state;  }}

constants中增加常量:

const CHANGE_BANNER = "CHANGE_BANNER";const CHANGE_RECOMMEND = "CHANGE_RECOMMEND";

actionCreators.js中添加actions:

const changeBannersAction = (banners) => ({  type: CHANGE_BANNER,  banners}) const changeRecommendsAction = (recommends) => ({  type: CHANGE_RECOMMEND,  recommends})

组件中代码代码修改:

Home组件:

import React, { PureComponent } from 'react';import { connect } from "react-redux";import axios from 'axios';import {  addAction,  changeBannersAction,  changeRecommendsAction} from '../store/actionCreators';class Home extends PureComponent {  componentDidMount() {    axios.get("http://123.207.32.32:8000/home/multidata").then(res => {      const data = res.data.data;      this.props.changeBanners(data.banner.list);      this.props.changeRecommends(data.recommend.list);    })  }  ...其他业务代码}const mapStateToProps = state => {  return {    counter: state.counter  }}const mapDispatchToProps = dispatch => {  return {    addNumber: function(number) {      dispatch(addAction(number));    },    changeBanners(banners) {      dispatch(changeBannersAction(banners));    },    changeRecommends(recommends) {      dispatch(changeRecommendsAction(recommends));    }  }}export default connect(mapStateToProps, mapDispatchToProps)(Home);

Profile组件:

import React, { PureComponent } from 'react';import { connect } from "react-redux";import {  subAction} from '../store/actionCreators';class Profile extends PureComponent {  render() {    return (      
        Profile        
          

当前计数: {this.props.counter}

           this.decrement()}>-1           this.subCounter()}>-5        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值