Syw.Frontend

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

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

1-17. ๋‹คํฌ๋ชจ๋“œ ์ƒํƒœ๋ฅผ ์ „์—ญ ๊ด€๋ฆฌ(Vuex ๋˜๋Š” Store ๋ชจ๋“ˆ)๋กœ ๋ฆฌํŒฉํ† ๋งํ•˜๊ธฐ

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

  • App.vue์— ์žˆ๋˜ isDark ์ƒํƒœ๋ฅผ Vuex ๋˜๋Š” ๋…๋ฆฝ ์Šคํ† ์–ด ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌ
  • ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ์—์„œ ์ „์—ญ์ ์œผ๋กœ ๋‹คํฌ๋ชจ๋“œ ์ƒํƒœ๋ฅผ ๊ณต์œ ํ•˜๊ณ  ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑ

โœ… 1. ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ ๋ฐฉ์‹ ์„ ํƒ

Vue 2์—์„œ๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค:

๋ฐฉ์‹ ํŠน์ง•
โœ… Vuex ์‚ฌ์šฉ ๊ณต์‹ ์ƒํƒœ๊ด€๋ฆฌ ๋„๊ตฌ, ๋ณต์žกํ•œ ์•ฑ์— ์ ํ•ฉ
โœ… ๋‹จ์ˆœ store.js ํŒŒ์ผ Vuex ์—†์ด๋„ ์ž‘๋™, ์ž‘๊ณ  ๋‹จ์ˆœํ•œ ์•ฑ์— ์ ํ•ฉ

โœ… ๋จผ์ € ๊ฐ„๋‹จํ•œ store.js ๋ชจ๋“ˆ ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค

๐Ÿ“ src/store.js ์ƒ์„ฑ

import Vue from 'vue';

export const store = Vue.observable({
  isDark: localStorage.getItem('theme') === 'dark',
});

export const mutations = {
  toggleTheme() {
    store.isDark = !store.isDark;
    localStorage.setItem('theme', store.isDark ? 'dark' : 'light');
  },
};

โœ… Vue.observable()์€ Vue 2์—์„œ ๋ฐ˜์‘ํ˜• ์ƒํƒœ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.


โœ… 2. App.vue ์ˆ˜์ •

<script>
import { store, mutations } from './store';

export default {
  data() {
    return {
      isLoggedIn: !!localStorage.getItem('token'),
    };
  },
  computed: {
    isDark() {
      return store.isDark;
    },
  },
  methods: {
    toggleDark() {
      mutations.toggleTheme();
    },
    logout() {
      localStorage.removeItem('token');
      this.isLoggedIn = false;
      this.$router.push('/login');
    },
  },
  watch: {
    // ๋กœ๊ทธ์ธ ์„ฑ๊ณต ์‹œ์—๋„ ๊ฐฑ์‹ ๋  ์ˆ˜ ์žˆ๋„๋ก localStorage ๊ฐ์‹œ
    $route() {
      this.isLoggedIn = !!localStorage.getItem('token');
    },
  },
};
</script>

โœ… ์ด์ œ data() ๋Œ€์‹  store.isDark๋ฅผ computed๋กœ ์—ฐ๊ฒฐํ•ด์„œ ๋ฐ˜์‘ํ˜• ๋™์ž‘ํ•˜๋„๋ก ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.


โœ… 3. ๋‹คํฌ๋ชจ๋“œ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์กด ํ…œํ”Œ๋ฆฟ์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€

<div :class="['app-container', { dark: isDark }]">

๊ธฐ์กด ํด๋ž˜์Šค ๋ฐ”์ธ๋”ฉ๋„ ๊ทธ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.


โœ… 4. ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์—์„œ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

์ง€๊ธˆ์€ ์˜ˆ์‹œ๊ฐ€ ์—†์ง€๋งŒ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์—์„œ๋„ ๋‹คํฌ ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ๊ฐ€์ ธ์™€์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค:

import { store } from '../store';

computed: {
  isDark() {
    return store.isDark;
  },
},

๐Ÿ“ฆ ์š”์•ฝ

๊ธฐ์กด App.vue์˜ isDark ์ƒํƒœ๋ฅผ ์ „์—ญ store.js๋กœ ๋ถ„๋ฆฌํ•˜๊ณ , ์ปดํฌ๋„ŒํŠธ ์–ด๋””์„œ๋“  ๋‹คํฌ๋ชจ๋“œ ์ƒํƒœ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑํ–ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์•ฑ ์ „์ฒด์˜ ํ…Œ๋งˆ ์„ค์ •์„ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

FE ์ €์žฅ์†Œ

GitHub - heroyooi/vue2-app at ch17

๐Ÿ’ฌ ๋Œ“๊ธ€

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