VUE
[VUE] VUEX ์์๋ณด๊ธฐ
์๊ธ
2024. 4. 21. 21:27
๐ VUEX๋?
- ๋ฌด์ํ ๋ง์ ์ปดํฌ๋ํธ์ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ์ํ ๊ด๋ฆฌ ํจํด์ด์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- React์ Flux ํจํด์์ ๊ธฐ์ธํจ
- Vue.js ์ค๊ณ ๊ธ ๊ฐ๋ฐ์๋ก ์ฑ์ฅํ๊ธฐ ์ํ ํ์ ๊ด๋ฌธ
๐ Flux๋?
- MVC ํจํด์ ๋ณต์กํ ๋ฐ์ดํฐ ํ๋ฆ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฐ๋ฐ ํจํด - Unidirectional data flow

- action: ํ๋ฉด์์ ๋ฐ์ํ๋ ์ด๋ฒคํธ ๋๋ ์ฌ์ฉ์์ ์ ๋ ฅ
- dispatcher: ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฐฉ๋ฒ, ๋ฉ์๋
- model: ํ๋ฉด์ ํ์ํ ๋ฐ์ดํฐ
- view: ์ฌ์ฉ์์๊ฒ ๋น์ถฐ์ง๋ ํ๋ฉด
- ๋ฐ์ดํฐ์ ํ๋ฆ์ด ์ฌ๋ฌ ๊ฐ๋๋ก ๋๋์ง ์๊ณ ๋จ๋ฐฉํฅ์ผ๋ก๋ง ์ฒ๋ฆฌ

๐ Vuex๊ฐ ํ์ํ ์ด์
๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ปดํฌ๋ํธ์ ๊ฐ์๊ฐ ๋ง์์ง๋ฉด ์ปดํฌ๋ํธ ๊ฐ์ ๋ฐ์ดํฐ ์ ๋ฌ์ด ์ด๋ ค์์ง
๐ Vuex๋ก ํด๊ฒฐํ ์ ์๋ ๋ฌธ์
1. MVC ํจํด์์ ๋ฐ์ํ๋ ๊ตฌ์กฐ์ ์ค๋ฅ
2. ์ปดํฌ๋ํธ ๊ฐ ๋ฐ์ดํฐ ์ ๋ฌ ๋ช ์
3. ์ฌ๋ฌ ๊ฐ์ ์ปดํฌ๋ํธ์์ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธ ํ ๋ ๋๊ธฐํ ๋ฌธ์
๐ Vuex ์ปจ์
- State: ์ปดํฌ๋ํธ ๊ฐ์ ๊ณต์ ํ๋ ๋ฐ์ดํฐ data()
- View: ๋ฐ์ดํฐ๋ฅผ ํ์ํ๋ ํ๋ฉด template
- Action: ์ฌ์ฉ์์ ์ ๋ ฅ์ ๋ฐ๋ผ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๋ methods

๐ Vuex ๊ตฌ์กฐ
์ปดํฌ๋ํธ -> ๋น๋๊ธฐ ๋ก์ง -> ๋๊ธฐ ๋ก์ง -> ์ํ

๐ Vuex ์์ํ๊ธฐ
1๏ธโฃ src ํด๋ ๋ฐ์ store ํด๋๋ฅผ ๋ง๋ค๊ณ store.js ํ์ผ ์์ฑ
import Vue from "vue";
import Vuex from "vuex";
Vue.use(Vuex);
export const store = new Vuex.Store({});
2๏ธโฃ main.js์ ๋ถ๋ฌ์ค๊ธฐ
import Vue from "vue";
import App from "./App.vue";
import { store } from "./store/store";
new Vue({
el: "#app",
store,
render: (h) => h(App),
});
3๏ธโฃ Vuex ๊ธฐ์ ์์
- state: ์ฌ๋ฌ ์ปดํฌ๋ํธ์ ๊ณต์ ๋๋ ๋ฐ์ดํฐ data()
- getters: ์ฐ์ฐ๋ state ๊ฐ์ ์ ๊ทผํ๋ ์์ฑ computed()
- mutations: state ๊ฐ์ ๋ณ๊ฒฝํ๋ ์ด๋ฒคํธ ๋ก์ง, ๋ฉ์๋ methods
- actions: ๋น๋๊ธฐ ์ฒ๋ฆฌ ๋ก์ง์ ์ ์ธํ๋ ๋ฉ์๋ async methods
1. state๋?
์ฌ๋ฌ ์ปดํฌ๋ํธ ๊ฐ์ ๊ณต์ ํ ๋ฐ์ดํฐ - ์ํ
// Vue
data : {
message: 'Hello Vue.js!'
}
// Vuex
state : {
message: 'Hello Vue.js!'
}
<!-- Vue -->
<p> {{ message }} </p>
<!-- Vuex -->
<p> {{ this.$store.state.message }} </p>
2. getters๋?
- state ๊ฐ์ ์ ๊ทผํ๋ ์์ฑ์ด์ computed()์ฒ๋ผ ๋ฏธ๋ฆฌ ์ฐ์ฐ๋ ๊ฐ์ ์ ๊ทผํ๋ ์์ฑ
// store.js
state:{
num : 10
},
getters: {
getNumber(state) {
return state.num;
},
doubleNumber(state) {
return state.num * 2;
}
}
<p> {{ this.$store.getters.getNumber }} </p>
<p> {{ this.$store.getters.doubleNumber }} </p>