javascript - usar - vuejs 2 como ver los valores de la tienda desde vuex
vuex español (13)
Estoy usando
vuex
y
vuejs 2
juntos.
Soy nuevo en
vuex
, quiero ver un cambio en la variable de la
store
.
Quiero agregar la función de
watch
en mi
vue component
Esto es lo que tengo hasta ahora:
import Vue from ''vue'';
import {
MY_STATE,
} from ''./../../mutation-types'';
export default {
[MY_STATE](state, token) {
state.my_state = token;
},
};
Quiero saber si hay algún cambio en
my_state
¿Cómo veo
store.my_state
en mi componente vuejs?
Cree un estado local de su variable de tienda observando y estableciendo cambios de valor. Tal que la variable local cambie para el modelo v de entrada de formulario no muta directamente la variable de tienda .
computed: {
todoById() {
return this.$store.getters.getTodoById(this.id)
}
}
Creo que el autor de la pregunta quiere usar el reloj con Vuex.
this.$store.watch(
(state)=>{
return this.$store.getters.your_getter
},
(val)=>{
//something changed do something
},
{
deep:true
}
);
Cuando desee ver a nivel estatal, puede hacerlo de esta manera:
let App = new Vue({
//...
store,
watch: {
''$store.state.myState'': function (newVal) {
console.log(newVal);
store.dispatch(''handleMyStateChange'');
}
},
//...
});
Digamos, por ejemplo, que tiene una canasta de frutas, y cada vez que agrega o quita una fruta de la canasta, desea (1) mostrar información sobre el recuento de frutas, pero también (2) desea que se le notifique el recuento de las frutas de una manera elegante ...
fruit-count-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>
Tenga en cuenta que el nombre de la función en el objeto de
watch
debe coincidir con el nombre de la función en el objeto
computed
.
En el ejemplo anterior, el nombre es
count
.
Los valores nuevos y antiguos de una propiedad vigilada se pasarán a la devolución de llamada de vigilancia (la función de conteo) como parámetros.
La tienda de cestas podría verse así:
fruit-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
Puedes leer más en los siguientes recursos:
Es tan simple como:
watch: {
''$store.state.drawer'': function() {
console.log(this.$store.state.drawer)
}
}
Esto es para todas las personas que no pueden resolver su problema con los captadores y que realmente necesitan un observador, por ejemplo, para hablar con cosas de terceros que no sean vue (vea Vue Watchers sobre cuándo usar observadores).
Los observadores del componente Vue y los valores calculados también funcionan en valores calculados. Entonces no es diferente con 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);
}
}
}
Si solo se trata de combinar el estado local y global, el documento de mapState también proporciona un ejemplo:
computed: {
...mapState({
// to access local state with `this`, a normal function must be used
countPlusLocalState (state) {
return state.count + this.localCount
}
}
})
La mejor manera de ver los cambios en la tienda es usar
mapGetters
como dijo Gabriel.
Pero hay un caso en el que no puede hacerlo a través de
mapGetters
por ejemplo, si desea obtener algo de la tienda usando el parámetro:
data() {
return {
localState: null
};
},
computed: {
...mapGetters({
computedGlobalStateVariable: ''state/globalStateVariable''
})
},
watch: {
computedGlobalStateVariable: ''setLocalState''
},
methods: {
setLocalState(value) {
this.localState = Object.assign({}, value);
}
}
en ese caso no puedes usar
mapGetters
.
Puedes intentar hacer algo como esto en su lugar:
getters: {
getTodoById: (state, getters) => (id) => {
return state.todos.find(todo => todo.id === id)
}
}
Pero desafortunadamente
todoById
se actualizará solo si se cambia
this.id
Si desea la actualización de sus componentes en tal caso, use
this.$store.watch
solución
this.$store.watch
provista por Gong
.
O maneje su componente conscientemente y actualice
this.id
cuando necesite actualizar
todoById
.
No debe usar los observadores de componentes para escuchar el cambio de estado. Le recomiendo que use las funciones getters y luego las asigne dentro de su componente.
import { mapGetters } from ''vuex''
export default {
computed: {
...mapGetters({
myState: ''getMyState''
})
}
}
En su tienda:
const getters = {
getMyState: state => state.my_state
}
Debería poder escuchar cualquier cambio realizado en su tienda utilizando
this.myState
en su componente.
https://vuex.vuejs.org/en/getters.html#the-mapgetters-helper
Puede usar una combinación de actions de Vuex, captadores, propiedades calculadas y observadores para escuchar los cambios en un valor de estado de Vuex.
Código HTML:
<div id="app" :style=''style''>
<input v-model=''computedColor'' type="text" placeholder=''Background Color''>
</div>
Código 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()}`)
}
}
})
También puede suscribirse a las mutaciones de la tienda:
store.subscribe((mutation, state) => {
console.log(mutation.type)
console.log(mutation.payload)
})
También puede usar mapState en su componente vue para dirigir el estado de la tienda.
En su componente:
import { Watch } from "vue-property-decorator";
..
@Watch("$store.state.something")
private watchSomething() {
// use this.$store.state.something for access
...
}
Donde
my_state
es una variable de la tienda.
si usas mecanografiado puedes:
computed: mapState([
''my_state''
])
Como se mencionó anteriormente, no es una buena idea ver los cambios directamente en la tienda
Pero en algunos casos muy raros puede ser útil para alguien, por lo que dejaré esta respuesta. Para otros casos, consulte la respuesta de @ gabriel-robert
Puede hacerlo a través del
state.$watch
.
Agregue esto en su método
created
(o donde necesita que se ejecute) en el componente
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.
}
);
Más detalles: https://vuex.vuejs.org/en/api.html#vuex-store-instance-methods