Как новичок в Vue, я борюсь с проблемой, которую - даже это не должно быть слишком сложно - я не могу решить. Принцип такой:
Я хочу создать опрос, состоящий из разных тем. Пользователь должен иметь возможность выбирать между этими темами (компонент A и компонент B). Это прекрасно работает.
Но: когда я нажимаю кнопку «Показать компонент C», этот компонент отображается только на долю секунды. Почему это так, какую ошибку я сделал и как решить проблему?
Большое спасибо за твою помощь!
App.vue
<button @click = "setSelectedComponent('ComponentA')">Component A</button>
<button @click = "setSelectedComponent('ComponentB')">Component B</button>
<component-b
v-if = "selectedComponent === 'ComponentB'"
> </component-b>
<component-a
v-if = "selectedComponent === 'ComponentA'"
></component-a>
<start
v-if = "selectedComponent === 'form-empty'"
></start>
</template>
<script>
import ComponentB from './components/ComponentB.vue';
import ComponentA from './components/ComponentA.vue';
import Start from './components/Start.vue';
export default {
components: {
ComponentB,
ComponentA,
Start,
},
data() {
return {
selectedComponent: 'form-empty',
}
},
methods: {
setSelectedComponent(cmp) {
this.selectedComponent = cmp;
},
}
}
</script>
Start.vue
<template>
<form>
<div>
<h1>Which Component Do You Want To Select?</h1>
</div>
</form>
</template>
**
Компонент А
<template>
<form>
<h1>Component A</h1>
<div class = "form-control">
<input type = "range" min = "0" max = "100" v-model=value>
</div>
<div>
<button @click = "evaluateForm">Save Data</button>
</div>
<h4>Value: {{value}}</h4>
</form>
<component-c v-if = "varia === 'yes'"></component-c>
</template>
<script>
import ComponentC from './ComponentC.vue';
export default {
components: {
ComponentC
},
methods: {
evaluateForm() {
this.varia='yes'
}
},
computed: {
result() {
return parseInt(this.abc) + parseInt(this.cde)
}
},
data() {
return {
value: '',
varia: ''
}
}
}
</script>
Компонент B
<template>
<form>
<h1>Component B</h1>
<div>
<input type = "range" min = "0" max = "100" v-model=value>
</div>
<div>
<button @click = "evaluateForm">Save Data</button>
</div>
<h4>Value: {{value}}</h4>
</form>
<component-c v-if = "varia === 'yes'"></component-c>
</template>
<script>
import ComponentC from './ComponentC.vue';
export default {
components: {
ComponentC
},
methods: {
evaluateForm() {
this.varia='yes'
}
},
computed: {
result() {
return parseInt(this.abc) + parseInt(this.cde)
}
},
data() {
return {
value: '',
varia: ''
}
}
}
</script>
Компонент C
<template>
<form>
<div class = "form-control">
<h1>The value is: </h1>
</div>
</form>
</template>





Я тестировал это локально, и проблема связана с тем, что вы используете <form> в ComponentA и ComponentB. Если вы переключите их на <div> или <form @submit.prevent>, вы увидите, что он работает так, как вы ожидали.
Вот некоторая документация по элементу <form>, чтобы узнать больше о том, как он работает: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form
Я думаю, что мне нужно изменить значение «SelectedComponent», чтобы больше не было условий для компонентов A или B. По этой причине я попытался создать событие, чтобы переменная «SelectedComponent» в App.vue была изменена так, что условия больше не действительны для компонентов A и B. Но, к сожалению, это тоже не работает. Компонент A (или B) больше не отображается, но и компонент C. Я знаю, что мне еще есть чему поучиться. Но не могли бы вы дать мне еще один совет? Большое спасибо!
Чтобы заставить ваш исходный код работать, следуйте моему совету: переключите теги form на div или добавьте обработчик @submit.prevent на свой form. Я получил это с моей стороны.
Это работает в том смысле, что фактически отображается компонент C, но также отображается компонент A (или B). Но должен отображаться только компонент B: /
Извините, но я не знаю, что вы пытаетесь сделать. Что должно отображаться, когда я нажимаю на ComponentA Button, а затем на Save Data Button? Прямо сейчас я вижу i.imgur.com/5muOPjW.png Это то, что «должно» происходить в зависимости от того, что вы закодировали.
Я сделал его доступным для онлайн-тестирования: stackblitz.com/edit/vue3-app-lzljhy?file=src/App.vue Это работает как задумано. Если бы вы хотели сделать что-то еще, вам пришлось бы описать это более подробно.
Да, ты прав. Для меня код работает точно так же, как и для вас. Но кроме того, я просто хочу, чтобы при нажатии кнопки «Данные Sava» отображался ТОЛЬКО компонент C («Значение равно»), а не над компонентом, содержащим ползунок. И для этого я создал событие, которое должно установить переменную в App.vue при нажатии кнопки «Сохранить данные». И когда эта переменная установлена, компонент C должен отображаться. И в то же время «SelectedComponent» следует установить на другое значение, чтобы компонент A / компонент B больше не отображался.
ОК. Я рад, что смог ответить за вас на исходный вопрос. Поскольку вы новичок в StackOverflow, вы должны отметить мой ответ как ответ и создать новый вопрос, чтобы задать конкретные вопросы о новой проблеме, которую вы хотите решить.
Ради интереса я внес изменения, которые вы хотели для вашего нового вопроса, здесь: stackblitz.com/edit/vue3-app-lzljhy?file=src%2FApp.vue Я добавил несколько улучшений, чтобы упростить App.vue. Но снова отправьте новый вопрос, поскольку исходная проблема была решена.
Все чисто. Еще раз спасибо за помощь. Думаю, мне нужно немного углубиться в концепцию Vue;)
Компонент А
<template>
<div>
<h1>Component A</h1>
<div>
<input type = "range" min = "0" max = "100" v-model=value>
</div>
<div>
<button @click = "evaluateForm">Save Data</button>
</div>
<h4>Value: {{value}}</h4>
</div>
</template>
<script>
export default {
methods: {
evaluateForm() {
this.$emit('xxx');
}
},
computed: {
result() {
return parseInt(this.abc) + parseInt(this.cde)
}
},
data() {
return {
value: '',
}
}
}
</script>
App.Vue
<template>
<button @click = "setSelectedComponent('ComponentA')">Component A</button>
<button @click = "setSelectedComponent('ComponentB')">Component B</button>
<component
:is = "selectedComponent"
></component>
<component-a
@xxx = "startComponentC"
v-if = "varia === 'yes'"
></component-a>
<component-c
v-if = "varia === 'yes'"
></component-c>
</template>
<script>
import ComponentB from "./components/ComponentB.vue";
import ComponentA from "./components/ComponentA.vue";
import Start from "./components/Start.vue";
export default {
components: {
ComponentB,
ComponentA,
Start,
},
data() {
return {
selectedComponent: "start",
varia:""
};
},
methods: {
setSelectedComponent(cmp) {
this.selectedComponent = cmp;
},
startComponentC() {
this.varia = "yes"
this.selectedComponent = "stopConditionforComponentAandB"
}
},
};
</script>
Можно ли было бы где-нибудь разместить репликацию этой проблемы?