Как я мог бы получить и установить значения с помощью Vuex?

#vue.js #vuejs2 #vuex #vue-router

#vue.js #vuejs2 #vuex #vue-маршрутизатор

Вопрос:

Я новичок в Vue, и это первый раз, когда я использую Vuex, так что это может быть полное непонимание с моей стороны.

У меня есть страница, на которой есть 2 DatePicker, когда пользователь выбирает значения, страница должна передавать значения на другую страницу, которая отправит сообщение в веб-сервис. Я прочитал, что для этого мне нужно будет использовать 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;
    }
  }
  

Пожалуйста, помогите мне.

Комментарии:

1. На странице codesandbox, которой вы поделились, я не нашел функционального кода. И вам лучше начать с заполнения store.js файл. И обогатить его содержимое геттерами, мутациями (и, возможно, действиями, если вам нужно). Проверьте документы: vuex.vuejs.org/guide

2. Извините, я не знаю почему, но файлы пусты. Вот рабочий код: codesandbox.io/s/52r5ow955l

Ответ №1:

Вам нужны геттеры, мутации, действия и т.д. Установка переменных хранилища, как вы делаете в данный момент, неверна.

Вот пример того, как обновить переменную в вашем хранилище. Если у вас есть следующая переменная:

 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 / параметры запроса / cookies / что угодно для передачи данных. Vuex — это здорово, но не всегда необходимо (хотя, является ли это необходимым в вашем случае, зависит от вас).

Комментарии:

1. Здравствуйте, спасибо за вашу помощь. Я пытаюсь применить ваше решение, но я сталкиваюсь с ошибкой в этой части, когда я получаю «ожидаемое объявление переменной» const default = { loading: true }

2. Привет, если я правильно помню, я полагаю, что следил за этой Wiki , когда сам узнавал о Vuex (без аффилированности). Возможно, стоило бы щелкнуть по этому репозиторию и подобным репозиториям, чтобы увидеть, как он используется в контексте полноценного приложения.

3. Конкретный пример, который я изложил в своем ответе, на самом деле был взят из приложения, которое я написал, не так давно обучаясь Vue. Если вы хотите изучить это, это на моем GitHub: вот мой магазин ; вот где я это использовал . Щелкните вокруг и посмотрите, поможет ли это. Очевидный отказ от ответственности: я связан с этими ссылками, поскольку они являются ссылками на мой собственный репозиторий GitHub.

4. Спасибо за вашу помощь, но работает другое решение. За обедом я тоже почитаю ваш github, чтобы проверить, есть ли лучший способ сделать то, что я хочу.

Ответ №2:

Вы не должны устанавливать состояние в хранилище подобным образом, это значение предназначено только для чтения (или сопоставления). Что вам следует сделать, так это создать функцию mutate в вашем хранилище и вызвать ее из вашего компонента.

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

(Также: не кодируйте на других языках, кроме английского. Также: там много дублирующегося кода, вы должны попытаться избавиться от этого.)

Комментарии:

1. Здравствуйте. Я вижу много примеров о мутации, но я не могу самостоятельно найти решение… Я тоже пытался сделать это в своем примере, см. store.js файл здесь: codesandbox.io/s/52r5ow955l Но я все еще не знаю, как я мог бы установить значение.

2. Вы должны добавить мутацию, как я сделал здесь: codesandbox.io/s/j220vno429 . После этого вы можете сделать это.$store.commit(‘setPrimaeiraData’, someData) из вашего компонента. Кроме того, ваши методы получения неверны, пожалуйста, прочитайте документы о vuex.

3. Я улучшу код, когда логика будет выполнена. На данный момент у меня есть много комментариев и некоторые странные переменные, я знаю. Что касается вашего примера, как я мог бы вызвать мутацию для изменения значения? Созданный вами образец — это то, что я уже видел в документах, но проблема (такая же, как в документах) IDK, как я мог бы вызвать этот метод мутации, чтобы изменить значение.

4. this.$store.commit(‘NAME_OF_MUTATION’, yourData) (позже вы можете посмотреть, как использовать mapMutations, но пока это должно сработать)

5. @Andronicus Как «создать функцию mutate в вашем хранилище и вызвать ее из вашего компонента». не ответ на «Как я мог бы получить и установить значения с помощью Vuex?».