私はvuex
とvuejs 2
を一緒に使っています。
私はvuex
に慣れていない、私はstore
変数の変更を見たい。
vue component
にwatch
関数を追加したい
これは私がこれまでに持っているものです:
import Vue from 'vue';
import {
MY_STATE,
} from './../../mutation-types';
export default {
[MY_STATE](state, token) {
state.my_state = token;
},
};
my_state
に変更があるかどうかを知りたい
Vuejsコンポーネントでstore.my_state
を監視するにはどうすればいいですか?
たとえば、果物のかごがあり、そのかごに果物を追加または削除するたびに、(1)果物の数に関する情報を表示する、 しかし あなたも(2 )いくつかの派手な方法で果物の数の通知を受けたい...
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>
watch
オブジェクト内の関数の名前は、computed
オブジェクト内の関数の名前と一致しなければならないことに注意してください。上の例では、名前はcount
です。
監視プロパティの新しい値と古い値は、パラメータとして監視コールバック(count関数)に渡されます。
バスケットストアは次のようになります。
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
以下のリソースでもっと読むことができます。
状態の変化を監視するためにコンポーネントのウォッチャーを使用しないでください。ゲッター関数を使用してから、それらをコンポーネント内にマッピングすることをお勧めします。
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
上で述べたように、ストアで直接変更を監視することはお勧めできません
ただし、ごくまれに、誰かに役立つことがあるので、この回答を残します。その他の場合は、@ 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/en/api.html#vuex-store-instance-methods
質問者はVuexでwatchを使用したいと思います。
this.$store.watch(
(state)=>{
return this.$store.getters.your_getter
},
(val)=>{
//something changed do something
},
{
deep:true
}
);
これは、ゲッターで問題を解決することができず、実際にウォッチャーが本当に必要なすべての人々のためのものです。非vueサードパーティのものと話をする( Vue Watchers を参照してください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
}
}
})
Gabrielが言ったように、店舗の変更を監視する最良の方法は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
Gong提供のソリューション を使用してください。 todoById
を更新する必要があるときは、コンポーネントを意識的に扱い、this.id
を更新してください。
値の変更を確認して設定することで、ストア変数の Local state を作成します。ローカル変数が form-input v-model に変更されても、 store変数 は直接変更されません。
data() {
return {
localState: null
};
},
computed: {
...mapGetters({
computedGlobalStateVariable: 'state/globalStateVariable'
})
},
watch: {
computedGlobalStateVariable: 'setLocalState'
},
methods: {
setLocalState(value) {
this.localState = Object.assign({}, value);
}
}
次のように簡単です:
watch: {
'$store.state.drawer': function() {
console.log(this.$store.state.drawer)
}
}
Vuexの状態値の変化を監視するには、Vuex actions 、 getters 、 計算プロパティ および watchers の組み合わせを使用できます。
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()}`)
}
}
})
州レベルで見たいときは、こうすることができます。
let App = new Vue({
//...
store,
watch: {
'$store.state.myState': function (newVal) {
console.log(newVal);
store.dispatch('handleMyStateChange');
}
},
//...
});
ストアの突然変異を購読することもできます。
store.subscribe((mutation, state) => {
console.log(mutation.type)
console.log(mutation.payload)
})
VueコンポーネントでmapStateを使用して、ストアから状態を取得するように指示することもできます。
あなたのコンポーネントで:
computed: mapState([
'my_state'
])
my_state
はストアからの変数です。