component에서 state를 변경하는 것도 기본적으로는 자유롭게 허용하는 편이다. 특히 반응형 값은 화면에서 v-model로 등록해서 사용 가능하다.
todoStore.todos.push({ id: new Date().getTime(), text: newTodo.value, isDone: false })
<selectv-model="todoStore.key"><option:value="key"v-for="key in todoStore.keys":key="key">{{ key }}</option></select>
또는 store의 내장 함수인 $patch()를 이용할 수 있는데 $patch에는 간단히객체 형으로 값을 전달할 수도 있고 복잡한 처리가 필요한 경우함수 형태로 전달할 수도 있다.
// 간단한 것은 객체 형태로 처리
todoStore.$patch({
key: 'some'
})
// 복잡한 경우는 state를 파라미터로 받는 함수를 전달 받아서 처리
todoStore.$patch((state) => {
state.todos.push({ id: newDate().getTime(), text: newTodo.value, isDone: false })
})
하지만 이렇게 개별 컴포넌트에서 전역 데이터를 제약 없이 직접 수정하기 보다는 뒤에 action을 이용해서 일관성 있게 수정하는 것이 안정적이다.
action
action이란 store에서 state를 변경시키는 역할을 수행하는 함수로 composition 방식에서는 일반 function으로 작성하면 된다. 여기서는 동기 작업은 물로 비동기도 문제없이 작성할 수 있다.
다음은 전달받은 todo를 저장하거나 전달받은 id에 해당하는 todo를 삭제하는 action이다.
<trv-for="(todo, id) in filteredTodosWithParam(param)":key="id">
. . .
</tr>
다른 getters 사용
composition 형태를 사용하면 다른 getters를 사용하는 것도 매우 쉽다. 그냥 부르면 되니까? ㅎ
심지어 다른 store에서 작성된 getters를 사용하는 것도 물 흐르는것 처럼 자유롭다. 물론 다른 store의 state 도 가져올 수 있다. 이때 주의할 점은 store는 외부에 reactive 객체로 노출된다는 점을 잊지 말자. 언제나 반응성에 대한 주의가 필요하다. 외우지 말고 그냥 출력해보자.
// counter.js 내용 일부 const count = ref(0)
const user = reactive({"name":"hong"});
const doubleCount = computed(() => count.value * 2)
// 다른 store를 사용하고 싶다면?import {useCounterStore} from'@/stores/counter.js'const fromOther = computed(()=> {
const counterStore = useCounterStore(); // reactiveconsole.log("counterstore count(ref): ",counterStore.count) // 단순 값console.log("counterstore user(reactive): ",counterStore.user) // proxyreturn counterStore.doubleCount});
화면에서의 활용
다음은 store를 화면단에서 사용한 예이다.
<template><divclass="left"><table><tr><th>no</th><th>text</th><th>done</th><th>삭제</th></tr><trv-for="(todo, id) in todoStore.filteredTodo":key="id"><td>{{ todo.id }}</td><td>{{ todo.text }}</td><td><inputtype="checkbox"v-model="todo.isDone" /></td><td><button @click="todoStore.deleteTodo(todo.id)">삭제</button></td></tr></table></div></template>
<template><divclass="right"><label>새 할일: <inputv-model="newTodo" /></label><button @click="todoStore.insertTodo(newTodo)">등록</button><hr /><label>처리할 일 개수: {{ todoStore.needTodoCnt }}</label><hr /><label>상태별 필터링:</label><selectv-model="todoStore.key"><option:value="key"v-for="key in todoStore.keys":key="key">{{ key }}</option></select></div></template>