【前端知识】React 基础巩固(三十四)——组件中的异步操作及优化

React 基础巩固(三十四)------组件中的异步操作及优化

一、待优化的异步请求流程

  • 通过组件的生命周期来完成网络请求,网络请求的异步代码直接放在组件中
javascript 复制代码
import React, { PureComponent } from "react";
import { connect } from "react-redux";
import {
  changeBannerAction,
  changeRecommendAction,
} from "../store/actionCreators";
import axios from "axios";

export class category extends PureComponent {
  componentDidMount() {
    axios.get("http://123.207.32.32:8000/home/multidata").then((res) => {
      console.log(res.data);
      const banners = res.data.data.banner.list;
      const recommends = res.data.data.recommend.list;
      console.log(banners, recommends);
      this.props.changeBanners(banners);
      this.props.changeRecommends(recommends);
    });
  }

  render() {
    return <div>category</div>;
  }
}

const mapDispatchToProps = (dispatch) => ({
  changeBanners(banners) {
    dispatch(changeBannerAction(banners));
  },
  changeRecommends(recommends) {
    dispatch(changeRecommendAction(recommends));
  },
});

export default connect(null, mapDispatchToProps)(category);

二、利用Redux优化异步网络请求

  • 通过redux来管理异步网络请求

  • 在store中引入中间件redux-thunk

    javascript 复制代码
    import { createStore, applyMiddleware } from "redux";
    import reducer from "./reducer";
    import thunk from "redux-thunk";
    
    // 正常情况下,store.dispatch 只能派发对象
    // 想要派发函数,需要增强,使用 "redux-thunk"
    
    const store = createStore(reducer, applyMiddleware(thunk));
    
    export default store;
  • 构建fetchHomeMultidataAction,将原本在组件中的异步请求代码放入到actionCreators.js中

    javascript 复制代码
    import * as actionTypes from "./constants";
    import axios from "axios";
    
    export const addNumberAction = (num) => ({
      type: actionTypes.ADD_NUMBER,
      num,
    });
    
    export const subNumberAction = (num) => ({
      type: actionTypes.SUB_NUMBER,
      num,
    });
    
    export const changeBannerAction = (banners) => ({
      type: actionTypes.CHANGE_BANNERS,
      banners,
    });
    
    export const changeRecommendAction = (recommends) => ({
      type: actionTypes.CHANGE_RECOMMENDS,
      recommends,
    });
    
    export const fetchHomeMultidataAction = () => {
      return (dispatch, getState) => {
        // 异步操作
        axios.get("http://123.207.32.32:8000/home/multidata").then((res) => {
          const banners = res.data.data.banner.list;
          const recommends = res.data.data.recommend.list;
          dispatch(changeBannerAction(banners))
          dispatch(changeRecommendAction(recommends))
        });
      }
    };
  • 改写原来的category.jsx,派发异步请求的dispatch

    javascript 复制代码
    import React, { PureComponent } from "react";
    import { connect } from "react-redux";
    import { fetchHomeMultidataAction } from "../store/actionCreators";
    // import axios from "axios";
    
    export class category extends PureComponent {
      componentDidMount() {
        // axios.get("http://123.207.32.32:8000/home/multidata").then((res) => {
        //   console.log(res.data);
        //   const banners = res.data.data.banner.list;
        //   const recommends = res.data.data.recommend.list;
        //   console.log(banners, recommends);
        //   this.props.changeBanners(banners);
        //   this.props.changeRecommends(recommends);
        // });
    
        this.props.fetchHomeMultidata();
      }
    
      render() {
        const { banners, recommends } = this.props;
        return (
          <div>
            category
            <div className="banner">
              <h2>轮播图:</h2>
              <ul>
                {banners.map((item, index) => {
                  return <li key={index}>{item.title}</li>;
                })}
              </ul>
            </div>
            <div className="recommend">
              <h2>推荐数据:</h2>
              <ul>
                {recommends.map((item, index) => {
                  return <li key={index}>{item.title}</li>;
                })}
              </ul>
            </div>
          </div>
        );
      }
    }
    
    const mapStateToProps = (state) => ({
      counter: state.counter,
      banners: state.banners,
      recommends: state.recommends,
    });
    
    const mapDispatchToProps = (dispatch) => ({
      //   changeBanners(banners) {
      //     dispatch(changeBannerAction(banners));
      //   },
      //   changeRecommends(recommends) {
      //     dispatch(changeRecommendAction(recommends));
      //   },
      fetchHomeMultidata(recommends) {
        dispatch(fetchHomeMultidataAction(recommends));
      },
    });
    
    export default connect(mapStateToProps, mapDispatchToProps)(category);
  • 查看运行结果

相关推荐
结网的兔子4 分钟前
前端学习笔记(实战准备篇)——用vite构建一个项目【吐血整理】
前端·学习·elementui·npm·node.js·vue
kyriewen6 分钟前
盒模型:CSS 世界的物理法则,margin 塌陷与 padding 的恩怨情仇
前端·css·html
lichenyang4536 分钟前
React 性能优化组件设计模式与通信
前端·javascript·设计模式
小成C6 分钟前
别再把 Claude Code 用乱了:CLAUDE.md、Rules、Skills、Hooks 到底怎么分工?
前端·人工智能·面试
巫山老妖11 分钟前
OpenClaw 技术教程大全:从安装到多 Agent 协作,全在这里
java·前端
weixin_4462608512 分钟前
提升开发效率的神器!快速选择编码上下文 — React Grab
前端·react.js·前端框架
前端付豪16 分钟前
自动学习建议解决薄弱知识点
前端·python·openai
SuperEugene17 分钟前
Vite 实战教程:alias/env/proxy 配置 + 打包优化避坑|Vue 工程化篇
前端·javascript·vue.js·状态模式·vite
文心快码 Baidu Comate18 分钟前
Comate 4.0的自我进化:后端“0帧起手”写前端、自己修自己!
前端·人工智能·后端·ai编程·文心快码·ai编程助手
We་ct28 分钟前
LeetCode 17. 电话号码的字母组合:回溯算法入门实战
前端·算法·leetcode·typescript·深度优先·深度优先遍历