Estou usando vuex
e vuejs 2
juntos.
Eu sou novo vuex
, quero assistir a uma store
mudança variável.
Eu quero adicionar a watch
função no meuvue component
Isto é o que eu tenho até agora:
import Vue from 'vue';
import {
MY_STATE,
} from './../../mutation-types';
export default {
[MY_STATE](state, token) {
state.my_state = token;
},
};
Quero saber se há alguma alteração no my_state
Como eu assisto store.my_state
no meu componente vuejs?
javascript
vue.js
vuejs2
vuex
raffffffff
fonte
fonte
Respostas:
Digamos, por exemplo, que você tem uma cesta de frutas e, sempre que adicionar ou remover uma fruta da cesta, você deseja (1) exibir informações sobre a contagem de frutas, mas também (2) deseja ser notificado sobre a contagem das frutas de alguma maneira chique ...
fruit-count-component.vue
Observe que o nome da função no
watch
objeto deve corresponder ao nome da função nocomputed
objeto. No exemplo acima, o nome écount
.Os valores novos e antigos de uma propriedade monitorada serão passados para o retorno de chamada da monitoração (a função de contagem) como parâmetros.
A loja de cestas pode ficar assim:
fruit-basket.js
Você pode ler mais nos seguintes recursos:
fonte
watch
ação deve ser dividida em duas etapas: 1) Primeiro, verificando se os dados desejados estão em cache e se apenas retornam os dados em cache; 2) Se o cache falhou, preciso de uma ação assíncrona do ajax para buscar os dados, mas isso parece ser oaction
trabalho. Esperando que minha pergunta faça sentido, obrigado!Você não deve usar observadores do componente para ouvir a mudança de estado. Eu recomendo que você use funções getters e mapeie-as dentro do seu componente.
Na sua loja:
Você deve poder ouvir as alterações feitas em sua loja usando
this.myState
em seu componente.https://vuex.vuejs.org/en/getters.html#the-mapgetters-helper
fonte
É tão simples quanto:
fonte
function(n) { console.log(n); }
Como mencionado acima, não é uma boa ideia assistir as alterações diretamente na loja
Mas, em alguns casos muito raros, pode ser útil para alguém, então deixarei esta resposta. Para outros casos, consulte @ gabriel-robert answer
Você pode fazer isso completamente
state.$watch
. Adicione isso no seucreated
método (ou onde você precisar que ele seja executado) no componenteMais detalhes: https://vuex.vuejs.org/api/#watch
fonte
Acho que o autor da pergunta quer usar o relógio com a Vuex.
fonte
Isso é para todas as pessoas que não conseguem resolver seu problema com getters e realmente precisam de um observador, por exemplo, para conversar com coisas de terceiros que não são da área de vendas (consulte Vue Watchers sobre quando usar os observadores).
Os observadores e os valores calculados do componente Vue também funcionam em valores calculados. Portanto, não é diferente com o vuex:
se se trata apenas de combinar estado local e global, o documento do mapState também fornece um exemplo:
fonte
se você usar o texto datilografado, poderá:
fonte
Crie um estado local da sua variável de loja assistindo e definindo as alterações de valor. De modo que a variável local seja alterada para o modelo v de entrada de formulário não modifique diretamente a variável de armazenamento .
fonte
A melhor maneira de observar as mudanças nas lojas é usar
mapGetters
como Gabriel disse. Mas há um caso em que você não pode fazê-lo, pormapGetters
exemplo, deseja obter algo da loja usando o parâmetro:nesse caso, você não pode usar
mapGetters
. Você pode tentar fazer algo assim:Mas infelizmente
todoById
só será atualizado sethis.id
for alteradoSe você deseja atualizar o componente, nesse caso, use a
this.$store.watch
solução fornecida pelo Gong . Ou lide com o componente conscientemente e atualizethis.id
quando precisar atualizartodoById
.fonte
Se você simplesmente deseja assistir a uma propriedade de estado e, em seguida, agir dentro do componente de acordo com as alterações dessa propriedade, consulte o exemplo abaixo.
Em
store.js
:Nesse cenário, estou criando uma
boolean
propriedade de estado que alterarei em diferentes locais do aplicativo, como segue:Agora, se eu precisar observar essa propriedade do estado em algum outro componente e alterar a propriedade local, escreveria o seguinte no
mounted
gancho:Em primeiro lugar, estou definindo um inspetor na propriedade state e, em seguida, na função de retorno de chamada, uso a
value
propriedade dessa para alterar olocalProperty
.Espero que ajude!
fonte
Quando você deseja assistir no nível do estado, isso pode ser feito da seguinte maneira:
fonte
store.state
mudanças pordispatch
ação de estado do componente, pois esse comportamento só funcionará se você usar esse componente. Além disso, você pode terminar com loop infinito. Relógio parastore.state
alterar raramente uso, por exemplo, se você tem um componente ou uma página que deve fazer alguma ação com base emstore.state
mudou isso não poderia tratados por meio calculado mapState apenas quando você não pode compararnewValue
vsoldValue
store.dispatch
? se você quiser lidar comstore.state
alterações parastore' why not handle it inside
store.mutations`?store.dispatch
primeiro. Por exemplo, quero obter todas as cidades de um país sempre$store.state.country
que houver alterações, então adiciono isso ao observador. Então eu escreveria uma chamada ajax: emstore.dispatch('fetchCities')
eu escrevo: #axios.get('cities',{params:{country: state.country }}).then(response => store.commit('receiveCities',response) )
Você pode usar uma combinação de ações , getters , propriedades computadas e observadores do Vuex para ouvir alterações no valor do estado do Vuex.
Código HTML:
Código JavaScript:
Veja a demonstração do JSFiddle .
fonte
Você também pode assinar as mutações da loja:
https://vuex.vuejs.org/api/#subscribe
fonte
Dentro do componente, crie uma função computada
Agora, o nome da função calculada pode ser observado, como
As alterações feitas no
vuex
estadomy_state
refletirão na função computadamyState
e acionarão a função de observação.Se o estado
my_state
estiver tendo dados aninhados, ahandler
opção ajudará maisIsso observará todos os valores aninhados na loja
my_state
.fonte
Você também pode usar o mapState no componente vue para direcionar o estado de obtenção da loja.
No seu componente:
Onde
my_state
é uma variável da loja.fonte
fonte
Eu usei desta maneira e funciona:
store.js:
mutations.js
actions.js
getters.js
E no seu componente onde você usa o estado da loja:
Quando o usuário envia o formulário, a ação STORE será chamada, após o sucesso criado, a mutação CREATE_SUCCESS será confirmada depois disso. A opção createSuccess é true e, no componente, o observador verá que o valor foi alterado e acionará a notificação.
isSuccess deve corresponder ao nome que você declara em getters.js
fonte