Syw.Frontend

๐Ÿงฉ Vue 2๋กœ ๋ฐฐ์šฐ๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๊ธฐ์ดˆ

1๋‹จ๊ณ„. Vue 2 + Express + Axios ์ธ์ฆ ๊ธฐ๋ฐ˜ ํˆฌ๋‘์•ฑ ๋งŒ๋“ค๊ธฐ

1-20. ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž ์ด๋ฆ„์„ Vuex ์ƒํƒœ๋กœ ์ „์—ญ ๊ด€๋ฆฌํ•˜๊ธฐ

๐ŸŽฏ ํ•™์Šต ๋ชฉํ‘œ

  • ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž์˜ 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 ์ €์žฅ์†Œ

GitHub - heroyooi/vue2-app at ch20

๐Ÿ’ฌ ๋Œ“๊ธ€

    โ€ป ๋กœ๊ทธ์ธ ํ›„ ๋Œ“๊ธ€์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.