В моем приложении я работаю над хранением ответов пользовательской формы. Я создал магазин pinia и создал каждый объект формы. Используя это хранилище в моем компоненте и передавая функцию получения этого хранилища в переменную,
Эту переменную я использую как v-модель. После ввода также ничего не возвращается. Как и я не получаю никакой ошибки для этого. Я следовал какому-то неправильному подходу?
Userstore.js
import { defineStore } from 'pinia';
export const userResponses = {
formsResponses: {
form1: {
input1: '',
},
},
};
export default defineStore('userStore', {
state() { return userResponses; },
getters: {
getFormsInput: (state) => state.formsResponses.form1,
},
actions: {
setFormsResponses(formResponses) {
this.formsResponses.form1 = formResponses;
},
},
});
Form1.vue
<template>
<input type = "text" name = "input_form" v-model = "input"/>
<button type = "Primary" @click = "submit">submit</button>
</template>
<script setup>
import { computed, ref } from 'vue';
import useUserStore from '@/store/userStore';
const userStore = useUserStore();
const input = ref('');
const responses = computed(() => userStore.getFormsInput);
reponses.value.input1 = input.value;
function submit() {
console.info(reponses.value.input1); // it is giving nothing
}
</script>
Почему я не могу использовать геттеры или не обновлять значение? Могу ли я напрямую использовать геттеры в v-модели?
2-й вариант. Я хочу хранить все ответы пользователей в магазине



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Getter от pinia в конце концов является вычисляемым значением состояния. Вы должны не использовать вычисляемое значение в качестве v-модели. Особенно, когда в пинии сейчас нет геттера и сеттера для геттера.
Если getFormsInput предназначен только для возврата определенного свойства json. Я предлагаю вам изменить состояние напрямую, обратившись к formsResponses.form1.input1.
<template>
<input type = "text" name = "input_form" v-model = "userStore.formsResponses.form1.input1"/>
<button type = "Primary" @click = "submit">submit</button>
</template>
<script setup>
import { computed, ref } from 'vue';
import useUserStore from '@/store/userStore';
const userStore = useUserStore();
function submit() {
console.info(userStore.formsResponses.form1.input1); //they should be the same
console.info(userStore.getFormsInput); //they should be the same
}
</script>
Кстати, я не думаю, что .value нужен, когда вы пытаетесь получить доступ к значению свойства json.
Теперь значение состояния не обновляется. Я сделал переменную реактивной, используя вычисляемый.
Я обновил ответ. Были опечатки и неправильное имя переменной.
Я считаю, что вы сделали опечатку здесь.
const responses = computed(() => userStore.getFormsInput);
responses.value.input1 = input.value; //typo responses
function submit() {
console.info(responses.value.input1); // typo responses
}
Существует много способов двойной привязки состояния хранилища к входным данным формы (используя записываемый объект, вычисляемый непосредственно в состоянии хранилища, используя storeToRefs или используя перезаписываемый объект, вычисляемый с помощью геттера хранилища и действия, и это лишь некоторые из них).
Запись состояния хранилища с использованием Writable Computed (также известного как вычисляемый геттер/сеттер) дает вам контроль и удобочитаемость кода:
const myInput = computed({
get() {
return someStore.someState
},
set(val) {
someStore.someState = val
}
})
Вам это не нужно здесь, но вы обнаружите, что это хлеб с маслом сложных форм, особенно когда вам нужен детальный контроль.
Примечательно, что pinia дает вам отличную служебную функцию, называемую storeToRefs, которая предоставляет все состояния хранилища и геттеры как реактивные refs. Состояние можно напрямую использовать с v-model:
<script setup>
import { useUserStore } from "../store";
import { storeToRefs } from "pinia";
const { form1 } = storeToRefs(useUserStore());
</script>
<template>
<input v-model = "form1.input1" />
</template>
Смотрите, работает. Ввод в основном записывается непосредственно в состояние хранилища.
Если вы хотите связать геттер магазина с v-model, у него должен быть сеттер (как показано выше).
Примечание: я значительно сократил структуру вашего магазина. Старайтесь не усложнять без веской причины.
Если вам нужно локальное состояние формы (и пользователь должен выбрать, когда сохранять/сбрасывать):
Пример состояния локальной формы.
Опять же, убран ненужный пух/шаблон.
Обратите внимание на деструктуризацию, используемую в двух точках соприкосновения между состоянием хранилища и локальным состоянием. Вы могли бы подумать, что задание submit может быть:
form1.value = localForm
..., но как только вы это сделаете, реактивность localForm привязывается к состоянию хранилища, и каждый ввод пользователя сохраняется в хранилище без submit().
Ссылки по теме:
1 - необходимо использовать Программа установки хранит синтаксис, чтобы иметь "доступные для записи геттеры".
В том, что вы опубликовали, неясно, чего вы хотите достичь: ① вам нужно локальное состояние в компоненте формы, которое сохраняется в хранилище pinia только при нажатии кнопки «Отправить» (так что пользователь может иметь кнопку «Сброс» для сброса форма в состояние магазина) или ② вы хотите, чтобы форма была подключена к магазину, и все вводимые пользователем данные должны автоматически сохраняться в магазине. Который из них?