1. Vuex ์ถ๊ฐํ๊ธฐ
vue add vuex
์๋ฒ๊ฐ ์ผ์ ธ์๋ค๋ฉด ์๋ฒ๋ฅผ ์ข ๋ฃ์ํค๊ณ (VSCode ๋จ์ถํค : Ctrl + c)
ํ์ฌ ํ๋ก์ ํธ์ vuex๋ฅผ ์ถ๊ฐํ๋ค.
์ฑ๊ณต์ ์ผ๋ก ์ถ๊ฐ๋๊ณ ๋๋ฉด src ํด๋ ์๋์ store ํด๋๊ฐ ์๋ก ์๊ฒจ์๋ค.
์ด์ ํ๋ก์ ํธ์์ ์ํ๊ด๋ฆฌ๋ ์ด store๋ก ํ๋ฉด ๋๋ค!
๐ค vuex๋ ํ๋ฒ ์ ๋ฆฌํด์ผ๊ฒ ๋ค ๐ค
2. Vuex ํ์ฉํ๊ธฐ
src/store/index.js์ ๊ธฐ๋ณธ ํํ๋ ์ด๋ ๊ฒ ์๊ฒผ๋ค.
ํ์ฌ์์๋ ๊ด๋ฆฌํด์ผ ํ ์ข ๋ฅ๊ฐ ๋ง์์ ๋ฐ๋ก ๋ชจ๋๋ก ๋นผ์
index.js๋ฅผ ํตํด ๊ด๋ฆฌํ๋ ๋ฐฉ์์ผ๋ก ์งํ์ค์ด์ง๋ง,
์ง๊ธ์ ๊ด๋ฆฌ ํ ๋ฐ์ดํฐ ์ข ๋ฅ๊ฐ ๋ง์ง์์ผ๋ ํ๊ณณ์์ ๊ด๋ฆฌํ๋๋ก ํ๋ค.
// index.js state
state: {
todos: [
{
id: 1,
title: 'One'
},
{
id: 2,
title: 'Two'
},
{
id: 3,
title: 'Three'
}
]
}
state์ ๋ฏธ๋ฆฌ ๋ด๊ฒจ์์ 3๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๊ณ ,
// index.js getters, mutations, actions
getters: {
allTodos: (state) => state.todos,
},
mutations: {
mutationsAddTodo(state, todo) {
state.todos.push(todo);
console.log(state.todos);
}
},
actions: {
actionsAddTodo({commit}, todo) {
commit('mutationsAddTodo', todo);
}
}
getters
์๋ state์ ์ ์ฅ๋ ๋ชจ๋ todos๋ฅผ ๊ฐ์ ธ์ฌ allTodos๋ฅผ ์์ฑํ๋ค.
mutations
์๋ actions์์ ๋์ด์จ ๋ฐ์ดํฐ๋ฅผ state์ pushํ mutationsAddTodo๋ฅผ ์์ฑํ๋ค.
actions
์๋ vue ์์ค์์ ์ด๊ฑฐ ์ ์ฅ์์ผ!ํ๊ณ ํธ์ถ๋ actionsAddTodo๋ฅผ ์์ฑํ๋ค.
commit('mutationsAddTodo', todo)๋ฅผ ์คํํ๋ฉด mutations์ ํด๋น ์ด๋ฆ์ ํจ์๋ฅผ ์คํ์ํจ๋ค.
- mutations์๋ ์์ฐจ์ ์ธ ๋ก์ง์ ์์ฑํ๊ณ ,
actions์๋ ๋น์์ฐจ์ ๋๋ ๋น๋๊ธฐ ์ฒ๋ฆฌ ๋ก์ง์ ์์ฑํ๋ค.
์ด ๋ถ๋ถ๋ vuex ์ ๋ฆฌํ๋ฉด์ ๋ค๋ฃฐ ์์ !
ํจ์ ์์ mutations์ actions๋ ์์๋ณด๊ธฐ ์ฝ๊ฒ ๋ถ์ฌ๋์๊ฒ์ด๋ฏ๋ก ์๋ตํด๋ ๋ฌด๋ฐฉํ๋ค.
<!-- src/components/TodoInput.vue -->
<template>
<v-container fluid>
<v-row class="mt-6" justify="center">
<v-col cols="4">
<v-text-field outlined></v-text-field>
</v-col>
<v-col cols="1">
<v-btn @click="actionsAddTodo('12345')" block x-large color="primary">Add</v-btn>
</v-col>
</v-row>
</v-container>
</template>
<script>
import { mapActions } from 'vuex';
export default {
methods: {
...mapActions(['actionsAddTodo'])
},
}
</script>
TodoInput์ vuex์ actions๋ฅผ import ์ํค๋ฉด ...mapActions
๋ผ๋ ์ด๋ฆ์ผ๋ก ํธ์ถํ ์ ์๋ค.
import ์ํค์ง ์๋๋ผ๋ this.$store.dispatch('actionsAddTodo')
๋ก ํธ์ถ ๊ฐ๋ฅํ๋ค.
vue → store actions ํธ์ถ : dispatch
actions → mutations ํธ์ถ : commit
Add ๋ฒํผ์ ๋๋ฅด๋ฉด actionsAddTodo๋ฅผ '12345'๋ผ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด์ ์คํ์ํจ๋ค.
mutatilnsAddTodo์์ state todos์ push ์ํค๊ณ state์ todos๋ฅผ ์ฝ์๋ก ์ฐ์ด๋ณด๋ฉด
๊ฐ์ด ๋๊ฒจ์คฌ๋ 12345๊ฐ ๋ด๊ฒจ์๋๊ฒ์ ํ์ธํ ์ ์๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด์ ์ค์ ๋ก ์ฌ์ฉ์๊ฐ text-field
์์ ์ ์ ๊ฐ์ ๋๊ฒจ๋ด
์๋ค ๐
<!-- src/components/TodoInput.vue -->
<script>
import { mapActions } from 'vuex';
export default {
data() {
return {
todoText: ''
}
},
methods: {
...mapActions(['actionsAddTodo'])
},
}
</script>
๋จผ์ TodoInput script์ ์ฌ์ฉ์ ์ ๋ ฅ๊ฐ์ ๋ฐ์ ๋น todoText๋ฅผ ๋ง๋ค์ด์ค๋ค.
<!-- src/components/TodoInput.vue -->
<template>
<v-container fluid>
<v-row class="mt-6" justify="center">
<v-col cols="4">
<v-text-field v-model="todoText" outlined></v-text-field>
</v-col>
<v-col cols="1">
<v-btn @click="actionsAddTodo(todoText)" block x-large color="primary">Add</v-btn>
</v-col>
</v-row>
</v-container>
</template>
๊ทธ๋ฆฌ๊ณ ํ
์คํธ ํ๋ ํ๊ทธ์ v-model
์ todoText๋ฅผ ๋ฃ์ด์ค๋ค!
๊ทธ๋ฌ๋ฉด ํ ์คํธ ํ๋๊ฐ todoText๋ฅผ ๋ฐ๋ผ๋ณด๊ฒ ๋๊ณ ,
๊ทธ ๊ฐ์ ๋ฒํผ์ ๋๋ฅด๊ณ actionsAddTodo๊ฐ ์คํ๋ ๋ ๊ฐ์ด ๋๊ฒจ์ค๋ค.
๋ฐ์ดํฐ ์ ๋ ฅ ํ ๋ฒํผ์ ๋๋ฅด๊ณ ์ฝ์์ ์ฐํ ๊ฐ์ ํ์ธํด๋ณด๋ฉด ์ ๋์ด์จ๋ค!
3. UUID๋ก ID ๋ถ์ฌํ๊ธฐ
npm i --save uuid
์ฌ์ฉ์๊ฐ ์ ๋ ฅํ๋ todoText๋ store์์ title๋ก ๊ด๋ฆฌ๋ ๊ฒ์ด๊ณ ,
ID์๋ ๊ณ ์ ํ key๊ฐ์ ๋ฃ๊ธฐ ์ํด์ UUID๋ฅผ ์ค์นํ๋ค.
<!-- src/components/TodoInput.vue -->
<template>
<v-container fluid>
<v-row class="mt-6" justify="center">
<v-col cols="4">
<v-text-field v-model="todoText" outlined></v-text-field>
</v-col>
<v-col cols="1">
<v-btn @click="addTodo" block x-large color="primary">Add</v-btn>
</v-col>
</v-row>
</v-container>
</template>
<script>
import { mapActions } from 'vuex';
import { v1 } from 'uuid';
export default {
data() {
return {
todoText: ''
}
},
methods: {
...mapActions(['actionsAddTodo']),
addTodo() {
this.actionsAddTodo({
id: v1(),
title: this.todoText
});
}
},
}
</script>
uuid๋ฅผ import ์์ผ์ฃผ๊ณ , addTodo()
๋ผ๋ ํจ์๋ฅผ ๋ง๋ค์ด์,
actionsAddTodo๋ฅผ ์คํํ ๋ id์ title์ ๋ฃ์ด์ ๋ณด๋ด์ฃผ๊ฒ ์์ฑํ๋ค.
๋ฒํผ ํด๋ฆญ์์๋ addTodo๊ฐ ์คํ๋๊ฒ ์์ ํด์ค๋ค.
test1์ด๋ผ๋ ๊ฐ์ ๊ฐ์ ๋๋ฒ ๋๊ฒจ์คฌ์ง๋ง id๋ ๊ณ ์ ํ๊ฒ ๋ถ์ฌ๋๊ธฐ ๋๋ฌธ์
๋งค๋ฒ ๋ค๋ฅธ id๊ฐ ๋์ด๊ฐ๋๊ฒ์ ํ์ธํ ์ ์๋ค.
4. Text Field ์ด๊ธฐํ ๋ฐ TodoList, TodoItem ์์
๊ธฐ์กด์๋ Add ๋ฒํผ์ ๋๋ฌ์ ๋ฐ์ดํฐ๊ฐ ๋์ด๊ฐ์ง๋ง ํ ์คํธ ํ๋์ ๋ฐ์ดํฐ๊ฐ ๊ทธ๋๋ก ๋จ์์๋ ์ํ์๋ค.
ํ์ง๋ง Add ๋ฒํผ์ ๋๋ฅด๋ฉด store์ ์ ์ฅ์ด ๋๊ธฐ๋๋ฌธ์, ํ ์คํธ ํ๋์ ๋ฐ์ดํฐ๋ฅผ ์ด๊ธฐํ ์์ผ์ค ๊ฑฐ๋ค!
<!-- src/components/TodoInput.vue -->
<v-text-field @change="todoTextChg" :value="todoText" outlined></v-text-field>
๋จผ์ TodoInput.vue์ ์๋ ํ ์คํธ ํ๋ ์์ฑ์ ์ข ๋ฐ๊ฟ์ค๋ค.
@change="todoTextChg"
์์ฑ์ ์ถ๊ฐํด์ ํ
์คํธ ํ๋์ ๊ฐ์ด ๋ฐ๋๋๋ง๋ค todoTextChg
๋ฅผ ์คํ์ํค๋๋ก ํ๋ค.
// src/components/TodoInput.vue
methods: {
...mapActions(['actionsAddTodo']),
todoTextChg(e) {
this.todoText = e;
},
addTodo() {
this.actionsAddTodo({
id: v1(),
title: this.todoText
});
this.todoText = '';
}
},
methods์ todoTextChg
ํจ์๋ฅผ ํ๋ ๋ง๋ค๊ณ todoText ๊ฐ์ e๋ก ๋ฐ๊ฟ์ค๋ค.
๊ทธ๋ฆฌ๊ณ addTodo๊ฐ ์คํ๋ ๋ actionsAddTodo๊ฐ ์คํ๋๊ณ ๋์ todoText๊ฐ์ ๋น๊ฐ์ผ๋ก ๋ฐ๊ฟ์ฃผ๋ฉด
abcd๋ผ๋ ๊ฐ์ ์ ๋ ฅํ๊ณ Add ๋ฒํผ์ ๋๋ฅด๋ฉด
์ฝ์์ ์ฐํ ๋ฐ์ดํฐ์ abcd๊ฐ ์ฐํ์๊ณ
ํ ์คํธ ํ๋๋ ๊ฐ์ด ์ด๊ธฐํ๊ฐ ๋๋ค.
์ด์ ๊ธฐ์กด์ TodoList.vue์์ ํ๋์ฝ๋ฉ์ผ๋ก ๋ฃ์ด๋จ๋ ๋ฐ์ดํฐ๋ฅผ
store getters allTodos
๋ฅผ ํตํด ๊ฐ์ ธ์์ ๋ฃ์ด์ค๊ฑฐ๋ค.
<!-- src/components/TodoList.vue ๋ณ๊ฒฝ ์ -->
<template>
<v-container>
<TodoItem/>
<TodoItem/>
<TodoItem/>
</v-container>
</template>
<script>
import TodoItem from '@/components/TodoItem';
export default {
components: {
TodoItem
}
}
</script>
<!-- src/components/TodoList.vue ๋ณ๊ฒฝ ํ -->
<template>
<v-container>
<v-row v-for="todo in allTodos"
:key="todo.id"
>
<TodoItem :todo='todo'/>
</v-row>
</v-container>
</template>
<script>
import TodoItem from '@/components/TodoItem';
import { mapGetters } from 'vuex';
export default {
components: {
TodoItem
},
computed: {
...mapGetters(['allTodos'])
},
}
</script>
v-container
์์ v-row
๋ฅผ ๋ฃ์ด์ฃผ๊ณ , mapGetters
๋ก ๋ถ๋ฌ์จ allTodos์ ์๋งํผ for๋ฌธ์ ๋๋ฆฐ๋ค.
allTodos์ ์๋งํผ TodoItem์ด ๋์ฌ๊ฑฐ๊ณ , ์์ ์ปดํฌ๋ํธ์ธ TodoItem์ todo๋ฅผ ๋ฃ์ด์ค๋ค.
<!-- src/components/TodoItem.vue -->
<template>
<v-container fluid>
<v-row class="mb-3" justify="center" align="center">
<v-col cols="4">
{{ todo.title }}
</v-col>
<v-col cols="1">
<v-btn block color="primary">Edit</v-btn>
</v-col>
<v-col cols="1">
<v-btn block color="error">Delete</v-btn>
</v-col>
</v-row>
</v-container>
</template>
<script>
export default {
props: {
todo: {}
}
}
</script>
TodoItem์ props
๋ฅผ ๋ง๋ค์ด์ค์ ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ๋ฐ์ ๊ฐ์ธ todo๋ฅผ ์ ์ธํด๋๋ค.
{{ todo.title }}
์ ์ ์ด๋๋ฉด ๋ถ๋ชจ์๊ฒ ๋ฐ์ todo์ title์ ์ถ๋ ฅํ ์ ์๊ฒ ๋๋ค.
5. ๊ฒฐ๊ณผ ๐คฃ
store index.js์ ์ฒ์ ์ ์ด๋ One Two Three๊ฐ ๋จผ์ ๋์ค๊ณ ,
์ ๋ ฅํ Four Five๋ ์ Add ๋๋ค.
์ญ์ ๊ธฐ๋ฅ์ ๋ค์ ๊ธ์์ ๐
'Frontend > Vue.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Vue.js] Vue2 vs Vue3 ๋ณํ๋ ์ (0) | 2022.07.20 |
---|---|
[Vue.js - Vuex] Todo List ๋ง๋ค๊ธฐ โข (0) | 2022.06.08 |
[Vue.js - Vuex] Todo List ๋ง๋ค๊ธฐ โ (0) | 2022.06.01 |
[Vue.js - Vuetify] Vuetify ์ถ๊ฐํ๊ธฐ ๐ (0) | 2022.05.29 |