Vuex
State Management
State Management(์ํ ๊ด๋ฆฌ) ๊ฐ์
โ ์ํ(state): ํ์ฌ์ ๋ํ ์ ๋ณด(data)
โ Web Application์ ์ํ: ํ์ฌ App์ด ๊ฐ์ง๊ณ ์๋ data
โ ๊ฐ component๋ ๋
๋ฆฝ์ ์ด๊ธฐ ๋๋ฌธ์ ๊ฐ๊ฐ์ ์ํ(data๋ฅผ ๊ฐ์ง๋ค)
โ ํ์ง๋ง ๊ฒฐ๊ตญ component๋ค์ด ๋ชจ์ฌ ํ๋์ App์ ๊ตฌ์ฑํ๋ฏ๋ก ์ฌ๋ฌ ๊ฐ์ component๊ฐ ๊ฐ์ ์ํ(data)๋ฅผ ์ ์งํด์ผ ํ๋ค!
Pass Props & Emit Event
โ ๋ฐ์ดํฐ์ ํ๋ฆ์ ์ง๊ด์ ์ผ๋ก ํ์
๊ฐ๋ฅํ๋ค
โ ๊ทธ๋ฌ๋ component์ ์ค์ฒฉ์ด ๊น์ด์ง๋ฉด ๋ฐ์ดํฐ์ ์ ๋ฌ์ด ์ด๋ ค์์ง๋ค๋ ๋จ์
Centralized Store
โ ์ค์ ์ ์ฅ์(store)์ ๋ฐ์ดํฐ๋ฅผ ๋ชจ์์ ์ํ ๊ด๋ฆฌ
โ component์ ๊ณ์ธต์ ์๊ด์์ด ์ค์ ์ ์ฅ์์ ์ ๊ทผํด์ ๋ฐ์ดํฐ๋ฅผ ์ป๊ฑฐ๋ ๋ณ๊ฒฝ ๊ฐ๋ฅ
โ ์ค์ ์ ์ฅ์์ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๊ฐ๊ฐ์ component๋ ํด๋น ๋ฐ์ดํฐ์ ๋ณํ์ ๋ฐ์ํ์ฌ ์๋ก ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์
โ ๊ท๋ชจ๊ฐ ํฌ๊ฑฐ๋ ์ปดํฌ๋ํธ ์ค์ฒฉ์ด ๊น์ ํ๋ก์ ํธ์ ๊ด๋ฆฌ๊ฐ ๋งค์ฐ ํธ๋ฆฌ
Vuex ์์ํ๊ธฐ
ํ๋ก์ ํธ ์์ํ๊ธฐ
$ vue create vuex-app
$ cd vuex-app
$ vue add vuex
index.js
import Vue from "vue";
import Vuex from "vuex";
Vue.use(Vuex);
export default new Vuex.Store({
// ๊ธฐ์กด vue instance์ data
state: {},
// ๊ธฐ์กด vue instance์ computed
getters: {},
// ๊ธฐ์กด vue instance์ methods
mutations: {},
actions: {},
modules: {},
});
1. state
โ vue ์ธ์คํด์ค์ data์ ํด๋น
โ ์ค์์์ ๊ด๋ฆฌํ๋ ๋ชจ๋ ์ํ ์ ๋ณด
โ state์ ๋ฐ์ดํฐ๊ฐ ๋ณํํ๋ฉด ํด๋น ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๋ component๋ ์๋์ผ๋ก ๋ค์ ๋ ๋๋ง
โ $store.state
๋ก state ๋ฐ์ดํฐ์ ์ ๊ทผ
2. mutations
โ ์ค์ ๋ก state๋ฅผ ๋ณ๊ฒฝํ๋ ์ ์ผํ ๋ฐฉ๋ฒ
โ Mutations์์ ํธ์ถ๋๋ ํธ๋ค๋ฌ ํจ์๋ ๋ฐ๋์ ๋๊ธฐ์ ์ด์ด์ผํจ
- ๋น๋๊ธฐ ๋ก์ง์ผ๋ก mutations๋ฅผ ์ฌ์ฉํด์ state๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒฝ์ฐ, state์ ๋ณํ๋ฅผ ์๊ธฐ๋ฅผ ํน์ ํ ์ ์๋ค!
โ ์ฒซ๋ฒ์งธ ์ธ์๋ก state๋ฅผ ๋ฐ์ผ๋ฉฐ, component ํน์ Actions์์ commit()
๋ฉ์๋๋ก ํธ์ถ๋๋ค
3. Actions
โ mutations์ ๋น์ทํ์ง๋ง ๋น๋๊ธฐ ์์
์ ํฌํจํ ์ ์๋ค๋ ์ฐจ์ด๊ฐ ์์
โ state๋ฅผ ์ง์ ๋ณ๊ฒฝํ์ง ์๊ณ commit() ๋ฉ์๋๋ก mutations๋ฅผ ํธ์ถํด์ state๋ฅผ ๋ณ๊ฒฝ
โ context
๊ฐ์ฒด๋ฅผ ์ธ์๋ก ๋ฐ์ผ๋ฉฐ, ์ด ๊ฐ์ฒด๋ฅผ ํตํด store.js์ ๋ชจ๋ ์์์ ๋ฉ์๋์ ์ ๊ทผํ ์ ์๋ค (stated๋ ์ง์ ๋ณ๊ฒฝ ๊ฐ๋ฅํ์ง๋ง ๋ณ๊ฒฝ ํ๋ฉด ์๋๋ค!)
โ component์์ dispatch()
๋ฉ์๋์ ์ํด ํธ์ถ
Mutations & Actions
โ Mutations: state๋ฅผ ๋ณ๊ฒฝ
โ Actions: state ๋ณ๊ฒฝ์ ์ ์ธํ ๋๋จธ์ง ๋ก์ง
4. Getters
โ vue ์ธ์คํด์ค์ computed์ ํด๋น
โ state๋ฅผ ํ์ฉํ์ฌ ๊ณ์ฐ๋ ๊ฐ์ ์ป๊ณ ์ ํ ๋ ์ฌ์ฉ
โ computed์ ๋ง์ฐฌ๊ฐ์ง๋ก getters์ ๊ฒฐ๊ณผ๋ ์บ์(cache)๋๋ฉฐ, ์ข
์๋ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ์๋ง ์ฌ๊ณ์ฐ๋๋ค.
โ getters์์ ๊ณ์ฐ๋ ๊ฐ์ state์ ์ํฅ x
โ ์ฒซ๋ฒ์งธ ์ธ์๋ก state, ๋๋ฒ์งธ ์ธ์๋ก getter
๊ทธ๋ ๋ค๋ฉด ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ Vuex์์ ๊ด๋ฆฌํ ๊น?
โ Vuex์์๋ ์ฌ์ ํ pass props, emit event๋ฅผ ์ฌ์ฉํ์ฌ ์ํ ๊ด๋ฆฌ ํ ์ ์์
โ ๊ฐ๋ฐ ํ๊ฒฝ์ ๋ฐ๋ผ ์ ์ ํ๊ฒ ์ฌ์ฉํ๋ ๊ฒ์ด ์ค์
์ ๋ฆฌ
โ component์์ ๋ฐ์ดํฐ๋ฅผ ์กฐ์ํ๊ธฐ ์ํ ๋ฐ์ดํฐ์ ํ๋ฆ
- component => (actions) => mutations => state
โ component์์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ๋ฐ์ดํฐ์ ํ๋ฆ
- state => (getters) => component
Vuex ์ค์ต
๊ฐ์ฒด ์ถ์ฝํ ๋ฉ์๋ ์ฌ์ฉ
// before
const obj1 = {
addValue: function (value) {
return value;
},
};
// after
const obj2 = {
addValue(value) {
return value;
},
};
state
// store/index.js
import Vue from "vue";
import Vuex from "vuex";
Vue.use(Vuex);
export default new Vuex.Store({
state: {
message: "message in store",
},
getters: {},
mutations: {},
actions: {},
modules: {},
});
// App.vue
<template>
<div id="app">
<h1>{{ $store.state.message }}</h1>
</div>
</template>
โ $store.state
๋ก ๋ฐ๋ก ์ ๊ทผ ๊ฐ๋ฅ! ๊ทธ๋ฌ๋...
<template>
<div id="app">
<h1>{{ message }}</h1>
</div>
</template>
<script>
export default {
name: "App",
components: {},
computed: {
message() {
return this.$store.state.message;
},
},
};
</script>
โ computed์ ์ ์ ํ ์ ๊ทผํ๋ ๊ฒ์ ๊ถ์ฅ
actions
// App.vue
<template>
<div id="app">
<h1>{{ message }}</h1>
<input type="text" @keyup.enter="changeMessage" v-model="inputData" />
</div>
</template>
<script>
export default {
name: "App",
data() {
return {
inputData: null,
};
},
computed: {
message() {
return this.$store.state.message;
},
},
methods: {
changeMessage() {
const newMessage = this.inputData;
// action ํธ์ถ
this.$store.dispatch("changeMessage", newMessage);
},
},
};
</script>
โ state๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ mutations ํธ์ถ
โ component์์ dispatch()
์ ์ํด ํธ์ถ๋จ
โ dispatch(ํธ์ถํ๊ณ ์ ํ๋ actions ํจ์, ๋๊ฒจ์ค Data)
// store/index.js
import Vue from "vue";
import Vuex from "vuex";
Vue.use(Vuex);
export default new Vuex.Store({
state: {
message: "message in store",
},
getters: {},
mutations: {},
actions: {
changeMessage(context, newMessage) {
console.log(context);
console.log(newMessage);
},
},
modules: {},
});
โ actions์ ์ฒซ ๋ฒ์งธ ์ธ์๋ context
- context๋ store์ ์ ๋ฐ์ ์ธ ์์ฑ์ ๋ชจ๋ ๊ฐ์ง๊ณ ์์ผ๋ฏ๋ก context.state์ context.getters๋ฅผ ํตํด mutations๋ฅผ ํธ์ถํ๋ ๊ฒ์ด ๊ฐ๋ฅ
- ๋จ, actions์์ state๋ฅผ ์ง์ ์กฐ์ x
โ actions์ ๋ ๋ฒ์งธ ์ธ์๋ payload
- ๋๊ฒจ์ค ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ ์ฌ์ฉ
mutations
// store/index.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
message: 'message in store'
},
getters: {
},
mutations: {
// ๋ง์ง๋ง์ ์ง์ ์ ์ผ๋ก state๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ๋๋ฌธ์๋ช
์์ ์ผ๋ก ๊ตฌ๋ถํ๊ธฐ ์ํด ์์ ํํ๋ก ์ด๋ฆ ์์ฑ
CHANGE_MESSAGE(state, newMessage) {
// console.log(state)
// console.log(newMessage)
// state ์กฐ์
state.message = newMessage
}
},
actions: {
changeMessage(context, newMessage) {
// console.log(context)
// console.log(newMessage)
// mutation ํธ์ถ
context.commit('CHANGE_MESSAGE', newMessage)
}
},
modules: {
}
})
โ actions์์ commit()
์ด์ฉํด mutations ํธ์ถ
โ commit(A, B)
- A: ํธ์ถํ๊ณ ์ ํ๋ mutations ํจ์
- B: payload
getters
// store/index.js
export default new Vuex.Store({
...
getters: {
messageLength(state) {
return state.message.length
}
},
...
})
โ state๋ฅผ ํ์ฉํ ์๋ก์ด ๋ณ์
โ ์ฒซ๋ฒ์งธ ์ธ์๋ state,๋๋ฒ์งธ ์ธ์๋ getters(์ ํ)
// App.vue
<template>
<div id="app">
<h1>{{ message }}</h1>
<h2>๋ฌธ์์ ๊ธธ์ด๋ {{ messageLength }}</h2>
<input type="text" @keyup.enter="changeMessage" v-model="inputData" />
</div>
</template>
<script>
export default {
...
computed: {
message() {
return this.$store.state.message;
},
// getters ๋ถ๋ฌ์ค๊ธฐ
messageLength() {
return this.$store.getters.messageLength
}
},
...
};
</script>
'โญ Personal_Study > Vue' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Vuex ํ์ฉํด Todo SPA ์ฑ ๋ง๋ค๊ธฐ (0) | 2022.11.15 |
---|---|
Lifecycle Hooks (0) | 2022.11.14 |
Emit Event (0) | 2022.11.13 |
Pass Props (0) | 2022.11.12 |
Vue Component (0) | 2022.11.11 |
๋๊ธ