zoukankan      html  css  js  c++  java
  • vue前台 (三)优化三级分类请求次数(发送ajax次数)

    js部分, app.vue

     //本来我们请求三级分类列表的功能是在TypeNav里面去做的,TypeNav组件又在 /home 路径下,加载TypeNav后,自动会发送ajax请求,

    //而当从 /home 路由切换到 /serach 路径后,因为 /serach 路径 也有 TypeNav组件,加载TypeNav组件后,又会自动发送ajax请求,
    这个请求会触发两次,而数据又是一样的,所以造成浪费(效率低下),   因此我们可以优化在app总组件当中去发请求,请求发送一次即可
     
      mounted() {
        this.getCategoryList();
      },
      methods:{
        getCategoryList(){
          this.$store.dispatch('getCategoryList')
        }
      }
     
    vuex,发送ajax部分,并且存储数据部分
     
    1.ajax二次封装部分,ajax.js
    //对axios的二次封装
    // 配置基础路径和超时限制
    // 添加进度条信息  nprogress
    // 返回的响应不再需要从data属性当中拿数据,而是响应就是我们要的数据
    // 统一处理请求错误, 具体请求也可以选择处理或不处理
    import axios from 'axios'
    import NProgress from 'nprogress'
    import 'nprogress/nprogress.css'
    
    
    const service = axios.create({
      baseURL: '/api',  // 配置基础路径
      timeout: 20000,  //和超时限制
    });
    
    
    //请求拦截器
    //请求拦截器内部一般不会处理错误的信息
    service.interceptors.request.use(config => {
      //config是发送请求的配置对象,必须处理完返回这个配置对象
      //开启我们的进度条
      NProgress.start()
      return config
    });
    // 响应拦截器
    service.interceptors.response.use(
      response => {
        //停止进度条
        NProgress.done()
        //返回响应的时候,直接返回响应的data
        return response.data
      },
      error => {
    
        NProgress.done()
    
        alert('请求出错' + error.message || '未知错误')
        //以后不允许用户继续处理: 中断promise链
        return new Promise(() => {}) //返回pending状态的promise 中断
        //以后它允许用户继续对错误进行处理
        // return Promise.reject(error)
      }
    );
    
    
    export default service

    2.接口请求函数文件 index.js

    //这个文件是项目的接口请求函数文件
    //给每个接口发请求,我们都把它封装成一个函数,到时需要请求拿数据的时候,就去调用对应的接口函数就完了
    import Ajax from '@/ajax/Ajax'
    // 请求获取三级分类列表数据
    // get   /api/product/getBaseCategoryList   参数:无
    
    export const reqCategoryList = () => Ajax({
      url:'/product/getBaseCategoryList',
      method:'GET'
    })

    3.vuex,发送ajax请求部分  home.js

    import {reqCategoryList} from '@/api'
    
    const state = {
      categoryList : []
    }
    const mutations = {
      //直接修改数据
      RECEIVECATEGORYLIST(state,categoryList){
        state.categoryList = categoryList
      }
    }
    
    const actions = {
      //异步请求数据
      //async 和 await的用法
      async getCategoryList({commit}){
        const result = await reqCategoryList()
        if(result.code === 200){
          commit('RECEIVECATEGORYLIST',result.data)
        }
      }
      
    }
    
    const getters = {}
    
    export default {
      state,
      mutations,
      actions,
      getters
    }

    4.TypeNav组件获取响应数据部分   typeNav.vue

    import { mapState } from "vuex";
    
     computed: {
        // categoryList(){
        //   return this.$store.state.categoryList
        // }
    
        // ...mapState(['categoryList'])
    
        //上面两种写法是一回事,mapState映射的时候默认映射的就是总的store的state内部的数据
        //如果使用了vuex模块化开发,那么数组的形式就无法使用了
    
        // 普通写法
        // categoryList(){
        //   return this.$store.state.home.categoryList
        // }
        
        ...mapState({
          categoryList: state => state.home.categoryList
        })
      }
     
  • 相关阅读:
    Swift 面向对象解析(二)
    Swift 面向对象解析(一)
    iOS 动画笔记 (二)
    iOS 动画笔记 (一)
    UICollectionView 很简单的写个瀑布流
    MVC校验
    win8.1弹框
    Python开发之pip使用详解
    MySQL基础之数据类型和运算符
    网络爬虫之scrapy爬取某招聘网手机APP发布信息
  • 原文地址:https://www.cnblogs.com/fsg6/p/13320718.html
Copyright © 2011-2022 走看看