前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2.封装axios、本地存储,安装vuex、element

2.封装axios、本地存储,安装vuex、element

作者头像
RtyXmd
发布2018-08-30 14:42:57
1.3K0
发布2018-08-30 14:42:57
举报
文章被收录于专栏:前端vue前端vue前端vue

Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式 Element 一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库

html5 Web存储

当用户登录后,前端需要存一些必要信息,比如用户名,token,登录状态等等,这里用到vuex和本地存储(vuex存储后虽然能够做到数据响应但是却干不过刷新,所以需要本地存储) 操作本地存储步骤比较麻烦,这里简单封装下

src下新建tools用来放各种工具

// src/tools目录下新建storage.js
let storage = {
  get(key) {
    return window.sessionStorage.getItem(key);
  },
  set(key, val) {
    window.sessionStorage.setItem(
      key,
      typeof val !== "string" ? JSON.stringify(val) : val
    );
  },
  del(key) {
    window.sessionStorage.removeItem(key);
  },
  cle() {
    window.sessionStorage.clear();
  }
};
export default storage;
添加vuex,封装axios,引入element
安装依赖
npm install axios --save
npm install element-ui --save
npm install vuex --save
引入 main.js添加以下配置
// src/main.js
// element
import ElementUI from "element-ui";
import "element-ui/lib/theme-chalk/index.css";
//sotre
import store from "./store";
//storage
import storage from "./tools/storage";
Vue.prototype.Storage = storage;
Vue.use(ElementUI);
new Vue({
  el: "#app",
  router,
  store,
  components: { App },
  template: "<App/>"
});
vuex使用

src下新建store文件 store文件下新建index.js作为入口文件

// /src/store/index.js
import Vue from 'vue';
import Vuex from 'vuex';
import user from './modules/user';
Vue.use(Vuex);
export default new Vuex.Store({
  modules: {
    user
  }
});

store文件下新建modules区分各个模块 modules下新建user.js用户模块

// /src/store/modules/user.js
import Storage from "@/tools/storage";
const state = {
  //token
  token: Storage.get("token")
};
const actions = {
  setToken({ commit }, data) {
    commit("setToken", data);
  }
};
const mutations = {
  setToken(state, data) {
    Storage.set("token", data);
    state.token = Storage.get("token");
  }
};
export default {
  state,
  actions,
  mutations
};
封装Axios

tools文件下新建request.js

import axios from "axios";
import { Message } from "element-ui";
import store from "@/store";
//创建axios
const service = axios.create({
  //这里baseurl就是刚开始配置的开发环境和线上环境地址,webpack会自动读取无需手动再改
  baseURL: process.env.BASE_URL, //baseurl
  timeout: 20000 //请求超时
});

//request拦截
//请求拦截主要作用是验证请求是否合法,会带有用户token,这里模拟一个token,可以根据实际情况修改
service.interceptors.request.use(
  config => {
    let token = store.state.user.token;
    if (store.state.user.token) {
      config.headers["rty-token"] = token;
    }
    return config;
  },
  err => {
    console.log(err);
    Promise.reject(err);
  }
);

//respone拦截
//响应拦截主要是对返回做统一处理
service.interceptors.response.use(
  response => {
    let res = response.data;
    let { data, code } = res;
    // console.log(response)
    if (code !== 200) {
      Message({
        message: res.data.message,
        type: "error",
        duration: 5 * 1000
      });
      if (res.code === 5000) {
        console.log("token过期");
      }
      return false;
    } else {
      //这里吧错误响应不再返回到页面,直接统一处理掉,只有正确的返回才会被接收并做下一步处理
      return data;
    }
  },
  err => {
    //这里处理服务端错误
    console.log("err" + err); // for debug
    Message({
      message: err.message,
      type: "error",
      duration: 5 * 1000
    });
    return Promise.reject(err);
  }
);
export default service;

src下新建api文件夹 api文件下新建user.js写用户请求

import service from "@/tools/request";

export function login({ username, password }) {
  return service({
    url: "/user/login",
    method: "post",
    data: {
      username,
      password
    }
  });
}
测试请求

在helloworld.vue中测试发送请求

// html
<template>
  <div class="hello">
    <button @click="sendRequest">发送请求</button>
  </div>
</template>
// js
import { login } from "@/api/user";
export default {
  name: "HelloWorld",
  data() {
    return {
      loginForm: {
        username: "rty",
        password: 123
      }
    };
  },
  methods: {
    async sendRequest() {
      let res = await login(this.loginForm);
      console.log(res);
    }
  }
};

点击发送请求,在network中查看返回的数据

请求成功

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.08.20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • html5 Web存储
  • 添加vuex,封装axios,引入element
    • 安装依赖
      • 引入 main.js添加以下配置
        • vuex使用
          • 封装Axios
            • 测试请求
            相关产品与服务
            对象存储
            对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档