接上文
(五)对于api文件夹内容进行配置
5.1其中 index.js 主要调用接口 (包括mock数据和后端调用的数据)
// 这里是axios封装的requests请求 import requests from './request' // 这里是mock数据 import mockrequests from './mockrequest'
其中调用mock数据的格式模版为
export const reqGetBannerList = () =>{ return mockrequests.get('/banner') }
其中调用后端接口含参和不含参的模板为
// get请求不含参 export const reqCategoryList = () => requests({ url:'/product/getBaseCategoryList', method:'GET' }) // get请求含params参数 export const reqUpdateCheckedById = (skuId,isChecked) => requests({ url:`/cart/checkCart/${skuId}/${isChecked}`, method:"GET" // post请求params含多个参数 export const reqGetSearchInfo = (params) => requests({ url: '/list', method:"POST", data:params }) // post请求params含少量参数 export const reqAddOrUpdataShopCart = (skuId,skuNum) => requests({ url:`/cart/addToCart/${skuId}/${skuNum}`, method:'POST' })
安装nprogress进度条插件
yarn add nprogress
之后在api的页面中引入
// 引入进度条 import nprogress from 'nprogress' // 引入进度条样式 import "nprogress/nprogress.css"
默认的进度条颜色是蓝色的
也通过修改nprogress.css文件的background来修改进度条颜色
5.2 其中mockrequest.js配置mock数据的请求头以及拦截器
// 对axios二次封装 import axios from 'axios' // 引入进度条 import nprogress from 'nprogress' // 引入进度条样式 import "nprogress/nprogress.css" const mockrequests = axios.create({ // 配置对象 // 基础路径,发送请求的时候,路径当众会出现api baseURL:'/mock', timeout:5000 }) // 添加请求拦截器 mockrequests.interceptors.request.use(function (config) { // 在发送请求之前做些什么 //引入进度条 nprogress.start() return config; }, function (error) { // 对请求错误做些什么 return Promise.reject(error); }); // 添加响应拦截器 mockrequests.interceptors.response.use(function (response) { // 2xx 范围内的状态码都会触发该函数。 // 对响应数据做点什么 // 进度条结束 nprogress.done() return response.data; }, function (error) { // 超出 2xx 范围的状态码都会触发该函数。 // 对响应错误做点什么 return Promise.reject(error); }); //导出 export default mockrequests
5.3requests.js主要是配置后台数据的请求头以及拦截器
// 对axios二次封装 import axios from 'axios' // 引入进度条 import nprogress from 'nprogress' // 引入进度条样式 import "nprogress/nprogress.css" // 引入仓库 将uuid的值带在请求头上 import store from '@/store' const requests = axios.create({ // 配置对象 // 基础路径,发送请求的时候,路径当中会出现api baseURL:'/api', timeout:5000 }) // 添加请求拦截器 requests.interceptors.request.use((config)=>{ // 在发送请求之前做些什么 //引入进度条 nprogress.start() // 将获取的uuid存储到请求头里 if(store.state.detail.uuid_token){ config.headers.userTempId = store.state.detail.uuid_token } return config; }, function (error) { // 对请求错误做些什么 return Promise.reject(error); }); // 添加响应拦截器 requests.interceptors.response.use(function (response) { // 2xx 范围内的状态码都会触发该函数。 // 对响应数据做点什么 // 进度条结束 nprogress.done() return response.data; }, function (error) { // 超出 2xx 范围的状态码都会触发该函数。 // 对响应错误做点什么 return Promise.reject(error); }); //导出 export default requests
(六)有关params和query参数的不同
6.1 query、params两个属性可以传递参数
- query参数:不属于路径当中的一部分,类似于get请求,地址栏表现为 /search?k1=v1&k2=v2
query参数对应的路由信息 path: “/search”
params参数:属于路径当中的一部分,需要注意,在配置路由的时候,需要占位 ,地址栏表现为 /search/v1/v2
- params参数对应的路由信息要修改为path: “/search/:keyword” 这里的/:keyword就是一个params参数的占位符
6.2 query参数进行传参
6.2.1 声明式导航
<router-link :to="{path='/hello'query:{id:666,name:'小明'} }"> 标签体内容 </router-link>
6.2.2 编程式导航
函数(){ this.$router.push({path:"/hello", query:{id:666,name:'小明'}}) }
在进行query传参时router.js中配置的路由信息 name属性一栏可有可没有
6.3 params参数进行传参
6.3.1 声明式导航
<!-- name:router文件夹下,配置路由时需要多配置一个属性——name,这也是和query传参的不同之处 --> <router-link :to="{ name='小鬼' params:{id:666,name:'小明'}}"> 标签体内容 </router-link>
6.3.2 编程式导航
函数(){ this.$router.push({name:"小鬼", params:{id:666,name:'小明'}}) }
在进行params传参时router.js中配置的路由信息 name属性一栏是必须要有的
在router.js中需要这样写
{ path: "/search/:keyword?", //如果不确定参数是否传递 就在参数后面增加一个 ? component: Search, meta: { show: true }, name: 'search' },
(七)有关components文件夹
这个文件夹里面的内容为 页面公共样式 当一个样式会被多个页面所使用的时候 最好将其写入在components中
在页面使用的时候只需要
<template> <TypeNav></TypeNav> </template>
(八)有关store文件夹中的内容
8.1 在main.js中进行全局注册
import store from '@/store new Vue({ render: h => h(App), // 注册Vuex仓库 store }).$mount('#app')
8.2 其中的index.js 是仓库总包 用来管理各个分仓库
import Vue from 'vue' import Vuex from 'vuex' // 使用插件 Vue.use(Vuex) // 引入小仓库 import home from './home' import search from './search' import detail from './detail' import shopCart from './shopCart' // 对外暴露Store类的一个实例 export default new Vuex.Store({ modules:{ home, search, detail, shopCart } })
每当新建一个小仓库的时候 都需要在index.js中进行注册才能供各个组件使用
8.3 各个分包 在此进行vuex三连环
//小仓库 import { } from "@/api" // 页面中需要调用什么接口 就在Import中进行注册 // state: 仓库存储数据的地方 const state = { categoryList:[] } // mutations:修改state的唯一手段 const mutations ={ CATEGORYLIST(state,categoryList){ state.categoryList=categoryList }, } //action 处理action可以书写自己的业务逻辑 也可以处理异步 const actions = { async categoryList({commit}){ const res = await reqCategoryList() // console.log(res) // 此时获得的res if(res.code === 200){ commit("CATEGORYLIST",res.data) } } //getters:可以理解为计算属性 const getters = { } // 对外暴露Store实例 export default({ state, mutations, actions, getters })
注意:使用action时,函数的第一个参数,必须是{commit},即使不涉及到mutations操作,也必须加上该参数,否则会报错。
(九)有关utils的内容
暂时只用到了uuid
import { v4 as uuidv4 } from 'uuid' // 生成一个随机字符串并且游客身份持久存储 export const getUUID = () => { // 看本地存储的是否有uuid let uuid_token = localStorage.getItem("UUIDTOKEN") // 如果没有的话 随机生成一个 if(!uuid_token){ uuid_token = uuidv4() localStorage.setItem('UUIDTOKEN',uuid_token) } return uuid_token }
当生成了uuid时 需要在api中 添加请求拦截器 中写入请求头中