Vue使用localStorage保存登录状态

前端Vue项目使用localStorage来保存用户登陆状态

在使用Vue写app项目时,最基本的功能那肯定就是登陆注册非它莫属了,但是最近我在写项目的时候遇到了一个问题,那就是在调用后端接口的同时,却无法进行正常的调用,原因其实很简单,那就是用户登录的状态无法保持!!!于是我在网上疯狂的查找其中相关的方法,但是看着各个博主的各种方式都可以实现,自己却怎么也搞不出来。所以今天特意总结了一下

我的项目是用到vant来开发的,所以会有对应的组件

  • 首先应该在登录的过程中,调用后端所提供的接口,然后拿到后端传给的token登录组件Login.vue的代码如下:
<template>
  <Move>
    <div id="Login" slot="Move">
      <div class="content">
        <div class="HeaderWord">欢迎登录</div>
        <van-form class="form">
          <van-field
            class="username"
            v-model="loginForm.username"
            name="用户名"
            label="用户名"
            placeholder="用户名"
            :rules="[{ required: true, message: '' }]"
            input-align="left"
            label-width="6.0em"
          />
          <van-field
            class="password"
            v-model="loginForm.password"
            type="password"
            name="密码"
            label="密码"
            placeholder="密码"
            :rules="[{ required: true, message: '' }]"
          />
          <div>
            <div class="buttons">
              <van-button
                class="btn"
                size="large"
                hairline
                round
                color="linear-gradient(to right, skyblue, greenyellow)"
                @click="login()"
                >登录</van-button
              >
              <van-button
                class="btn"
                size="large"
                hairline
                round
                color="linear-gradient(to right, skyblue, greenyellow)"
                to="/register"
                >注册</van-button
              >
            </div>
          </div>
        </van-form>
      </div>
    </div>
  </Move>
</template>

<script>
import Move from "../../components/Move/Move";
import { Toast } from "vant";
import { reqLogin } from "../../api/loginAndRegister";	//引入登录的接口函数

import { mapMutations } from "vuex";

export default {
  components: {
    Move,
  },
  data() {
    return {
      loginForm: {
        username: "",
        password: "",
      },
    };
  },
  methods: {
    ...mapMutations(["CHANGE_LOGIN"]),
    login() {
      let user;	//定义变量,记录用户
      if (this.loginForm.username === "" || this.loginForm.password === "") {
        Toast("请输入用户名或密码");
      } else {
        reqLogin(this.loginForm.username, this.loginForm.password).then((res) => {
          if (res.code === "200") {	//后端给的成功的响应状态码为200
            user = this.loginForm.username;
            this.$store.dispatch("recordUser", user);
            // 将后端传给的token保存下来,然后保存到Vuex中
            localStorage.setItem("token", res.token);
            this.$store.dispatch("setToken", res.token);
			// 请求成功后跳转到指定路由界面
            this.$router.replace("/home");
            Toast(res.msg);
          } else {
            Toast(res.msg);
            this.loading = false;
          }
        });
      }
    },
  },
};
</script>

封装的axios函数如下:

import axios from "axios";
export function ajax(config) {
  // 1.创建axios实例对象
  const instance = axios.create({
    baseURL: 'http://songidea.free.idcfengye.com',
    // timeout: 5000
  })
  // 2.axios拦截器
  // 请求拦截
  instance.interceptors.request.use(config => {
    return config
  }, err => {
    // console.log(err)
  })
  // 响应拦截
  instance.interceptors.response.use(res => {
    return res.data
  }, err => {
    console.log(err)
  })
  // 3.发送网络请求
  return instance(config)
}

登录的接口函数如下:
在这里插入图片描述

import {ajax} from '../api/ajax'

// 请求登录
export function reqLogin(username,password) {  
  return ajax({
    url:'/login',
    method:'POST',
    params:{
      username,
      password
    }
  })
}

在store中的state.js文件里,定义token

const state = {
  userInfo:{},//存储用户信息
  token:localStorage.getItem('token'),
}

export default state

在mutations.js中,同步修改state的值

import * as types from './mutation-types'
export default {
  // 修改登录信息
  [types.RECEIVE_USER_INFO](state,{userInfo}){
    state.userInfo = userInfo
  },

  // 同步操作token
  [types.SET_TOKEN](state,token){
    state.token = token
  },
}

在action中,异步修改state的值

import * as types from './mutation-types'
export default {
  recordUser({commit},userInfo){
    commit(types.RECEIVE_USER_INFO,{userInfo})
  },
  // 设置token
  setToken(context,token){
    context.commit(types.SET_TOKEN,token)
  },
  // 清除token
  clearToken(context){
    context.commit(types.SET_TOKEN)
  },

最后是路由拦截功能(在main.js里边配置)
在这里插入图片描述
给每一个需要拦截的路由配置对应的属性,如下:
在这里插入图片描述
都需要配置一个meta:{requiresAuth:true}

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Vue.js是一个流行的JavaScript框架,用于构建用户界面。它提供了一种简洁的方式来管理应用程序的状态和数据。在Vue.js中,可以使用本地储(localStorage)来在浏览器中保存数据。 localStorage是浏览器提供的一种持久化储数据的机制,它允许将数据以键值对的形式储在浏览器中。这些数据将一直保存在用户的浏览器中,即使用户关闭了浏览器也不会丢失。 在Vue.js中,可以通过以下步骤来使用localStorage进行本地储: 1. 设置数据:使用localStorage.setItem(key, value)方法来设置数据,其中key是要储的数据的键,value是要储的数据的值。例如: ``` localStorage.setItem('username', 'John'); ``` 2. 获取数据:使用localStorage.getItem(key)方法来获取储的数据,其中key是要获取的数据的键。例如: ``` const username = localStorage.getItem('username'); ``` 3. 更新数据:可以通过重新设置相同的键来更新已储的数据。例如: ``` localStorage.setItem('username', 'Jane'); ``` 4. 删除数据:使用localStorage.removeItem(key)方法来删除已储的数据,其中key是要删除的数据的键。例如: ``` localStorage.removeItem('username'); ``` 需要注意的是,localStorage只能储字符串类型的数据。如果要储其他类型的数据,可以使用JSON.stringify()方法将其转换为字符串,然后使用JSON.parse()方法将其转换回原始类型。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值