vue+axios新手实践实现登录

其实像这类的文章网上已经有不少很好的,写这篇文章,至关因而作个笔记,以防之后忘记
用到的:一、 vuex 二、axios 三、vue-routevue

登录流程为:一、提交登录表单,拿到后台返回的数据
二、将数据存入vuexios

vuex配置

这里直接跳过安装之类的,百度一大堆,我直接上代码ajax

// store index.js
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)
// 初始化时用sessionStore.getItem('token'),这样子刷新页面就无需从新登陆
const state = {
  user: window.sessionStorage.getItem('user'),
  token: window.sessionStorage.getItem('token')
}
const mutations = {
  //将token保存到sessionStorage里,token表示登录状态
  SET_TOKEN: (state, data) => {
    state.token = data
    window.sessionStorage.setItem('token', data) 
  },
  //获取用户名
  GET_USER: (state, data) => {
    // 把用户名存起来
    state.user = data
    window.sessionStorage.setItem('user', data)
  },
  //登出
  LOGOUT: (state) => {
    // 登出的时候要清除token
    state.token = null
    state.user = null
    window.sessionStorage.removeItem('token')
    window.sessionStorage.removeItem('user')
  }
}

const actions = {
}
export default new Vuex.Store({
  state,
  mutations,
  actions
})

一、我在这里是将登陆状态token,和用户名user存在sessionStorage里,以便组件使用,若是token为true则表示用户已经登录sessionStorage和token这两个东西很简单用法自行百度
二、不要忘了在main.js引入store,vue实例中也要加入store
main.jsvue-router

import store from './store/index'

new Vue({
  el: '#app',
  router,
  store,
  components: { App },
  template: '<App/>'
})

vue-route配置

import Vue from 'vue'
import Router from 'vue-router'
import Login from '../components/Login'
import Activity from '../components/Activity'
import Index from '../components/Index'
import store from '../store/index'

Vue.use(Router)

const router = new Router({
  routes: [
    {
      path: '/',
      name: '/',
      component: Index
    },
    {
      path: '/login',
      name: 'login',
      component: Login
    },
    {
      path: '/activity',
      name: 'activity',
      component: Activity,
      meta: {
        requireAuth: true // 添加该字段,表示进入这个路由是须要登陆的
      }
    }
  ]
})

// 注册全局钩子用来拦截导航
router.beforeEach((to, from, next) => {
  const token = store.state.token
  if (to.meta.requireAuth) { // 判断该路由是否须要登陆权限
    if (token) { // 经过vuex state获取当前的token是否存在
      next()
    } else {
      console.log('该页面须要登录')
      next({
        path: '/login'
        // query: {redirect: to.fullPath} // 将跳转的路由path做为参数,登陆成功后跳转到该路由
      })
    }
  } else {
    next()
  }
})

export default router

这里我用到router.beforeEach来实现拦截登录,
一、在须要验证的路由的meta里加入咱们本身的requireAuth
二、router.beforeEach里经过requireAuth验证该组件是否须要登录
三、验证token若是为flase就表示未登录跳转到登陆页vuex

axios发送请求

submitLogin () {
  this.$refs.loginForm.validate(valid => {
    if (valid) {
      axios.post('/login', {
        user: this.loginForm.user,
        pass: this.loginForm.pass
      })
        .then((response) => {
          if (response.status === 200) {
            this.$store.commit('SET_TOKEN', response.data.token)
            this.$store.commit('GET_USER', response.data.user)
            this.$message({
              message: '登录成功',
              type: 'success'
            })
            this.$router.push({name: 'activity'})
          }
        })
        .catch(function (error) {
          console.log(error)
        })
    } else {
      console.log('error submit!!')
      return false
    }
  })
},

后台我没写,是用mock.js拦截ajax请求
由于我用的是element-ui因此上面代码有一些直接无视,看核心的就行
一、在数据返回成功后用this.$store.commit来更新vuex里的数据
二、登录成功后跳转this.$router.push()跳转页面,
这里注意,若是你在前面导航拦截的钩子用了query: {redirect: to.fullPath}的话,
这里就 用 this.$router.push(this.$route.query.redirect);这样页面就能跳到
你跳到登录页面前要去的那个路由了element-ui

那个TOKEN我这里也没有使用,就是在页面请求的时候带上这个TOKEN,与后端核对。axios

相关文章
相关标签/搜索