Vue: Axios和Vuex模块化 的综合应用

Axios和Vuex模块化 的综合应用

第一步: 建一个mock --> json文件用来提供假数据

[public/mock/cartList.json]

[
  {
    "id": 1,
    "name": "巧克力",
    "price": 6,
    "unit": "块",
    "type": ["德芙", "费列罗"]
  },
  {
    "id": 2,
    "name": "牛奶",
    "price": 10,
    "unit": "袋",
    "type": ["伊利", "蒙牛", "金典"]
  }
]

第二步: 在vue文件里面引用并获取mock数据

[src/views/AxiosTest.vue]

<template>
  <div class="AxiosTest">
    <h2>Axios测试</h2>
    <button @click="getCartList">获取列表</button>
    <hr/>
    <!-- 将从后端请求过来的数据, 循环展示到页面 -->
    
    <!-- 第一种表现形式 -->
    <div v-for="item in cartList" :key="item.id">
      {{ item.name }} 丨 {{ item.price }}元/{{ item.unit }}
      <!-- 展示type里面的数据 双层for循环 -->
      <div v-for="(atom, index) in item.type" :key="'a' + index">
        {{ atom }}
      </div>
    </div>
    
	<!-- 第二种表现形式 -->
    <div v-for="item in cartList" :key="item.id">
      <!-- 展示type里面的数据 双层for循环 -->
      <div v-for="(atom, index) in item.type" :key="'a' + index">
        {{ atom }} 丨 {{ item.price }}元/{{ item.unit }}
      </div>
  </div>
</template>

<script>
import axios from 'axios'

export default {
  name: 'AxiosTest', // 组件名称
    
  data () {
      return {
          cartList: []
      }
  },
  methods: {
      getCartList () {
          // 请求JSON数据
          axios({
              url: '/mock/cartList.json',
              method: 'get'
          }).then(({ data }) => { // 解构data
              this.cartList = data // 将data解构拿到的数据放进空数据
          })
      }
  }
</script>

第一种展示形式
第二种展示形式

第三步: 发起异步

用同步函数的写法去写异步函数, 此时需要在方法前面加 async, 然后在其内的方法体前接 await。

<template>
  <div class="AxiosTest">
    <h2>Axios测试</h2>
    <button @click="getCartList">获取列表</button>
    <hr/>
  </div>
</template>

<script>
import axios from 'axios'

export default {
  name: 'AxiosTest', // 组件名称
    
  data () {
      return {
          cartList: []
      }
  },
  methods: {
      async getCartList () {
          // 用async & await, 就不需要写.then了~
          const { data: data1 } = await axios({ // 不能同时在一个方法里面写两个一样的常量名, 可以解构赋名
              url: '/mock/cartList.json',
              method: 'get'
          })
          const { data: data2 } = await axios({
        	url: '/mock/drinkList.json',
        	method: 'get'
          })
      }
  }
</script>
[
  {
    "id": 1,
    "name": "可口可乐",
    "price": 3,
    "unit": "瓶"
  },
  {
    "id": 2,
    "name": "康师傅冰红茶",
    "price": 3,
    "unit": "瓶"
  }
]

打印在控制台

第四步: 封装axios, 方便之后引用方法

[src/assets/js/httpRequest.js]

import axios from 'axios'
import store from '@/store/index'
import { APIURL } from '@/store/common/constant'

// 把当前时间存在每一次的浏览地址上, 这样可以保证浏览器不会读取缓存地址, 从而使每一次浏览都是属于刷新的
function rebuildUrl (url) {
  return `${APIURL}${url}?t=${Date.now()}`
}

function getAxiosParameter (url, params, type) {
  // 如果 accessToken 是 null, Flag = false
  const flag = !!store.state.common.accessToken // 强制类型转换
  const accessToken = store.state.common.accessToken // Vuex模块化
  let axiosParam = {}
  
  if (flag) {
    // accessToken 存在
    // get 方式
    if (type === 'get') {
      axiosParam = {
        url: rebuildUrl(url),
        method: 'get',
        params,
        headers: {
          Authorization: `Bearer ${accessToken}`
        }
      }
    } else {
    // accessToken 不存在
    // get 方式
    if (type === 'get') {
      axiosParam = {
        url: rebuildUrl(url),
        method: 'get',
        params
      }
    }
  }
  return axiosParam
}
    
// GET 请求
export const httpGet = (url, params) => axios(getAxiosParameter(url, params, 'get'))
  .then(({ data }) => {
    console.log(`httpGet: ${url}`, data)
    return data
  })
  .catch((error) => { // 报错
    console.log(`httpGet: ${url}_ERROR`, error) 
  })

五. Vuex模块化

把后端需要的数据放到vuex模块里面

[src/store/common/common.js]

export default {
  namespaced: true,

  state: { // 数据存放
    clientId: 'c1', // 客户端ID
    clientSecret: 'vY9W55NuXM9hoDlx', // 客户端对称秘钥
    username: sessionStorage.getItem('username'), // 用户名
    userId: sessionStorage.getItem('userId'), // 用户ID
    accessToken: sessionStorage.getItem('accessToken'), // 访问Token
    refreshToken: sessionStorage.getItem('refreshToken') // 刷新Token
  },
  mutations: { // 用于事件触发
    setState (state, payload) {
      state[payload.name] = payload.val
    }
}

然后把vuex模块引入到store里面

[src/store/index.js]

import Vue from 'vue'
import Vuex from 'vuex'
// 引入Vuex模块
import common from '@/store/common/common'
Vue.use(Vuex)

export default new Vuex.Store({
  modules: {
    common
  }
})

最后把store引入到上面的axios里
import store from '@/store/index'

function getAxiosParameter (url, params, type) {
  // 如果 accessToken 是 null, Flag = false
  const flag = !!store.state.common.accessToken // 强制类型转换
  const accessToken = store.state.common.accessToken // Vuex模块化
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值