Динамический рендеринг с V-If

#vue.js

Вопрос:

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

Я новичок в vue (и кодировании), но я думаю, что хочу использовать v-if, но, похоже, я не могу вернуть значения обратно в поле v-if.

Если выбран ЖУРНАЛ типов, то метод устанавливает typeIsMagazine в значение TRUE, а другие селекторы типов-в значение FALSE. Я ожидал бы, что, как только typeIsMagazine будет установлен в значение true, тогда сработает v-if и будут показаны поля формы.

Метод запускается, и я тестирую его с помощью консоли.войдите, чтобы я знал, что функции if работают. Я просто не думаю, что его вернут в в-если.

 <template>
<form @submit.prevent="handleSubmit">
 <label class="main">Type:</label>
 <div class="type-row">
  <div class="sub-column">
    <div
      class="sub"
      @click="updateType('auto_stories')"
      :class="{ selected: type === 'auto_stories' }"
    >
      Book
    </div>
  </div>
  <div class="sub-column">
    <div
      class="sub"
      @click="updateType('article')"
      :class="{ selected: type === 'article' }"
    >
      Article
    </div>
  </div>
  <div class="sub-column">
    <div
      class="sub"
      @click="updateType('website')"
      :class="{ selected: type === 'website' }"
    >
      Website
    </div>
  </div>
</div>
<template v-if="typeIsWebsite">
  <label class="main">Website:</label>
  <input type="text" class="text" v-model="url" required />
</template>
<template v-if="typeIsArticle">
  <label class="main">Magazine:</label>
  <input type="text" class="text" v-model="magazine" required />
</template>

<button class="form">Add Entry</button>
</form>
</template>

<script>
 export default {
data() {
return {
  typeIsWebsite: false,
  typeIsArticle: false,
  typeIsBook: false,
};
},
methods: {

updateType(typeSelect) {
  this.type = typeSelect;
  let typeIsWebsite = false;
  let typeIsBook = false;
  let typeIsArticle = false;

  if (typeSelect === "website") {
    typeIsWebsite = true;
    typeIsArticle = false;
    typeIsBook = false;
  } else if (typeSelect === "article") {
    typeIsWebsite = false;
    typeIsArticle = true;
    typeIsBook = false;
  } else if (typeSelect === "auto_stories") {
    typeIsWebsite = false;
    typeIsArticle = false;
    typeIsBook = true;
  }
  return typeIsWebsite, typeIsArticle, typeIsBook;
 },
 

Ответ №1:

В updateType , ваши переменные typeIsWebsite typeIsBook , и т.д. объявляются как локальные переменные с помощью let. Таким образом, при выполнении вы if обновляете локальные переменные , а не переменные экземпляра вашего компонента. Чтобы исправить это, удалите typeIsX объявления переменных в updateType и используйте this.typeIsX для ссылки на каждую переменную. Вот так:

 updateType(typeSelect) {
  this.type = typeSelect;

  if (typeSelect === "website") {
    this.typeIsWebsite = true;
    this.typeIsArticle = false;
    this.typeIsBook = false;
  } else if (typeSelect === "article") {
    this.typeIsWebsite = false;
    this.typeIsArticle = true;
    this.typeIsBook = false;
  } else if (typeSelect === "auto_stories") {
    this.typeIsWebsite = false;
    this.typeIsArticle = false;
    this.typeIsBook = true;
  }
 }
 

Наконец, функции не нужно ничего возвращать.

В качестве дополнительного совета обратите внимание, что это действительно подробный код, и, по крайней мере, в вашем случае использования вам не нужны все флаги. Достаточно было бы просто сохранить текущий тип в виде строки, а затем сравнить его с этим. Например: this.typeIsWebsite эквивалентно this.type === 'website' .

Помните: чем меньше кода, тем меньше ошибок!