Почему компонент отображается всего на долю секунды?

Как новичок в 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>

Можно ли было бы где-нибудь разместить репликацию этой проблемы?

RoboKozo 03.04.2021 00:08
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
64
2

Ответы 2

Я тестировал это локально, и проблема связана с тем, что вы используете <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. Я знаю, что мне еще есть чему поучиться. Но не могли бы вы дать мне еще один совет? Большое спасибо!

Marius Paul Richter 03.04.2021 13:39

Чтобы заставить ваш исходный код работать, следуйте моему совету: переключите теги form на div или добавьте обработчик @submit.prevent на свой form. Я получил это с моей стороны.

RoboKozo 03.04.2021 18:19

Это работает в том смысле, что фактически отображается компонент C, но также отображается компонент A (или B). Но должен отображаться только компонент B: /

Marius Paul Richter 03.04.2021 21:13

Извините, но я не знаю, что вы пытаетесь сделать. Что должно отображаться, когда я нажимаю на ComponentA Button, а затем на Save Data Button? Прямо сейчас я вижу i.imgur.com/5muOPjW.png Это то, что «должно» происходить в зависимости от того, что вы закодировали.

RoboKozo 04.04.2021 09:00

Я сделал его доступным для онлайн-тестирования: stackblitz.com/edit/vue3-app-lzljhy?file=src/App.vue Это работает как задумано. Если бы вы хотели сделать что-то еще, вам пришлось бы описать это более подробно.

RoboKozo 04.04.2021 09:07

Да, ты прав. Для меня код работает точно так же, как и для вас. Но кроме того, я просто хочу, чтобы при нажатии кнопки «Данные Sava» отображался ТОЛЬКО компонент C («Значение равно»), а не над компонентом, содержащим ползунок. И для этого я создал событие, которое должно установить переменную в App.vue при нажатии кнопки «Сохранить данные». И когда эта переменная установлена, компонент C должен отображаться. И в то же время «SelectedComponent» следует установить на другое значение, чтобы компонент A / компонент B больше не отображался.

Marius Paul Richter 04.04.2021 14:06

ОК. Я рад, что смог ответить за вас на исходный вопрос. Поскольку вы новичок в StackOverflow, вы должны отметить мой ответ как ответ и создать новый вопрос, чтобы задать конкретные вопросы о новой проблеме, которую вы хотите решить.

RoboKozo 04.04.2021 20:28

Ради интереса я внес изменения, которые вы хотели для вашего нового вопроса, здесь: stackblitz.com/edit/vue3-app-lzljhy?file=src%2FApp.vue Я добавил несколько улучшений, чтобы упростить App.vue. Но снова отправьте новый вопрос, поскольку исходная проблема была решена.

RoboKozo 04.04.2021 20:42

Все чисто. Еще раз спасибо за помощь. Думаю, мне нужно немного углубиться в концепцию Vue;)

Marius Paul Richter 06.04.2021 19:13

Компонент А

    <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>

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