前端vue3+ts+localStorage登录token持久化

store.js

import { Commit, createStore } from 'vuex'
import axios from 'axios';

export interface UserProps {
    isLogin: boolean;
    nickName?: string;
    _id?: string;
}
export interface GlobalDataProps {
    token: string;
    user: UserProps;
}
const store = createStore<GlobalDataProps>({
    state: {
        token: localStorage.getItem('token') || '',
        user: { isLogin: false }
    },
    mutations: {
        //获取token
        login(state, rawData) {
            //1.获取token
            const { token } = rawData.data
            state.token = token
            localStorage.setItem('token', token)
            //2.设置header token
            axios.defaults.headers.common.Authorization = `Bearer ${token}`
         },
         //获取用户登录信息
         fetchCurrentUser(state, rawData) {
            state.user = { isLogin: true, ...rawData.data }
         },
     },
    actions: {
        //登录操作
        login({ commit }, payload) {
            return postAndCommit('/user/login', 'login', commit, payload)
        },
        //通过token获取用户信息
        async fetchCurrentUser({ commit } ) {
            const { data } = await axios.get('/user/current')
            commit('fetchCurrentUser', data)
        },
        //组合actions
        loginAndFetch({ dispatch }, loginData) {
            return dispatch('login', loginData).then(() => {
                return dispatch('fetchCurrentUser')
            })
        },
    },
}
export default store

Login.vue

<script lang="ts">
import { defineComponent, ref } from 'vue'
import { useRouter } from 'vue-router'
import { useStore } from 'vuex'

export default defineComponent({
    name: 'Login',

    setup() {

        const router = useRouter()
        const store = useStore()
        
        //监听点击事件
        const onFormSubmit = (result: boolean) => {
            if(result) {
                const payload = {
                    email: emailVal.value,
                    password: passwordVal.value
                }
                //触发
                store.dispatch('loginAndFetch', payload).then(data => {
                    console.log(data)
                    router.push('/')//跳到首页去
                })
            }
        }
        return {
            emailVal,
            passwordVal,
            onFormSubmit,
        }
    },
})
</script>

App.vue

<script lang="ts">
import { defineComponent, computed, onMounted} from 'vue'
import { useStore } from 'vuex'
import { GlobalDataProps } from './store'
export default defineComponent({
    name: 'App',
    setup() {
        const store = useStore<GlobalDataProps>()
     
        //防止登录后刷新页面 重新获取用户信息 做到持久化登录状态
        onMounted(() => {
            const token = store.state.token
            if(token) {
                store.dispatch('fetchCurrentUser')
            }
        })
        const currentUser = computed(() => {
            return store.state.user
        })

        return {
            currentUser,
            
        }
    }
})
</script>

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值