#vue.js #vuejs3
#vue.js #vuejs3
Вопрос:
Я пытаюсь создать многоступенчатую форму с помощью composition api. В vue 2 я делал это таким образом
email: {
get() {
return this.$store.state.email
},
set(value) {
this.$store.commit("setEmail", value)
}
},
Теперь у меня есть собственное хранилище, я создал это вычисляемое свойство для передачи моему компоненту stEmail: computed(() => state.email)
. Как я могу на самом деле использовать это в get set?
Я пытаюсь сделать что-то подобное, но полностью не работает.
let setMail = computed(({
get() {
return stEmail;
},
set(val) {
stEmail.value = val;
}
}))
const state = reactive({
email: "",
})
export function useGlobal() {
return {
...toRefs(state),
number,
}
}
Или есть лучший способ сейчас создавать многоступенчатые формы?
Ответ №1:
Вы можете сделать то же самое с Composition API. Импорт useStore
из vuex
пакета и computed
из vue
:
import { computed } from 'vue';
import { useStore } from 'vuex';
А затем используйте его в своей setup()
функции следующим образом:
setup: () => {
const store = useStore();
const email = computed(() => ({
get() {
return store.state.email;
},
set(value) {
store.commit("setEmail", value);
}
});
return { email };
}
Если вы хотите избежать использования vuex
, вы можете просто определить переменные с ref()
помощью и экспортировать их в обычный файл JavaScript. Это сделало бы ваше состояние повторно используемым в нескольких файлах.
state.js
export const email = ref('initial@value');
Form1.vue / Form2.vue
<template>
<input v-model="email" />
</template>
<script>
import { email } from './state';
export default {
setup() {
return { email };
}
};
</script>
Комментарии:
1. Что такое
useGlobal
и почему вы создаете свое собственное решение, когда оно естьvuex
?2. Потому что я не использую vue 2, и все говорят, что vuex ужасен для composition api, потому что comp api позволяет создавать собственные составные файлы.
3. Я добавил пример с общим локальным состоянием без использования
vuex
.4. И это все? для этого требуется только v-model? Не исчезнет ли состояние, когда я перейду на следующую страницу?
5. Использование
computed(() => ({
с анонимной функцией не сработало для меня, мне пришлось опустить анонимную функцию, чтобы она работалаconst email = computed({ get() { return store.state.email; }, set(value) { store.commit("setEmail", value); } });
Ответ №2:
Как указал Грегор, принятый ответ включал анонимную функцию, которая, похоже, не работает, но она будет работать, если вы просто избавитесь от этой части. Вот пример использования <script setup>
SFC
<script setup>
import { computed } from 'vue'
import { useStore } from 'vuex'
const store = useStore()
const email = computed({
get() {
return store.state.email
},
set(value) {
store.commit("setEmail", value)
}
})
</script>
<template>
<input type="email" v-model="email" />
</template>