如何从 vuex 中查看存储值?

IT技术 javascript vue.js vuejs2 vuex
2021-02-13 04:49:33

我正在使用vuexvuejs 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 组件中观看

6个回答

例如,假设您有一篮子水果,每次从篮子中添加或移除水果时,您希望 (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, yay!`)
    }
  }
}
</script>

请注意,watch对象中的函数名称必须与对象中的函数名称匹配computed在上面的例子中,名称是count.

监视属性的新旧值将作为参数传递到监视回调(计数函数)中。

篮子商店可能看起来像这样:

水果篮.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
    }
  }
  // Obviously you would need some mutations and actions,
  // but to make example cleaner I'll skip this part.
})

export default basket

您可以在以下资源中阅读更多内容:

与 micah5 的答案相比,这有什么好处,它只是在组件中设置一个观察者,存储value?它需要维护的代码更少。
2021-03-18 04:49:33
为什么你必须观察计算值?为什么计算出的值不会为这个值创建一个工作表?那毕竟是计算值的点。
2021-03-21 04:49:33
@1Cr18Ni9 我认为缓存不属于组件代码。您最终会过度设计一些应该非常简单的东西(获取数据并将其绑定到视图)。缓存已经在浏览器中实现了。您可以通过从服务器发送正确的标头来利用它。这里简单解释:csswizardry.com/2019/03/cache-control-for-civilians您还可以查看 ServiceWorkers,它允许网站即使没有互联网连接也能工作。
2021-03-29 04:49:33
我只是想知道当watch动作应该分为两个步骤时我应该怎么做:1)首先,检查所需数据是否已缓存,是否仅返回缓存数据;2) 如果缓存失败,我需要一个异步 ajax 操作来获取数据,但这似乎是action的工作。希望我的问题有道理,谢谢!
2021-04-01 04:49:33
@Exocentric 当我写答案时,问题对我来说不清楚。没有上下文说明为什么需要监视属性。可以这样想:“我想观察变量 X,所以我可以做 Y。” 可能这就是为什么大多数答案提出了如此截然不同的方法。没有人知道其意图是什么。这就是我在答案中包含“目标”的原因。如果你有不同的目标,不同的答案可能适合他们。我的例子只是实验的一个起点。它并不意味着是即插即用的解决方案。没有“好处”,因为好处取决于您的情况。
2021-04-02 04:49:33

这很简单:

watch: {
  '$store.state.drawer': function() {
    console.log(this.$store.state.drawer)
  }
}
顺便说一句,如果商店是用module命名的,只需写 '$store.state.module.something'
2021-03-18 04:49:33
这该死的景象比这里的任何答案都更直接……是否有任何反对这样做的理由……?
2021-03-19 04:49:33
严重地。这似乎比接受的答案要好得多,后者需要在 watch 和计算中使用重复的函数名称。专家能否评论为什么或为什么不这样做?
2021-03-22 04:49:33
太简单了,看起来不像js,js肯定更复杂。
2021-03-23 04:49:33
超酷。也对这种方法的任何缺点感兴趣。到目前为止,它似乎运行良好。
2021-03-27 04:49:33

你不应该使用组件的观察者来监听状态变化。我建议您使用 getter 函数,然后将它们映射到您的组件中。

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

为什么“你不应该使用组件的观察者来监听状态变化”?这是您可能没有想到的示例,如果我想从状态中查看令牌,以及何时更改为重定向到另一个页面。因此,在某些情况下您需要这样做。也许你需要更多的经验才能知道。
2021-03-16 04:49:33
我不知道如何实现 mapGetters。你能给我举个例子吗?这将是一个很大的帮助。我现在只是执行 GONG 答案。
2021-03-23 04:49:33
@Rbex "mapGetters" 是 'vuex' 库的一部分。您不需要实施它。
2021-03-24 04:49:33
这个答案是错误的。他实际上需要观察计算属性。
2021-03-28 04:49:33
调用过的 getter 只会检索当时的状态。如果您希望该属性反映来自另一个组件的状态更改,您必须观察它。
2021-04-13 04:49:33

如上所述,直接在商店中查看更改不是一个好主意

但在一些非常罕见的情况下,它可能对某人有用,所以我会留下这个答案。对于其他情况,请参阅@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

@GabrielRobert 我认为两者都有一席之地。如果您需要根据模板条件被动地更改,使用带有 mapState 的计算值等是有意义的。但除此之外,就像组件中的流控制一样,您需要一个完整的监视。你是对的,你不应该使用普通的组件观察者,但是 state.$watch 是为这些用例设计的
2021-03-16 04:49:33
每个人都提到它,但没有人说为什么!我正在尝试构建一个在更改时与数据库自动同步的 vuex 存储。感觉店里的旁观者是最无摩擦的方式!你怎么认为?仍然不是一个好主意?
2021-03-25 04:49:33
我认为直接观察状态不是一个好主意。我们应该使用吸气剂。vuex.vuejs.org/en/getters.html#the-mapgetters-helper
2021-04-01 04:49:33

我认为提问者想将 watch 与 Vuex 一起使用。

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

      },
      {
        deep:true
      }
      );
这应该在哪里调用?
2021-03-17 04:49:33
某个可以通过this. 像一个created钩子。基本上,您需要的任何组件
2021-03-27 04:49:33