Search code examples
javascriptundefinedvuexcommit

Cannot read property 'commit' of undefined VUEX


Please help me it always says Cannot read property 'commit' of undefined. Here is my code in store.js.

import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

export const store = new Vuex.Store({
  state:{
     timer: null,
     totaltime: (25 * 60)
  }, 
  mutations:{
    startTimer: (state, context) => {
    //here is the problem part I think
      state.timer = setInterval(() => context.commit('countDown'),
      1000)
    },
    countDown: state => {
      var time = state.totaltime
      if(time >= 1){
        time--
      }else{
        time = 0
      }
    },
    stopTimer: state => {
      clearInterval(state.timer)
      state.timer = null
    },
    resetTimer: state => {
      state.totaltime = (25 * 60)
      clearInterval(state.timer)
    }
  },
  getters:{
      minutes: state => {
        const minutes = Math.floor(state.totaltime / 60);
        return minutes;
      },
      seconds: (state, getters) => {
        const seconds = state.totaltime - (getters.minutes * 60);
        return seconds;
      }
  },
  actions:{


  }
})

I have problem it debugging. it always says like this 'Cannot read property 'commit' of undefined'

Here is my Timer.vue code for calling

methods: {
      formTime(time){
        return (time < 10 ? '0' : '') + time;
      },
      startTimer(){
        this.resetButton = true
        this.$store.commit('startTimer')
      },
      stopTimer(){
        this.$store.commit('stopTimer')
      },
      resetTimer(){
        this.$store.commit('resetTimer')
      },

    },
    computed: {
      minutes(){
        var minutes = this.$store.getters.minutes;
        return this.formTime(minutes)
      },
      seconds(){
        var seconds = this.$store.getters.seconds;
        return this.formTime(seconds);
      },
      timer: {
        get(){
          return this.$store.state.timer
        }
      }
    }

My code in Timer.vue script computed and methods. I cannot track where the problem is... Please help me Im stuck with this here.


Solution

  • Mutations do not have access to any context. They are meant to be atomic, that is they work directly with one facet of state. You should make your startTimer an action that commits the timer and then starts the countdown

    mutations: {
      // add this one for setting the timer
      setTimer (state, timer) {
        state.timer = timer
      }
    },
    actions: {
      startTimer ({ commit }) {
        commit('stopTimer') // just a guess but you might need this
        commit('setTimer', setInterval(() => {
          commit('countDown')
        }, 1000))
      }
    }
    

    This would need to be called via dispatch instead of commit

    this.$store.dispatch('startTimer')