Почему счетчик не отображается в vue js с помощью геттеров?

#vue.js #vuejs2 #vue-component #vuex

#vue.js #vuejs2 #vue-компонент #vuex

Вопрос:

Как вы можете видеть в приведенном ниже коде, у меня есть store.js где я удваиваю свое значение на 2, используя геттеры, но при доступе к нему в результате this.$store.state.doubelCounter; отображается как неопределенный.

У меня есть это store.js для vuex

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

Vue.use(Vuex);

export const store = new Vuex.Store({
    state: {
        counter: 0
    },
    getters: {
        doubleCounter: state => {
            return state.counter * 2;
        } 
    }
})
  

Это counter.vue :

 <template>
    <div>
        <button class="btn btn-primary" @click="increment">Increment</button>
        <button class="btn btn-primary" @click="decrement">Decrement</button>
    </div>
</template>

<script>
    export default {
        methods: {
            increment() {
                this.$store.state.counter  ;
            },
            decrement() {
                this.$store.state.counter--;
            }
        }
    }
</script>
  

Это result.vue :

 <template>
  <p>Counter is: {{ counter }}</p>
</template>

<script>
export default {
  computed: {
    counter() {
      return this.$store.state.doubelCounter;
    },
  },
};
</script>
  

Комментарии:

1. Это геттер, а не состояние. vuex.vuejs.org/guide

2. Для получения дополнительной информации я проверил документы. и я новичок, так что!

Ответ №1:

Во-первых, вы не можете напрямую изменять состояние хранилища. Единственный способ сделать это — зафиксировать мутацию:

 export const store = new Vuex.Store({
  state: {
    counter: 0
  },
  getters: {
    doubleCounter: state => state.counter * 2
  },
  mutations: {
    incrementCounter(state) {
      state.counter  ;
    },
    decrementCounter(state) {
      state.counter--;
    }
  },
})
  

Затем в counter.vue :

 <template>
    <div>
        <button class="btn btn-primary" @click="incrementCounter">Increment</button>
        <button class="btn btn-primary" @click="decrementCounter">Decrement</button>
    </div>
</template>

<script>
  import { mapMutations } from 'vuex';

  export default {
    methods: {
      ...mapMutations(['incrementCounter', 'decrementCounter'])
    }
  }
</script>
  

Во-вторых, чтобы получить доступ к геттеру хранилища, вы должны использовать $store.getters вместо $store.state in result.vue :

 <template>
  <p>Counter is: {{ counter }}</p>
</template>

<script>
export default {
  computed: {
    counter() {
      return this.$store.getters.doubleCounter; // "doubel" typo fixed
    },
  },
};
</script>
  

Комментарии:

1. Спасибо, кстати, я следил за учебником, так что работайте в учебнике, но не в моем, это может быть связано с версией Vue

2. @SarwanNizamani Я думаю, что вы просто делаете ошибки здесь и там. Код из учебников должен работать.

3. @SarwanNizamani Всегда пожалуйста. Не забудьте отметить мой ответ как решение 🙂