Todo: Local Storage
Local Storage ๊ฐ์
โ ๋ธ๋ผ์ฐ์ ์ Local Storage์ todo ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ์ฌ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ข ๋ฃํ๊ณ ๋ค์ ์คํํด๋ ๋ฐ์ดํฐ๊ฐ ๋ณด์กด๋ ์ ์๋๋ก ํ๊ธฐ
Window.localStorage
โ ๋ธ๋ผ์ฐ์ ์์ ์ ๊ณตํ๋ ์ ์ฅ๊ณต๊ฐ ์ค ํ๋์ธ Local Storage์ ๊ด๋ จ๋ ์์ฑ
โ ๋ง๋ฃ๋์ง ์์ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ข
๋ฃํ๊ณ ๋ค์ ์คํํด๋ ๋ฐ์ดํฐ๊ฐ ๋ณด์กด๋๋ค.
โ ๋ฐ์ดํฐ ๋ฌธ์์ด ํํ๋ก ์ ์ฅ
โ ๊ด๋ จ ๋ฉ์๋
setItem(key, value)
: key, value ํํ๋ก ๋ฐ์ดํฐ ์ ์ฅgetItem(key)
: key์ ํด๋นํ๋ ๋ฐ์ดํฐ ์กฐํ
Local Storage ์ค์ต
- ์ค์ต
// index.js
export default new Vuex.Store({
...
actions: {
...
saveTodosToLocalStorage(context) {
const jsonTodos = JSON.stringify(context.state.todos)
localStorage.setItem('todos', jsonTodos)
}
},
modules: {},
});
โ ๋ฐ์ดํฐ๊ฐ ๋ฌธ์์ด ํํ๋ก ์ ์ฅ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ JSON.stringify
๋ฅผ ์ฌ์ฉํด ๋ฌธ์์ด ํํ๋ก ๋ณํํด์ฃผ๋ ๊ณผ์ ํ์
โ state๋ฅผ ๋ณ๊ฒฝํ๋ ์์
์ด ์๋๊ธฐ ๋๋ฌธ์ mutations์ด ์๋ actions์ ์์ฑ
- ์ค์ต
// index.js
export default new Vuex.Store({
...
actions: {
createTodo(context, todoTitle) {
// Todo ๊ฐ์ฒด ๋ง๋ค๊ธฐ
const todoItem = {
title: todoTitle,
isCompleted: false,
};
// console.log(todoItem)
context.commit('CREATE_TODO', todoItem)
context.dispatch('saveTodosToLocalStorage')
},
// ์ด ๊ฒฝ์ฐ๋ ์๋ตํ๊ณ ๋ฐ๋ก mutations ํธ์ถ ๊ฐ๋ฅ
deleteTodo(context, todoItem) {
context.commit('DELETE_TODO', todoItem)
context.dispatch('saveTodosToLocalStorage')
},
updateTodoStatus(context, todoItem) {
context.commit('UPDATE_TODO_STATUS', todoItem)
context.dispatch('saveTodosToLocalStorage')
},
saveTodosToLocalStorage(context) {
const jsonTodos = JSON.stringify(context.state.todos)
localStorage.setItem('todos', jsonTodos)
}
},
modules: {},
});
โ todo ์์ฑ, ์ญ์ , ์์ ์์ ๋ชจ๋ saveTodosToLocalStorage
action ๋ฉ์๋๊ฐ ์คํ๋๋๋ก ํจ
- ์ค์ต
โ local storage์ ์ ์ฅ๋ ๊ฒ ํ์ธ
- ์ค์ต
โ ์์ง Local Storage์ ์๋ todo๋ชฉ๋ก์ ๋ถ๋ฌ์จ ๊ฒ์ด ์๋๊ธฐ ๋๋ฌธ์ ๋ถ๋ฌ์ค๊ธฐ ๋ฒํผ์ ํตํด ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋๋ก ํด์ผ ํ๋ค.
- ๋ถ๋ฌ์ค๊ธฐ ๋ฒํผ ์์ฑ
// App.vue
<template>
<div id="app">
<h1>Todo List</h1>
<h2>All Todos: {{ allTodosCount }}</h2>
<h2>Completed Todo: {{ completedTodosCount }}</h2>
<h2>unCompleted Todo: {{ unCompletedTodosCount }}</h2>
<TodoList/>
<TodoForm/>
<button @click="loadTodos">Todo ๋ถ๋ฌ์ค๊ธฐ</button>
</div>
</template>
loadTodos
๋ฉ์๋ ์์ฑ
// App.vue
<script>
import TodoForm from './components/TodoForm.vue'
import TodoList from './components/TodoList.vue'
export default {
name: 'App',
components: {
TodoList,
TodoForm
},
methods: {
loadTodos() {
this.$store.dispatch('loadTodos')
}
},
...
}
loadTodos
actions ๋ฉ์๋ ์์ฑ
// index.js
export default new Vuex.Store({
...
actions: {
...
loadTodos(context) {
context.commit('LOAD_TODOS')
}
},
modules: {},
});
LOAD_TODOS
mutation ๋ฉ์๋ ์์ฑ
// index.js
export default new Vuex.Store({
...
LOAD_TODOS(state) {
const localStorageTodos = localStorage.getItem('todos')
const parsedTodos = JSON.parse(localStorageTodos)
state.todos = parsedTodos
}
}),
โ ๋ฌธ์์ด ๋ฐ์ดํฐ๋ฅผ ๋ค์ object ํ์
์ผ๋ก ๋ณํ (JSON.parse
)ํ์ฌ ์ ์ฅ
- ๋์ํ์ธ
vuex-persistedstate
๊ฐ์
โ Vuex state๋ฅผ ์๋์ผ๋ก ๋ธ๋ผ์ฐ์ ์ Local Storage์ ์ ์ฅํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค ํ๋
โ ํ์ด์ง๊ฐ ์๋ก๊ณ ์นจ ๋์ด๋ Vuex state๋ฅผ ์ ์ง ์ํจ๋ค
โ Local Storage์ ์ ์ฅ๋ data๋ฅผ ์๋์ผ๋ก state๋ก ๋ถ๋ฌ์จ๋ค
์ค์น ๋ฐ ์ ์ฉ
$ npm i vuex-persistedstate
// index.js
...
import createPersistedState from 'vuex-persistedstate'
Vue.use(Vuex);
export default new Vuex.Store({
plugins: [
createPersistedState(),
],
...
})
โ ์ด์ ์ ์์ฑํ local storage ๊ด๋ จ ์ฝ๋ ์ฃผ์ ์ฒ๋ฆฌ
Vuex when, how
mutations๋ง์ผ๋ก state ๋ณ๊ฒฝํ๊ธฐ?
โ ๊ฐ๋ฅ์ ํ๋ ์ ์ฅ์์ ๊ฐ ์ปจ์ (state, getters, mutations, actions)์ ๊ฐ์์ ์ญํ ์ด ์กด์ฌํ๋๋ก ์ค๊ณ ๋์ด ์๋ค.
โ todo app์ฒ๋ผ actios์ ๋ก์ง์ด ํน๋ณํ ์์ ์์ด ๋จ์ํ mutations๋ง์ ํธ์ถํ๋ ๊ฒฝ์ฐ๋ ์์ผ๋, ์ด๋ฌํ ๊ฒฝ์ฐ๋ Vuex ๋์ ์ ์ ์ ์ฑ ํ๋จ ํ์
์ธ์ Vuex๋ฅผ ์ฌ์ฉํด์ผ ํ ๊น?
โ Vuex๋ ๊ณต์ ์ํ ๊ด๋ฆฌ ์ฒ๋ฆฌ์ ์ ์ฉํ์ง๋ง, ๊ฐ๋
์ ๋ํ ์ดํด์ ์์ ๋น์ฉ์ด ํฌ๋ค!!
โ ๋จ์ํ ์ ํ๋ฆฌ์ผ์ด์
๊ฐ์ ๊ฒฝ์ฐ์๋ Vuex ์์ด ํ๋ ๊ฒ์ด ๋ ํจ์จ์ ์ผ ์ ์์
โ ์ค๋ํ ๊ท๋ชจ์ SPA ๊ตฌ์ถ ์ ์์ฐ์ค๋ฝ๊ฒ ์ ํ
โ ํ์ํ ์๊ฐ ์ญํ ์ ๋ง๊ฒ ์ ์ ํ๊ฒ ํ์ฉํ๋ ๊ฒ์ด ์ค์
'โญ Personal_Study > Vue' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Vue Router (0) | 2022.11.18 |
---|---|
UX & UI (0) | 2022.11.18 |
Vuex ํ์ฉํด Todo SPA ์ฑ ๋ง๋ค๊ธฐ (0) | 2022.11.15 |
Lifecycle Hooks (0) | 2022.11.14 |
Vuex (0) | 2022.11.14 |
๋๊ธ