반응형
1. utils/cookie.js
function saveAuthToCookie(value) {
document.cookie = `til_auth=${value}`;
}
function saveUserToCookie(value) {
document.cookie = `til_user=${value}`;
}
function getAuthFromCookie() {
return document.cookie.replace(
/(?:(?:^|.*;\s*)til_auth\s*=\s*([^;]*).*$)|^.*$/,
'$1',
);
}
function getUserFromCookie() {
return document.cookie.replace(
/(?:(?:^|.*;\s*)til_user\s*=\s*([^;]*).*$)|^.*$/,
'$1',
);
}
function deleteCookie(value) {
document.cookie = `${value}=; expires=Thu, 01 Jan 1970 00:00:01 GMT;`;
}
export {
saveAuthToCookie,
saveUserToCookie,
getAuthFromCookie,
getUserFromCookie,
deleteCookie,
};
2. store/index.js
import Vue from 'vue';
import Vuex from 'vuex';
import {
getAuthFromCookie,
getUserFromCookie,
saveAuthToCookie,
saveUserToCookie,
} from '@/utils/cookies';
import { loginUser } from '@/api/auth';
Vue.use(Vuex);
export default new Vuex.Store({
state: {
username: getUserFromCookie() || '',
token: getAuthFromCookie() || '',
},
getters: {
isLogin(state) {
return state.username !== '';
},
},
mutations: {
setUsername(state, username) {
state.username = username;
},
clearUsername(state) {
state.username = '';
},
setToken(state, token) {
state.token = token;
},
// clearToken 함수 추가
clearToken(state) {
state.token = '';
},
},
actions: {
async LOGIN({ commit }, userData) {
const { data } = await loginUser(userData);
console.log(data.token);
commit('setToken', data.token);
commit('setUsername', data.user.username);
saveAuthToCookie(data.token);
saveUserToCookie(data.user.username);
return data;
},
},
});
3. AppHeader.vue (로그아웃 동작 보완)
- 로그인 상태에 따라서 링크 값 달라지게 구현 :to (v-bind로 변경)
<template>
<header>
<div>
<!-- 로그인 상태에 따라서 링크 값 달라지게 구현 :to (v-bind로 변경) -->
<router-link :to="logoLink" class="logo">
TIL
<span v-if="isUserLogin">by {{ $store.state.username }}</span>
</router-link>
</div>
<div class="navigations">
<!-- 1 -->
<template v-if="isUserLogin">
<a href="javascript:;" @click="logoutUser" class="logout-button">
Logout
</a>
</template>
<!-- 2 -->
<template v-else>
<router-link to="/login">로그인</router-link>
<router-link to="/signup">회원가입</router-link>
</template>
</div>
</header>
</template>
<script>
import { deleteCookie } from '@/utils/cookies';
export default {
computed: {
isUserLogin() {
return this.$store.getters.isLogin;
},
logoLink() {
return this.$store.getters.isLogin ? '/main' : '/login';
},
},
methods: {
logoutUser() {
this.$store.commit('clearUsername');
this.$store.commit('clearToken');
deleteCookie('til_auth');
deleteCookie('til_user');
this.$router.push('/login');
},
},
};
</script>
<style scoped>
.username {
color: white;
}
header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 10px 20px;
background-color: #927dfc;
z-index: 2;
box-shadow: 0px 3px 10px rgba(0, 0, 0, 0.05);
}
a {
color: #dedede;
font-size: 18px;
}
a.logo {
font-size: 30px;
font-weight: 900;
color: white;
}
.logo > span {
font-size: 14px;
font-weight: normal;
}
.navigations a {
margin-left: 10px;
}
.fixed {
position: fixed;
top: 0;
width: 100%;
}
.logout-button {
font-size: 14px;
}
a.router-link-exact-active {
color: white;
font-weight: bold;
}
</style>
반응형
'vue.js > vue.js 2' 카테고리의 다른 글
135. 테스트 코드 작성 방법 | describe, test, expect(result).toBe(30) (0) | 2023.02.26 |
---|---|
134. Jest | 테스팅 환경 구성 | 테스트 코드가 필요한 이유 (0) | 2023.02.26 |
132. 라우터 네비게이션 가드 (to, from, next) | 특정 URL로 접근하기 전 동작을 정의하는 함수 | 로그인 상태에 따른 로고 이동 링크 처리 (0) | 2023.02.26 |
131. vue Filters | 지역 Filters, 전역 Filters 사용 법 (0) | 2023.02.26 |
130. posts 수정 API 구현 | this.$route.params.id | Dynamic Route Matching 사용 (0) | 2023.02.19 |