vuejs 2 как смотреть значения хранилища от vuex

Я использую vuex и vuejs 2 вместе.

Я новичок в vuex, я хочу посмотреть изменение переменной store.

Я хочу добавить функцию watch в свой vue component

Это то, что у меня есть до сих пор:

import Vue from 'vue';
import {
  MY_STATE,
} from './../../mutation-types';

export default {
  [MY_STATE](state, token) {
    state.my_state = token;
  },
};

Я хочу знать, есть ли какие-либо изменения в my_state

Как посмотреть store.my_state в моем компоненте vuejs?

Ответы

Ответ 1

Скажем, например, что у вас есть корзина фруктов, и каждый раз, когда вы добавляете или удаляете фрукты из корзины, вы хотите (1) отображать информацию о количестве фруктов, но вы также (2) хотите получить уведомление о подсчет плодов в какой-то причудливой манере...

фруктово-кол-component.vue

<template>
  <!-- We meet our first objective (1) by simply -->
  <!-- binding to the count property. -->
  <p>Fruits: {{ count }}</p>
</template>

<script>
import basket from '../resources/fruit-basket'

export default () {
  computed: {
    count () {
      return basket.state.fruits.length
      // Or return basket.getters.fruitsCount
      // (depends on your design decisions).
    }
  },
  watch: {
    count (newCount, oldCount) {
      // Our fancy notification (2).
      console.log('We have ${newCount} fruits now, yaay!')
    }
  }
}
</script>

Обратите внимание, что имя функции в объекте watch должно совпадать с именем функции в computed объекте. В приведенном выше примере имя count.

Новые и старые значения наблюдаемого свойства будут переданы в функцию callback (функция count) в качестве параметров.

Магазин корзины может выглядеть так:

плодовые basket.js

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

Vue.use(Vuex)

const basket = new Vuex.Store({
  state: {
    fruits: []
  },
  getters: {
    fruitsCount (state) {
      return state.fruits.length
    }
  }
  // Obvously you would need some mutations and actions,
  // but to make example cleaner I'll skip this part.
})

export default basket

Вы можете прочитать больше в следующих ресурсах:

Ответ 2

Вы не должны использовать наблюдателей компонентов для прослушивания изменения состояния. Я рекомендую вам использовать функции геттеров, а затем отображать их внутри вашего компонента.

import { mapGetters } from 'vuex'

export default {
  computed: {
    ...mapGetters({
      myState: 'getMyState'
    })
  }
}

В вашем магазине:

const getters = {
  getMyState: state => state.my_state
}

Вы должны уметь прослушивать любые изменения, внесенные в ваш магазин, используя this.myState в своем компоненте.

https://vuex.vuejs.org/en/getters.html#the-mapgetters-helper

Ответ 3

Как уже упоминалось выше, не рекомендуется смотреть изменения непосредственно в магазине

Но в некоторых очень редких случаях это может быть полезно для кого-то, поэтому я оставлю этот ответ. Для других случаев смотрите ответ @gabriel-robert

Вы можете сделать это через state.$watch. Добавьте это в свой метод created (или там, где это необходимо) в компоненте

this.$store.watch(
    function (state) {
        return state.my_state;
    },
    function () {
        //do something on data change
    },
    {
        deep: true //add this if u need to watch object properties change etc.
    }
);

Подробнее: https://vuex.vuejs.org/api/#watch

Ответ 4

Я думаю, что искатель хочет использовать часы с Vuex.

this.$store.watch(
      (state)=>{
        return this.$store.getters.your_getter
      },
      (val)=>{
       //something changed do something

      },
      {
        deep:true
      }
      );

Ответ 5

Это для всех людей, которые не могут решить свою проблему с геттерами и действительно нуждаются в наблюдателе, например, чтобы поговорить с сторонними разработчиками, не относящимися к vue (см. Vue Watchers о том, когда использовать наблюдателей).

Наблюдатели компонентов Vue и вычисленные значения также работают с вычисленными значениями. Так что с Vuex ничем не отличается

import { mapState } from 'vuex';

export default {
    computed: {
        ...mapState(['somestate']),
        someComputedLocalState() {
            // is triggered whenever the store state changes
            return this.somestate + ' works too';
        }
    },
    watch: {
        somestate(val, oldVal) {
            // is triggered whenever the store state changes
            console.log('do stuff', val, oldVal);
        }
    }
}

если речь идет только о комбинировании локального и глобального состояния, документ mapState также предоставляет пример:

computed: {
    ...mapState({
        // to access local state with 'this', a normal function must be used
        countPlusLocalState (state) {
          return state.count + this.localCount
        }
    }
})

Ответ 6

Создайте локальное состояние вашей переменной хранилища, просмотрев и установив изменения значений. Такое, что локальная переменная изменяется для v-модели с входными формами, напрямую не изменяет переменную хранилища.

data() {
  return {
    localState: null
  };
 },
 computed: {
  ...mapGetters({
    computedGlobalStateVariable: 'state/globalStateVariable'
  })
 },
 watch: {
  computedGlobalStateVariable: 'setLocalState'
 },
 methods: {
  setLocalState(value) {
   this.localState = Object.assign({}, value);
  }
 }

Ответ 7

Лучший способ наблюдать изменения магазина - использовать mapGetters как сказал Габриэль. Но есть случай, когда вы не можете сделать это через mapGetters например, вы хотите получить что-то из магазина, используя параметр:

getters: {
  getTodoById: (state, getters) => (id) => {
    return state.todos.find(todo => todo.id === id)
  }
}

в этом случае вы не можете использовать mapGetters. Вы можете попытаться сделать что-то вроде этого:

computed: {
    todoById() {
        return this.$store.getters.getTodoById(this.id)
    }
}

Но, к сожалению, todoById будет обновляться, только если this.id изменен

Если вы хотите, чтобы обновление компонента в этом случае использовало this.$store.watch решение this.$store.watch предоставленное this.$store.watch. Или сознательно обрабатывайте свой компонент и обновляйте this.id когда вам нужно обновить todoById.

Ответ 8

Это так просто, как:

watch: {
  '$store.state.drawer': function() {
    console.log(this.$store.state.drawer)
  }
}

Ответ 9

Вы можете использовать комбинацию действий Vuex, геттеров, вычисленных свойств и наблюдателей для прослушивания изменений в значении состояния Vuex.

Код HTML:

<div id="app" :style='style'>
  <input v-model='computedColor' type="text" placeholder='Background Color'>
</div>

Код JavaScript:

'use strict'

Vue.use(Vuex)

const { mapGetters, mapActions, Store } = Vuex

new Vue({
    el: '#app',
  store: new Store({
    state: {
      color: 'red'
    },
    getters: {
      color({color}) {
        return color
      }
    },
    mutations: {
      setColor(state, payload) {
        state.color = payload
      }
    },
    actions: {
      setColor({commit}, payload) {
        commit('setColor', payload)
      }
    }
  }),
  methods: {
    ...mapGetters([
        'color'
    ]),
    ...mapActions([
        'setColor'
    ])
  },
  computed: {
    computedColor: {
        set(value) {
        this.setColor(value)
      },
      get() {
        return this.color()
      }
    },
    style() {
        return 'background-color: ${this.computedColor};'
    }
  },
  watch: {
    computedColor() {
        console.log('Watcher in use @${new Date().getTime()}')
    }
  }
})

См. Демонстрацию JSFiddle.

Ответ 10

Когда вы хотите смотреть на государственном уровне, это можно сделать следующим образом:

let App = new Vue({
    //...
    store,
    watch: {
        '$store.state.myState': function (newVal) {
            console.log(newVal);
            store.dispatch('handleMyStateChange');
        }
    },
    //...
});

Ответ 11

Вы также можете подписаться на магазин мутаций:

store.subscribe((mutation, state) => {
  console.log(mutation.type)
  console.log(mutation.payload)
})

https://vuex.vuejs.org/api/#subscribe

Ответ 12

если вы используете машинопись, то вы можете:

import { Watch } from "vue-property-decorator";

..

@Watch("$store.state.something")
private watchSomething() {
   // use this.$store.state.something for access
   ...
}

Ответ 13

Вы также можете использовать mapState в своем компоненте vue для прямого получения состояния из хранилища.

В вашем компоненте:

computed: mapState([
  'my_state'
])

Где my_state - это переменная из хранилища.