๐ป ์์ํ๋ฉฐ
์์ฆ ๊ฐ๋ฐํ๋ ๋ชจ๋ ์น ํ์ด์ง์์ ํ ๋ง ๊ธฐ๋ฅ์ ๋นผ๋์ ์ ์๋ค.
๋ฐ๋ผ์ ์๋ก์ด ํ๋ก์ ํธ์์๋ ํ ๋ง ๊ธฐ๋ฅ์ ๋ฃ์ด๋ณด๋ ค๊ณ ํ๋ค.
ํ
๋ง ์ ๋ณด๋ฅผ ์ด๋์ ๊ธฐ๋กํ๋ฉด ์ข์๊น ์๊ฐํ๋ค๊ฐ
์ฌ๋ฌ๊ฐ์ง ์ด์ ๋ก ๊ธ ์ ๋ชฉ์ฒ๋ผ ํผ๋์ ์คํ ์ด์ ๊ธฐ๋กํด์ผ๊ฒ ๋ค๋ ์๊ฐ์ด ๋ค์๋ค.
๐ ๏ธ ์๊ตฌ์ฌํญ
ํ
๋ง ๊ธฐ๋ฅ์ ๊ตฌํํ ๋ ๋จ์ํ ๋ธ๋ผ์ฐ์ ๋ ๊ธฐ๊ธฐ์ ์ค์ ์ ๋ฐ๋ผ๊ฐ๊ธฐ๋ง ํด๋ ์ข์ง๋ง
๊ทธ์๋ ๋ณ๋๋ก ์ฌ์ฉ์ ์ง์ ๋ ๊ฐ๋ฅํ๊ฒ ํ๊ณ ์ถ์ด์ ์๊ตฌ์ฌํญ์ ๋น๊ต์ ๋ณต์กํ๊ฒ ์ง์ ํ๋ค.
- ๊ธฐ๋ณธ์ ์ผ๋ก ๊ธฐ๊ธฐ์ ์ค์ ์ ๋ฐ๋ผ ์ค์ ๋์ด์ผ ํจ
- ์ฌ์ฉ์๊ฐ ํ ๋ง๋ฅผ ๋ณ๊ฒฝ์ ๊ธฐ๊ธฐ์ ์ค์ ๊ณผ ๋ณ๊ฐ๋ก ๋์ํด์ผ ํจ
- ํ ๋ง ์ ๋ณด๋ ์ ์ฅ๋์ด ์๋ค๊ฐ ๋ค์ ์ ๊ทผํ ๋ ๋ณต์๋์ด์ผ ํจ.
- ํ ๋ง๋ฅผ ๋ณ๊ฒฝํ ๋ ์๋ก๊ณ ์นจ ๋ฑ์ ์ก์ ์์ด ์ฆ๊ฐ์ ์ผ๋ก ๋ฐ์๋์ด์ผ ํจ. ← ํผ๋์๋ฅผ ์ฌ์ฉํ๊ฒ ๋ ์ด์ ๋ค.
- ๋ผ์ดํธ / ๋คํฌ ๋ชจ๋ ๋ฟ๋ง ์๋๋ผ ๊ทธ์ธ์ ํ ๋ง๋ ์ง์๋์ด์ผ ํจ (์๋ฅผ ๋ค๋ฉด true-dark ๊ฐ์๊ฑฐ)
โจ๏ธ ๊ฐ ๊ธฐ๋ฅ ๊ตฌํ
์ด์ ์๊ตฌ์ฌํญ์ ๋ง๊ฒ ๊ฐ๊ฐ์ ๊ธฐ๋ฅ์ ๊ตฌํํด๋ณด๋ ค๊ณ ํ๋ค.
โ๊ธฐ๋ณธ์ ์ผ๋ก ๊ธฐ๊ธฐ์ ์ค์ ์ ๋ฐ๋ผ ์ค์ ๋์ด์ผ ํจ
์ด ๊ธฐ๋ฅ์ ๊ตฌํํ๋๊ฑด ์ฌ๋ฌ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค.
๋ํ์ ์ผ๋ก๋ css์ ๋ฏธ๋์ด ์ฟผ๋ฆฌ๋ฅผ ํ์ฉํ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
๋ฐ๋ก ์๋ ์ฝ๋์ฒ๋ผ `prefers-color-scheme` ์์ฑ์ ํ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
๊ธฐ๊ธฐ ์ค์ ์ ๋ฐ๋ผ ์๋ก ๋ค๋ฅธ ํ ๋ง๋ฅผ ์ง์ ํ ์ ์๋ค.
๋ค๋ง ์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด ์ฌ์ฉ์๊ฐ ํ ๋ง๋ฅผ ๋ณ๊ฒฝํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ฒ์งธ ์๊ตฌ์ฌํญ์ด ์ถฉ์กฑ๋ ์ ์๋ค.
๋ฐ๋ผ์ ์ด ์์ฑ์ ๋จ์ํ ํ์ฌ ๊ธฐ๊ธฐ์ ์ค์ ๊ฐ์ ๋ถ๋ฌ์ค๋๋ฐ๋ง ์ฌ์ฉํ๊ธฐ๋ก ํ๋ค.
/**
* ํ์ฌ ์์คํ
์ค์ ์ ๊ธฐ๋ฐํ ํ
๋ง ๊ฐ์ ๋ฐํํ๋ ํจ์
*/
const getSystemTheme = (): Theme => {
return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
};
๊ทธ๋ฐ๋ฐ ๋ง์ฝ ์ฌ์ฉ์๊ฐ ์น์ฌ์ดํธ๋ฅผ ์ด์ด๋์ ์ํ์์ ๊ธฐ๊ธฐ ์ค์ ์ ๋ณ๊ฒฝํ๊ฒ ๋๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
์ ์ฝ๋๋ ํ๋ฒ๋ง ๋ถ๋ฌ์ค๋ ํจ์๊ธฐ ๋๋ฌธ์ ๊ธฐ๊ธฐ ์ค์ ์ด ๋ฐ๋์์๋ ์ฌํธ์ถ์ ํ์ง ์๋๋ค๋ฉด ํ์ฌ ํ ๋ง ๊ฐ์ ์ฆ์ ๋ถ๋ฌ์ฌ ์ ์๋ค.
๋ฐ๋ผ์ ๋ณ๋์ ์ด๋ฒคํธ๋ฅผ ์ถ๊ฐํด ์ฌ์ฉ์๊ฐ ๊ธฐ๊ธฐ ์ค์ ์ ๋ณ๊ฒฝํ์๋๋ฅผ ๊ฐ์งํ๊ธฐ๋ก ํ๋ค.
const theme: Ref<Theme> = ref('light'); // ํ
๋ง ๊ฐ ์ ์ฅํ ๋ณ์
/**
* ์์คํ
์ค์ ๋ณ๊ฒฝ ๊ฐ์ง๋ฅผ ์ํ ์ด๋ฒคํธ ๋ฆฌ์ค๋ ์ค์ ํจ์
*/
const setEvent = () => {
const darkModeMediaQuery: MediaQueryList = window.matchMedia('(prefers-color-scheme: dark)');
const handleDarkModeChange = (): void => {
theme.value = getSystemTheme()
};
darkModeMediaQuery.addEventListener('change', handleDarkModeChange); // ์ฌ๊ธฐ๊ฐ ํต์ฌ!
};
์ด ์ฝ๋์ ํต์ฌ์ ๋ฏธ๋์ด ์ฟผ๋ฆฌ์ ์ด๋ฒคํธ๋ฅผ ๋ฑ๋กํ๋ ๊ฒ์ด๋ค.
์ด๋ ๊ฒ ๋๋ฉด ๋ฏธ๋์ด ์ฟผ๋ฆฌ๊ฐ ์๋ํ ๋ (์ฌ๊ธฐ์๋ ํ ๋ง๊ฐ ๋ณ๊ฒฝ๋ ๋) ์ด๋ฒคํธ๋ฅผ ๋ฐ์ ์ ์๋ค.
โ์ฌ์ฉ์๊ฐ ํ ๋ง๋ฅผ ๋ณ๊ฒฝ์ ๊ธฐ๊ธฐ์ ์ค์ ๊ณผ ๋ณ๊ฐ๋ก ๋์ํด์ผ ํจ
์ฌ์ฉ์ ๊ธฐ๊ธฐ ์ค์ ๊ณผ ๋ณ๊ฐ๋ก ๋์ํ๋ ค๋ฉด ๋ณ๋์ ํด๋์ค๋ฅผ ์ง์ ํด์ ํ ๋ง๋ฅผ ์์ฑํด์ผ ํ๋ค.
๊ทธ๋ฌ๊ธฐ ์ํด์ body์ ์๋์ฒ๋ผ ํ ๋ง ํด๋์ค๋ฅผ ์ง์ ํ๊ธฐ๋ก ํ๋ค.
body.theme-light
body.theme-dark
const availableThemes: Theme[] = ['light', 'dark'];
/**
* body ํ๊ทธ์ ํด๋์ค๋ฅผ ์
๋ฐ์ดํธํ๋ ํจ์
*/
const updateBodyClass = (newTheme: Theme) => {
document.body.classList.remove(...availableThemes.map(theme => `theme-${theme}`));
document.body.classList.add(`theme-${newTheme}`);
};
// theme ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์คํ๋ watch ํจ์
watch(
theme,
newValue => {
// ํ
๋ง ๊ฐ์ด ๋ณ๊ฒฝ ๋ ๊ฒฝ์ฐ ํด๋น ๊ฐ์ผ๋ก body ํด๋์ค ์
๋ฐ์ดํธ
updateBodyClass(newValue);
},
{
immediate: true // ์คํ ์ด๊ฐ ์ค์ ๋ ๋ ์ฆ์ ์คํ
}
);
body์ ๋ชจ๋ ํ ๋ง ํด๋์ค๋ฅผ ์ ๊ฑฐํ๊ณ ์๋ก ์ง์ ํด์ฃผ๋ ํจ์๋ฅผ ๋ง๋ค์๋ค.
watch ํจ์๋ฅผ ์ด์ฉํด์ ์ด ํจ์๋ฅผ ํ ๋ง ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์คํํด์ฃผ๋ฉด ๋์ด๋ค.
โํ ๋ง ์ ๋ณด๋ ์ ์ฅ๋์ด ์๋ค๊ฐ ๋ค์ ์ ๊ทผํ ๋ ๋ณต์๋์ด์ผ ํจ.
์ด๊ฑธ ๊ตฌํํ๊ธฐ ์ํด์๋ ์คํ ์ด๊ฐ ์๋๋ผ ๋ณ๋์ ์ ์ฅ ๊ณต๊ฐ์ด ํ์ํ๋ค.
์คํ ์ด๋ ์๋ก๊ณ ์นจ์ ๋ ์๊ฐ๋ ํ๋ฐ์ฑ ์คํ ์ด์ด๊ธฐ ๋๋ฌธ์ ๋ก์ปฌ์คํ ๋ฆฌ์ง์ ํ ๋ง ๊ฐ์ ์ ์ฅํ๊ธฐ๋ก ํ๋ค.
์ ์ฅํ๋ ๊ธฐ๋ฅ์ ๋ณ๋๋ก ๋ง๋ค์ด๋ ๋์ง๋ง ์ด๋ฏธ ์ ๋ง๋ค์ด์ง ํผ๋์ ํ๋ฌ๊ทธ์ธ์ด ์๋ค.
์ด ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ๋ฉด ๋ก์ปฌ์คํ ๋ฆฌ์ง์ ์ ์ฅํ๋ ๊ณผ์ ์ ์ฐ๋ฆฌ๊ฐ ์ ๊ฒฝ์ธ ํ์ ์๋ค.
์ด ์ค์ ์ ์ํ ์ฝ๋๋ ๋๋ฌด ๋จ์ํด์ ์ฌ๊ธฐ์ ๊ธฐ์ฌํ์ง ์๋๋ค.
์ ์ฒด ์ฝ๋ ํน์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ ๋ฅผ ์ฐธ๊ณ ํ๋ฉด ๋๋ค.
โํ ๋ง๋ฅผ ๋ณ๊ฒฝํ ๋ ์๋ก๊ณ ์นจ ๋ฑ์ ์ก์ ์์ด ์ฆ๊ฐ์ ์ผ๋ก ๋ฐ์๋์ด์ผ ํจ.
์ด ๊ธฐ๋ฅ์ ์ํ ์ฝ๋๋ ์ด๋ฏธ ์์ ์์ฑ๋์๋ค.
ํ ๋ง ๋ณ์๋ฅผ ref ๋ณ์๋ก ์ ์ธํ๊ณ watch๋ฅผ ํตํด์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค body์ ํด๋์ค๋ฅผ ์ง์ ํ๊ณ ์์ผ๋ ํด๋น ๊ฐ์ css์์ ์ฌ์ฉํ๋ฉด ๋๋ค.
body.theme-light {
color-scheme: light;
background-color: #fff;
color: #333;
}
body.theme-dark {
color-scheme: dark;
background-color: #000;
color: #fff;
}
โ๋ผ์ดํธ / ๋คํฌ ๋ชจ๋ ๋ฟ๋ง ์๋๋ผ ๊ทธ์ธ์ ํ ๋ง๋ ์ง์๋์ด์ผ ํจ
์ฌ์ฉ์์ ๊ธฐ๊ธฐ ์ค์ ์ ์ ์งํ๊ธฐ ์ํด์๋ ๋ผ์ดํธ / ๋คํฌ ๋ชจ๋๊ฐ ์๋๋ผ ์์คํ ๋ชจ๋๋ ๋ณ๊ฐ๋ก ํ์ํ๋ค.
๊ทธ ์ธ์๋ ์ง์ง #000์ ๋ฐฐ๊ฒฝ์ผ๋ก ์ฌ์ฉํ๋ true-dark ๋ชจ๋๋ฅผ ์ง์ํ๊ธฐ๋ก ํ๋ค.
์ด๊ฑธ ์ํด์๋ ์ฌํ ์์ฑํ ์ฝ๋๋ฅผ ์ฝ๊ฐ ์์ ํด์ผ ํ๋ค.
// theme ์ํ๋ฅผ Ref ๊ฐ์ฒด๋ก ์์ฑ.
const theme: Ref<Theme> = ref('system'); // ๊ธฐ๋ณธ ๊ฐ์ system์ผ๋ก ์ค์
const availableThemes: Theme[] = ['system', 'light', 'dark', 'true-dark']; // system๊ณผ true-dark ๋ชจ๋ ์ถ๊ฐ
/**
* ์์คํ
์ค์ ๋ณ๊ฒฝ ๊ฐ์ง๋ฅผ ์ํ ์ด๋ฒคํธ ๋ฆฌ์ค๋ ์ค์ ํจ์
*/
const setEvent = () => {
const darkModeMediaQuery: MediaQueryList = window.matchMedia('(prefers-color-scheme: dark)');
const handleDarkModeChange = (): void => {
if (theme.value === 'system') {
// ๋ ์ด์ ๊ธฐ๊ธฐ ์ค์ ์ด ๋ณ๊ฒฝ๋ ๋ ํ
๋ง ๊ฐ์ ๋ณ๊ฒฝํ์ง ์๊ณ body์ ํด๋์ค ๋ช
๋ง ๋ณ๊ฒฝํ๋ค.
// ์ด ๊ธฐ๋ฅ์ system ์ผ๋๋ง ์๋ํ๋๋ก ํ๋ค.
// system์ด ์๋๋ body ํด๋์ค ๋ณ๊ฒฝ์ ๋ฐ์ ์๋ watch์์ ๋ด๋นํ๋ค.
updateBodyClass(getSystemTheme());
}
};
darkModeMediaQuery.addEventListener('change', handleDarkModeChange);
};
// theme ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์คํ๋ watch ํจ์
watch(
theme,
newValue => {
if (newValue === 'system') {
// 'system'์ผ๋ก ์ค์ ๋ ๊ฒฝ์ฐ ํ์ฌ ์์คํ
ํ
๋ง์ ๋ฐ๋ผ body ํด๋์ค ์
๋ฐ์ดํธ
updateBodyClass(getSystemTheme());
} else {
// 'system' ์ธ์ ๊ฐ์ผ๋ก ์ค์ ๋ ๊ฒฝ์ฐ ํด๋น ๊ฐ์ผ๋ก body ํด๋์ค ์
๋ฐ์ดํธ
updateBodyClass(newValue);
}
},
{
immediate: true // ์คํ ์ด๊ฐ ์ค์ ๋ ๋ ์ฆ์ ์คํ
}
);
setEvent ํจ์๋ฅผ ๋ณ๊ฒฝํด์ system ์ผ๋๋ง body ํด๋์ค๋ฅผ ์ ๋ฐ์ดํธ ํ๋๋ก ๋ณ๊ฒฝํ๋ค.
์ด๋ฌ๋ฉด ๋ ์ด์ ๊ธฐ๊ธฐ ์ค์ ๋ณ๊ฒฝ์ ํ ๋ง ๊ฐ์ด ๋ณ๊ฒฝ๋์ง๋ ์์ง๋ง body ํด๋์ค๋ง ๋ณ๊ฒฝ๋๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์๋ ์ค์ ๋ก ํ ๋ง๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๊ฒ ๋๋ค.
์ฌ์ฉ์๊ฐ ํ ๋ง๋ฅผ ์ค์ ํ ๋ body์ ๋ฐ์ํ๋๊ฑด watch ํจ์๊ฐ ๋ด๋นํ๋ค.
๐ ์์ฑ๋ ์ ์ฒด ์ฝ๋
import { defineStore } from 'pinia';
import { computed, Ref, ref, watch } from 'vue';
// Theme ํ์
์ ์: 'light', 'dark', 'true-dark', 'system' ์ค ํ๋์ ๊ฐ์ ๊ฐ์ง ์ ์์
export type Theme = 'light' | 'dark' | 'true-dark' | 'system';
// Pinia ์คํ ์ด ์ ์
export const useThemeStore = defineStore(
'theme', // ์คํ ์ด ID
() => {
// theme ์ํ๋ฅผ Ref ๊ฐ์ฒด๋ก ์์ฑ.
const theme: Ref<Theme> = ref('system');
const availableThemes: Theme[] = ['system', 'light', 'dark', 'true-dark'];
/**
* ํ์ฌ ์์คํ
์ค์ ์ ๊ธฐ๋ฐํ ํ
๋ง ๊ฐ์ ๋ฐํํ๋ ํจ์
*/
const getSystemTheme = (): Theme => {
return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
};
/**
* ์์คํ
์ค์ ๋ณ๊ฒฝ ๊ฐ์ง๋ฅผ ์ํ ์ด๋ฒคํธ ๋ฆฌ์ค๋ ์ค์ ํจ์
*/
const setEvent = () => {
const darkModeMediaQuery: MediaQueryList = window.matchMedia('(prefers-color-scheme: dark)');
const handleDarkModeChange = (): void => {
if (theme.value === 'system') {
// ์ค์ ์ด ๋ณ๊ฒฝ๋ ๋ body์ ํด๋์ค ๋ช
๋ง ๋ณ๊ฒฝํ๋ค.
// ์ด ๊ธฐ๋ฅ์ system ์ผ๋๋ง ์๋ํ๋๋ก ํ๋ค.
// system์ด ์๋๋ body ํด๋์ค ๋ณ๊ฒฝ์ ๋ฐ์ ์๋ watch์์ ๋ด๋นํ๋ค.
updateBodyClass(getSystemTheme());
}
};
darkModeMediaQuery.addEventListener('change', handleDarkModeChange);
};
/**
* body ํ๊ทธ์ ํด๋์ค๋ฅผ ์
๋ฐ์ดํธํ๋ ํจ์
*/
const updateBodyClass = (newTheme: Theme) => {
document.body.classList.remove(...availableThemes.map(theme => `theme-${theme}`));
document.body.classList.add(`theme-${newTheme}`);
};
// theme ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์คํ๋ watch ํจ์
watch(
theme,
newValue => {
if (newValue === 'system') {
// 'system'์ผ๋ก ์ค์ ๋ ๊ฒฝ์ฐ ํ์ฌ ์์คํ
ํ
๋ง์ ๋ฐ๋ผ body ํด๋์ค ์
๋ฐ์ดํธ
updateBodyClass(getSystemTheme());
} else {
// 'system' ์ธ์ ๊ฐ์ผ๋ก ์ค์ ๋ ๊ฒฝ์ฐ ํด๋น ๊ฐ์ผ๋ก body ํด๋์ค ์
๋ฐ์ดํธ
updateBodyClass(newValue);
}
},
{
immediate: true // ์คํ ์ด๊ฐ ์ค์ ๋ ๋ ์ฆ์ ์คํ
}
);
return {
theme,
availableThemes,
setEvent
};
},
{
// Pinia ์คํ ์ด ์ง์์ฑ ์ค์
persist: {
key: 'theme'
}
}
);
์ ์ฒด ํ๋ก์ธ์ค๋ ์๋์ ๊ฐ๋ค.
- ๊ธฐ๋ณธ ํ ๋ง๋ ์์คํ ์ผ๋ก ์ค์ ๋๋ค.
- ์ด ํ ๋ง ๊ฐ์ pinia-plugin-persistedstate ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด์ ๋ก์ปฌ์คํ ๋ฆฌ์ง์ ์ ์ฅ๋๊ณ , ๋ค์ ์ ๊ทผํ ๋ ์๋์ผ๋ก ๋ณต์๋๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ theme ๊ฐ ์ ์ฅ/๋ณต์์ ์ ๊ฒฝ์ธ ํ์๊ฐ ์๋ค.
- watch๋ฅผ ํตํด์ (immediate ์ต์ ์ด ์์ผ๋ฏ๋ก) ์ฒ์์ updateBodyClass ํจ์๊ฐ ํธ์ถ๋๋ค. ์ด ํจ์๋ body์ ํด๋์ค๋ฅผ ์ง์ ํด์ค๋ค.
- ์ค์ ํ ๋ง ์คํ์ผ์ body ํด๋์ค๋ฅผ ์ฐธ์กฐํด์ css๋ก ์ ๊ณต๋๋ค.
- ํ ๋ง ๊ฐ์ด system์ผ ๊ฒฝ์ฐ setEvent๋ฅผ ํตํด์ ๋ฑ๋ก๋ ์ด๋ฒคํธ์์ updateBodyClass ํจ์๋ฅผ ํธ์ถํด body ํด๋์ค๋ฅผ ๋ณ๊ฒฝํ๋ค.
- ์ค์ ์ ์ฉ๋๋ ํ ๋ง๋ body์ ํด๋์ค๋ก, ๊ฐ์ ์คํ ์ด์ ref ๋ณ์๋ก ์ ์ฅ๋๋ค. ๋ ๊ฐ์ system์ผ ๊ฒฝ์ฐ ์๋ก ๋ค๋ฅด๊ฒ ์ง์ ๋ ์ ์๋ค.
์ด ์ฝ๋๋ง ๊ฐ์ง๊ณ ์๋์ผ๋ก ๋์ํ๋ฉด ์ข๊ฒ ์ง๋ง ํผ๋์๋ ํธ์ถํ์ง ์๋ ์ด์ ๋์ํ์ง ์๊ธฐ ๋๋ฌธ์...
App.vue์ ์๋ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ค.
// App.vue
<template>
<router-view />
</template>
<script setup lang="ts">
import { useThemeStore } from '@/app/stores/layoutStore.ts';
import { RouterView } from 'vue-router';
// service initialize
// ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉํ ์คํ ์ด ์ค์น.
// ๊ธ๋ก๋ฒํ๊ฒ ์ฌ์ฉํ ๋ชฉ์
// ํ
๋ง ์ด๋ฒคํธ ์ธํ
// ์ด๊ฑธ ํด์ผ ์์คํ
ํ
๋ง ๋ณ๊ฒฝ์ ์ด๋ฒคํธ ๊ฐ์ง ๊ฐ๋ฅ
const themeStore = useThemeStore();
themeStore.setEvent();
</script>
<style scoped lang="scss"></style>
'๊ฐ๋ฐ > Frontend' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[CSS] ๋คํฌ๋ชจ๋ ์๋ฒฝ ์ง์ํ๊ธฐ (0) | 2024.01.24 |
---|---|
JavaScript๋ก ์๋์ฐ ํ์๊ธฐ์ฒ๋ผ ์ ๋ ฌํ๊ธฐ (1) | 2019.10.16 |