[Firebase] onShapshot을 사용해서 Vuex한테 욕을 먹으면...
개시하다
Firebase 방법
onSnapshot과 Vuex을 사용할 때 이런 오류가 발생했습니다.Error: [vuex] do not mutate vuex store state outside mutation handlers.
이번에는 이 이유와 대응법에 대한 보도다.
우선, 실제 인코딩은 여기에 있다
이번에는 snapshot으로 복선상자가 있는 ToDo 목록을 실시간으로 업데이트하는 프로젝트를 만들었습니다.
index.vue
<template>
  <div>
    <div v-for="(item, index) in taskList" :key="index">
      <input
        type="checkbox"
        :checked="item.isChecked"
        @click="toggleCheck(item.isChecked, item.id)"
      >
    </div>
  </div>
</template>
<script>
export default {
  ...mapState({
    taskList: state => state.taskList
  })
  created() {
    this.$store.dispatch('task/fetchTaskList')
  }
  methods: {
    toggleCheck(isChecked, taskId){
      this.$store.dispatch('task/toggleCheck', { isChecked: isChecked, taskId: taskId })
    }
  }
}
</script>
export const state = () => ({
  taskList: []
})
export const mutations = {
  setTaskList(state, list) {
    state.taskList = list
  }
}
export const actions = {
  fetchTaskList({ commit, rootState }) {
    const taskList = []
    this.$firestore()
      .collection('user')
      .doc(rootState.sign.uid)
      .collection('taskList')
      .onSnapshot(async querySnapshot => {
        await querySnapshot.forEach(doc => {
          const task = Object.assign(doc.data(), { id: doc.id })
          taskList.push(task)
        })
        commit('setTaskList', taskList)
      })
  }
}
여기까지는 문제 없이 돌아가고 있다.
여기에 작업 검사 처리를 추가해 보십시오.
store/task.js
async toggleDone({ rootState }, { isDone, taskId }) {
    const newTask = {
      isDone: isDone ? false : true
    }
    await this.$firestore()
      .collection('user')
      .doc(rootState.sign.uid)
      .collection('taskList')
      .doc(taskId)
      .set(newTask, { merge: true })
  }
}
Error: [vuex] do not mutate vuex store state outside mutation handlers.
자세한 오류 상태
onSnapshot 이후만 처리한다고 판명했다.즉
store/task.js
export const actions = {
  fetchTaskList({ commit, rootState }) {
    const taskList = []
    this.$firestore()
      .collection('user')
      .doc(rootState.sign.uid)
      .collection('taskList')
// firestoreの値が更新された際、ここから下の処理が自動で動く
      .onSnapshot(async querySnapshot => {
        await querySnapshot.forEach(doc => {
          const task = Object.assign(doc.data(), { id: doc.id })
          taskList.push(task)
        })
        commit('setTaskList', taskList)
      })
  }
}
onSnapshot 마이그레이션 처리만 수행하면 taskList.push(task) 어떻게 수행합니까?그러니까 범인이 이 놈이라는 거야.
const taskList = []
고찰하다.
두 번째 자동 취득 때는 새로운 타스크리스트가 존재하지 않았고,
state의 타스크리스트를 봤잖아요.이 처리는 actions에서 이루어졌기 때문에 잘못된 내용과 같이 mutations 이외의 state의 값이 변경되었습니다???결론
이렇게 하시면 됩니다.
store/task.js
export const actions = {
  fetchTaskList({ commit, rootState }) {
    this.$firestore()
      .collection('user')
      .doc(rootState.sign.uid)
      .collection('taskList')
// firestoreの値が更新された際、ここから下の処理が自動で動く
      .onSnapshot(async querySnapshot => {
        const taskList = []
        await querySnapshot.forEach(doc => {
          const task = Object.assign(doc.data(), { id: doc.id })
          taskList.push(task)
        })
        commit('setTaskList', taskList)
      })
  }
}
taskList의 정의를 onSnapshot에 넣으면 정상적으로 작동합니다.말하자면...
원래 함수에 정의된 변수명과
state에 사용된 변수명은 오류가 증가할 뿐이므로 이렇게 하지 않는 것이 좋습니다.함수에 사용할 변수 이름을 스스로 준비하는 것이 가장 좋다.
Reference
이 문제에 관하여([Firebase] onShapshot을 사용해서 Vuex한테 욕을 먹으면...), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/onota/articles/6848ffef2e9fe955ae56텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)