【问题标题】:How could I get and set values with Vuex?如何使用 Vuex 获取和设置值?
【发布时间】:2019-08-02 23:15:04
【问题描述】:

我是 Vue 的新手,这是我第一次使用 Vuex,所以这可能是对我的完全误解。

我有一个有 2 个 DatePicker 的页面,当用户选择值时,该页面应该将值传递给另一个页面,该页面将对 WebService 进行 POST。我读到这样做我需要使用 Vuex,所以我尝试了,但我无法将我的 var 的值设置为 Vuex var。 这是我的代码:https://codesandbox.io/s/y0ovmqrqlv

这是我尝试设置值的代码(存在于 Data.vue 中):

methods: {
getDatePrimeiro(primeiraDataPassada) {
  var dataUm = primeiraDataPassada;
  this.primeiraData = new Date(
    dataUm.getTime() - dataUm.getTimezoneOffset() * 60000
  )
    .toISOString()
    .split("T")[0];
  console.log(this.primeiraData);
},
getDateSegundo(segundaDataPassada) {
  var dataDois = segundaDataPassada;
  this.segundaData = new Date(
    dataDois.getTime() - dataDois.getTimezoneOffset() * 60000
  )
    .toISOString()
    .split("T")[0];
  console.log(this.segundaData);
  this.retornar;
}
  },

computed: {
    retornar() {
      console.log("Entrou função", this.primeiraData, this.segundaData)
      this.$store.state.primeiraData = this.primeiraData;
      this.$store.state.segundaData = this.segundaData;
    }
  }

请帮帮我。

【问题讨论】:

  • 在您分享的代码框页面中,我没有找到功能代码。你最好从填充 store.js 文件开始。并使用 getter、mutations(如果需要,可能还有操作)来丰富其内容。查看文档:vuex.vuejs.org/guide
  • 对不起,我不知道为什么,但文件是空的。这是代码工作:codesandbox.io/s/52r5ow955l

标签: vue.js vuejs2 vuex vue-router


【解决方案1】:

你需要 getter、mutations、action 等。像你现在这样设置 store 的变量是错误的。

以下示例说明了如何更新商店中的变量。如果你有以下变量:

const defaults = {
  loading: true
}

然后,您需要在您的商店中使用一个函数来改变该数据,如下所示:

export default {
  namespaced: true,
  state: Object.assign({}, defaults),
  mutations: {
    updateLoading(state, loading) {
      state.loading = loading
    }
  },
  actions: {
    updateLoading({ commit }, loading) {
      commit('updateLoading', loading)
    }
  }
}

为了从组件调用此操作(这将改变数据),您可以通过多种方式执行此操作 - 我个人的偏好是这样的:

<template>{{some stuff}}</template>

<script>
import { createNamespacedHelpers } from 'vuex'

// Change out 'common' for wherever your store is kept.
// I like to split out my store into modules to keep things separate
// In this case, I would have a file called /src/store/common.js
const { mapActions } = createNamespacedHelpers('common')

export default {
  ......... // name, components, data, etc
  methods: {
    ...mapActions(['updateLoading']),
    getData() {  // function which calls updateLoading
      this.updateLoading(true);
      ........ // do some stuff
      this.updateLoading(false);
    }
  }
}
</script>

<style>{{some style}}</style>

当然,如果您只是在线性流中将数据从一个页面传递到下一个页面,您总是可以使用 props/query parameters/cookies/whatever 来传递数据。 Vuex 很棒,但并不总是必要的(但在你的情况下是否需要它取决于你)。

【讨论】:

  • 您好,感谢您的帮助。我正在尝试应用您的解决方案,但是当我收到“预期的变量声明”const default = { loading: true } 时,我在这部分遇到了错误
  • 嗨,如果我没记错的话,我相信我在为自己学习 Vuex 时关注了this Wiki(无从属关系)。单击该存储库和类似存储库以查看它在完整应用程序的上下文中如何使用可能是值得的。
  • 我在回答中概述的具体示例实际上来自我不久前自学 Vue 时编写的一个应用程序。如果你想探索它,它在我的 GitHub 上:here's my storehere's where I used it。点击一下,看看是否有帮助。明显的免责声明:我隶属于这些链接,因为它们是指向我自己的 GitHub 存储库的链接。
  • 感谢您的帮助,但其他解决方案正在运行。午餐时我也会阅读你的 github 以检查是否有更好的方法来做我想做的事。
【解决方案2】:

您不应该这样设置商店中的状态,该值仅用于读取(或映射)。您应该做的是在您的商店中创建一个 mutate 函数并从您的组件中调用它。

https://vuex.vuejs.org/guide/mutations.html

(另外:不要用英语以外的其他语言编写代码。另外:那里有很多重复的代码,你应该尝试摆脱它。)

【讨论】:

  • 你好。我看到了很多关于突变的例子,但我自己想不出一个解决方案...我也尝试在我的示例中这样做,请参阅此处的 store.js 文件:codesandbox.io/s/52r5ow955l 但我仍然没有不知道如何设置值。
  • 你应该像我在这里所做的那样添加一个突变:codesandbox.io/s/j220vno429。之后,您可以从您的组件执行 this.$store.commit('setPrimaeiraData', someData) 。另外,您的吸气剂不正确,请阅读有关 vuex 的文档。
  • 我会在逻辑完成后改进代码。目前我有很多 cmets 和一些奇怪的变量,我知道。关于您的示例,我如何调用突变来更改值?您制作的样本是我已经在文档中看到的,但问题是(与文档相同)IDK 我怎么能调用这种变异方法来更改值。
  • this.$store.commit('NAME_OF_MUTATION', yourData) (你可以稍后看看如何使用 mapMutations,但现在应该可以了)
  • @Andronicus 如何“在您的商店中创建一个 mutate 函数并从您的组件中调用它。”不是“如何使用 Vuex 获取和设置值?”的答案。
猜你喜欢
  • 2020-09-17
  • 2019-07-21
  • 2011-08-07
  • 2020-01-30
  • 2011-06-10
  • 1970-01-01
  • 2023-03-07
  • 2022-01-11
  • 2019-04-24
相关资源
最近更新 更多