Как использовать геттеры хранилища pinia для v-модели ввода?

В моем приложении я работаю над хранением ответов пользовательской формы. Я создал магазин 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-модели?

В том, что вы опубликовали, неясно, чего вы хотите достичь: ① вам нужно локальное состояние в компоненте формы, которое сохраняется в хранилище pinia только при нажатии кнопки «Отправить» (так что пользователь может иметь кнопку «Сброс» для сброса форма в состояние магазина) или ② вы хотите, чтобы форма была подключена к магазину, и все вводимые пользователем данные должны автоматически сохраняться в магазине. Который из них?

tao 01.06.2023 10:52

2-й вариант. Я хочу хранить все ответы пользователей в магазине

learningMonk 01.06.2023 11:01
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
86
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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.

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

learningMonk 01.06.2023 04:24

Я обновил ответ. Были опечатки и неправильное имя переменной.

blackcityhenry 01.06.2023 04:34

Я считаю, что вы сделали опечатку здесь.

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 - необходимо использовать Программа установки хранит синтаксис, чтобы иметь "доступные для записи геттеры".

Другие вопросы по теме