๐ฏ ํ์ต ๋ชฉํ
- ๋ก๊ทธ์ธํ ์ฌ์ฉ์์
username
์ Vuex ์ํ์ ์ ์ฅ - ์๋ก๊ณ ์นจ ์์๋ username ๋ณต๊ตฌ
- UI์์ ์ฌ์ฉ์ ์ด๋ฆ์ ํธํ๊ฒ ํ์ํ ์ ์๊ฒ ํจ
โ
1๋จ๊ณ: Vuex ์ํ์ username
์ถ๊ฐ
๐ง src/store/index.js
export default new Vuex.Store({
state: {
isDark: localStorage.getItem('theme') === 'dark',
isLoggedIn: false,
username: localStorage.getItem('username') || '', // โ
์ฌ์ฉ์ ์ด๋ฆ ์ ์ฅ
},
mutations: {
toggleDark(state) {
state.isDark = !state.isDark;
localStorage.setItem('theme', state.isDark ? 'dark' : 'light');
},
login(state, token) {
localStorage.setItem('token', token);
state.isLoggedIn = true;
},
setUsername(state, name) {
state.username = name;
localStorage.setItem('username', name);
},
logout(state) {
localStorage.removeItem('token');
localStorage.removeItem('username');
state.isLoggedIn = false;
state.username = '';
},
syncLoginState(state) {
const token = localStorage.getItem('token');
const name = localStorage.getItem('username');
if (!token || isTokenExpired(token)) {
localStorage.removeItem('token');
localStorage.removeItem('username');
state.isLoggedIn = false;
state.username = '';
} else {
state.isLoggedIn = true;
state.username = name || '';
}
},
},
});
โ
2๋จ๊ณ: Login.vue
์์ ์ฌ์ฉ์ ์ด๋ฆ๋ ์ ์ฅ
๐ง ๋ณ๊ฒฝ ์
this.$store.commit('login', res.data.token);
localStorage.setItem('username', res.data.username);
๐ง ๋ณ๊ฒฝ ํ
this.$store.commit('login', res.data.token);
this.$store.commit('setUsername', res.data.username);
โ
3๋จ๊ณ: ์ฌ์ฉ์ ์ด๋ฆ ์ฌ์ฉ ์์ (App.vue
๋ฑ)
import { mapState } from 'vuex';
computed: {
...mapState(['isDark', 'isLoggedIn', 'username']),
}
<div v-if="isLoggedIn" class="user-info">
๐ค {{ username }} ๋ ํ์ํฉ๋๋ค.
</div>
๐ฆ ์์ฝ
๋ก๊ทธ์ธ ์ฑ๊ณต ์ ์ฌ์ฉ์ ์ด๋ฆ๋ Vuex์ ์ ์ฅํ๊ณ , ์๋ก๊ณ ์นจํด๋ ๋ณต๊ตฌ๋๋๋ก ํจ์ผ๋ก์จ, ์ฌ์ฉ์ ๊ฐ์ธํ UI ๊ตฌ์ฑ์ด ๋ ์ฌ์์ก๋ค.
FE ์ ์ฅ์
๐ฌ ๋๊ธ
โป ๋ก๊ทธ์ธ ํ ๋๊ธ์ ์์ฑํ ์ ์์ต๋๋ค.