#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?».