#vue.js
#vue.js
Вопрос:
Итак, у меня есть два компонента, которые импортируются в мое приложение.vue:
<script>
import Leaderboard from "./components/Comp1.vue";
import Search from "./components/Comp2.vue";
export default {
name: "App",
components: {
Comp1,
Comp2,
},
}
Эти компоненты вызываются, когда я нажимаю на соответствующую кнопку. Все это работает нормально.
Но в компонентах у меня есть несколько полей ввода, таких как в Comp1.vue:
<template>
<div>
<select
class="form-select"
name="event"
id=""
v-model="selectedEvent"
>
<option value="">Please choose an event:</option>
<option v-for="event in eventsList" :key="event">
{{ event }}
</option>
</select>
</div>
</template>
<script>
data: function () {
return {
selectedEvent: "",
</script>
Здесь я могу выбрать, какое событие смотреть. Но после переключения на Comp2, а затем снова выбора Comp1, selectedEvent
пусто. Очевидно, потому что он определен пустым data
.
Есть ли какой-либо способ сохранить выбранное значение в переменной сеанса или вы предпочитаете другой метод?
Комментарии:
1. можете ли вы также добавить скриншот вашего пользовательского интерфейса?
2. Вы можете использовать
local storage
для сохранения выбранного вами значения, или вы также можете использоватьvuex
библиотеку для поддержания состояния.3. Вы также можете использовать a
keep-alive
для своих компонентов, чтобы запомнить их последнее состояние, подробнее здесь: vuejs.org/v2/guide /…4. @TobiasSchnier — если вы создаете форму, подобную вещи с несколькими страницами, тогда лучше иметь ее в качестве основного объекта в родительском без загрузки вашего клиента [localStorage]
5. Я добавил решение для того же
Ответ №1:
Вы можете сохранить объект в своем родительском объекте, который вы можете передать в качестве реквизита реквизиту, а затем выполнить двустороннее рукопожатие
<Leaderboard :formInputs="formInputs"></Leaderboard>
<script>
import Leaderboard from "./components/Comp1.vue";
import Search from "./components/Comp2.vue";
export default {
name: "App",
components: {
Comp1,
Comp2,
},
data() {
return {
formInputs: {
compOneInput: '',
compTwpInput: ''
}
},
methods: {
updateData(payload) {
this.formInputs[payload.key] = payload.value;
}
}
а затем передайте этот formInputs вашему дочернему компоненту, откуда
вы можете вносить изменения всякий раз, когда вы обновляете ввод внутри этого
<template>
<div>
<select
class="form-select"
name="event"
id=""
v-model="selectedEvent"
>
<option value="">Please choose an event:</option>
<option v-for="event in eventsList" :key="event">
{{ event }}
</option>
</select>
</div>
</template>
<script>
export default {
data: function () {
return {
selectedEvent: this.formInputs.compOneInput ? this.formInputs.compOneInput : '',
}
},
watch: {
formInputs(newVal) {
this.selectedEvent = newVal.compOneInput;
},
selectedEvent(newVal, oldVal) {
if(newVal !== oldVal) {
this.$emit('updateData', {key: compOneInput, value: this.selectedEvent});
}
}
}
props: {
formInputs: Object
}
}
</script>
Используя приведенный выше пример для первого компонента, вы можете реализовать то же самое и для второго компонента
Ответ №2:
вы можете добавить наблюдателя на selectedEvent, а затем сохранить данные в хранилище vuex