Почему он не выбирает тот ответ, который я хочу?

#javascript #vue.js

Вопрос:

Это простое приложение для викторины Vue, я не знаю, почему это происходит:

На первом вопросе я выбираю ответ «а», затем нажимаю «Далее», и в следующем вопросе я НЕ МОГУ снова выбрать «а». Поэтому я выбираю «в», и на третий вопрос единственный ответ, который я могу выбрать, — «с».

Все работает правильно, кроме этой штуки, и я хочу это исправить.

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

Почему это происходит?

Шаблон Vue

 <template>
  <div id="app">
    <div class="flex">
      <h2 class="title">Simple Quiz</h2>
      <div class="quiz">
        <div v-if="domandaCorrente < domande.length" class="question">
          <h2>{{ domande[domandaCorrente].domanda }}</h2>

          <label
            class="answer"
            :for="index"
            v-for="(risposta, index) in domande[domandaCorrente].risposte"
            :key="index"
            :class="{
              'hover border-grey': domandaScelta == '',
              'bg-red': domandaScelta == index,
              'bg-green':
                index == domande[domandaCorrente].rispostaCorretta amp;amp;
                domandaScelta != '',
            }"
          >
            <input
              type="radio"
              :name="index"
              :id="index"
              class="hidden"
              :value="index"
              @change="select($event)"
            />
            {{ risposta }}
          </label>
        </div>
        <div v-else>
          Results
          <div>
            <h2>
              Correct Answers: <span class="t-green">{{ correct }}</span>
            </h2>
            <h2>
              Wrong Answers: <span class="t-red">{{ wrong }}</span>
            </h2>
          </div>
          <button @click="reload()">Reload</button>
        </div>
        <div
          v-show="domandaScelta != '' amp;amp; domandaCorrente < domande.length - 1"
          class="button"
        >
          <button @click="nextQuestion()">Next</button>
        </div>
        <div
          v-show="domandaScelta != '' amp;amp; domandaCorrente == domande.length - 1"
          class="button"
        >
          <button @click="showResult()">Finish</button>
        </div>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  name: "App",

  data() {
    return {
      domandaCorrente: 0,
      correct: 0,
      wrong: 0,
      domandaScelta: "",
      
      domande: [
        {
          domanda: "Quante champions ha vinto il Milan?",
          risposte: { a: "2", b: "5", c: "7", d: "10" },
          rispostaCorretta: "c",
        },
        {
          domanda: "Quante champions ha vinto l'Inter?",
          risposte: { a: "1", b: "5", c: "7", d: "10" },
          rispostaCorretta: "a",
        },
        {
          domanda: "Quante champions ha vinto la Juve?",
          risposte: { a: "2", b: "5", c: "7", d: "10" },
          rispostaCorretta: "a",
        },
      ],
      
    };
  },

  methods: {
    select(e) {
      this.domandaScelta = e.target.value;
      console.log(this.domandaScelta)
      console.log(this.domandaCorrente)
      if(this.domandaScelta == this.domande[this.domandaCorrente].rispostaCorretta) {
        this.correct  
      } else {
        this.wrong  
      }
    },

    nextQuestion() {
      this.domandaScelta = ""
      this.domandaCorrente  
    },

    showResult() {
      this.domandaCorrente  
    },

    reload() {
      this.domandaCorrente = 0
      this.domandaScelta = ""
      this.wrong = 0
      this.correct = 0
    }
  },

  components: {},
};
</script>
 

Ответ №1:

1 — Добавьте selected переменную для хранения выбранных входных данных.

Установите значение false, когда пользователь нажимает на nextQuestion кнопку .

 selected: false,
 

Установите его значение в select функции:

 this.selected = e.target.value
 

2 — В вашем html-коде проверьте checked атрибут с selected помощью . Также правильный name атрибут должен быть одинаковым для всех входных данных.

 <input type="radio" :checked="index === selected" :name="`ans-${domandaCorrente}`" :id="`ans-${index}`" class="hidden" :value="index" @change="select($event)" />
 
 var app = new Vue({
  el: '#app',
  name: "App",
  data() {
    return {
      domandaCorrente: 0,
      correct: 0,
      selected: false,
      wrong: 0,
      domandaScelta: "",
      domande: [{
          domanda: "Quante champions ha vinto il Milan?",
          risposte: {
            a: "2",
            b: "5",
            c: "7",
            d: "10"
          },
          rispostaCorretta: "c",
        },
        {
          domanda: "Quante champions ha vinto l'Inter?",
          risposte: {
            a: "1",
            b: "5",
            c: "7",
            d: "10"
          },
          rispostaCorretta: "a",
        },
        {
          domanda: "Quante champions ha vinto la Juve?",
          risposte: {
            a: "2",
            b: "5",
            c: "7",
            d: "10"
          },
          rispostaCorretta: "a",
        },
      ],
    };
  },
  methods: {
    select(e) {
      this.selected = e.target.value
      this.domandaScelta = e.target.value;
      console.log(this.domandaScelta)
      console.log(this.domandaCorrente)
      if (this.domandaScelta == this.domande[this.domandaCorrente].rispostaCorretta) {
        this.correct  
      } else {
        this.wrong  
      }
    },
    nextQuestion() {
      this.selected = false;
      this.domandaScelta = ""
      this.domandaCorrente  
    },
    showResult() {
      this.domandaCorrente  
    },
    reload() {
      this.domandaCorrente = 0
      this.domandaScelta = ""
      this.wrong = 0
      this.correct = 0
    }
  },
  components: {},
}) 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
  <div class="flex">
    <h2 class="title">Simple Quiz</h2>
    <div class="quiz">
      <div v-if="domandaCorrente < domande.length" class="question">
        <h2>{{ domande[domandaCorrente].domanda }} </h2>

        <label class="answer" :for="index" v-for="(risposta, index) in domande[domandaCorrente].risposte" :key="index" :class="{
              'hover border-grey': domandaScelta == '',
              'bg-red': domandaScelta == index,
              'bg-green':
                index == domande[domandaCorrente].rispostaCorretta amp;amp;
                domandaScelta != '',
            }">
          <input type="radio" :checked="index === selected" :name="`ans-${domandaCorrente}`" :id="`ans-${index}`" class="hidden" :value="index" @change="select($event)" />
          {{ risposta }}
        </label>
      </div>
      <div v-else>
        Results
        <div>
          <h2>
            Correct Answers: <span class="t-green">{{ correct }}</span>
          </h2>
          <h2>
            Wrong Answers: <span class="t-red">{{ wrong }}</span>
          </h2>
        </div>
        <button @click="reload()">Reload</button>
      </div>
      <div v-show="domandaScelta != '' amp;amp; domandaCorrente < domande.length - 1" class="button">
        <button @click="nextQuestion()">Next</button>
      </div>
      <div v-show="domandaScelta != '' amp;amp; domandaCorrente == domande.length - 1" class="button">
        <button @click="showResult()">Finish</button>
      </div>
    </div>
  </div>
</div> 

Ответ №2:

Попробуйте добавить v-model="domandaScelta" на вход радио:

 new Vue({
  el: '#demo',
  data() {
    return {
      domandaCorrente: 0,
      correct: 0,
      wrong: 0,
      domandaScelta: "",
      
      domande: [
        {
          domanda: "Quante champions ha vinto il Milan?",
          risposte: { a: "2", b: "5", c: "7", d: "10" },
          rispostaCorretta: "c",
        },
        {
          domanda: "Quante champions ha vinto l'Inter?",
          risposte: { a: "1", b: "5", c: "7", d: "10" },
          rispostaCorretta: "a",
        },
        {
          domanda: "Quante champions ha vinto la Juve?",
          risposte: { a: "2", b: "5", c: "7", d: "10" },
          rispostaCorretta: "a",
        },
      ],
      
    };
  },

  methods: {
    select(e) {
    console.log(e.target)
      this.domandaScelta = e.target.value;
      console.log(this.domandaScelta)
      console.log(this.domandaCorrente)
      if(this.domandaScelta == this.domande[this.domandaCorrente].rispostaCorretta) {
        this.correct  
      } else {
        this.wrong  
      }
    },

    nextQuestion() {
      this.domandaScelta = ""
      this.domandaCorrente  
    },

    showResult() {
      this.domandaCorrente  
    },

    reload() {
      this.domandaCorrente = 0
      this.domandaScelta = ""
      this.wrong = 0
      this.correct = 0
    }
  },

  components: {},
}) 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>

  <div id="demo">
    <div class="flex">
      <h2 class="title">Simple Quiz</h2>
      <div class="quiz">
        <div v-if="domandaCorrente < domande.length" class="question">
          <h2>{{ domande[domandaCorrente].domanda }}</h2>

          <label
            class="answer"
            :for="index"
            v-for="(risposta, index) in domande[domandaCorrente].risposte"
            :key="index"
            :class="{
              'hover border-grey': domandaScelta == '',
              'bg-red': domandaScelta == index,
              'bg-green':
                index == domande[domandaCorrente].rispostaCorretta amp;amp;
                domandaScelta != '',
            }"
          >
            <input
              type="radio"
              :name="index"
              :id="index"
              class="hidden"
              :value="index"
              @change="select($event)"
              v-model="domandaScelta"
            />
            {{ risposta }}
          </label>
        </div>
        <div v-else>
          Results
          <div>
            <h2>
              Correct Answers: <span class="t-green">{{ correct }}</span>
            </h2>
            <h2>
              Wrong Answers: <span class="t-red">{{ wrong }}</span>
            </h2>
          </div>
          <button @click="reload()">Reload</button>
        </div>
        <div
          v-show="domandaScelta != '' amp;amp; domandaCorrente < domande.length - 1"
          class="button"
        >
          <button @click="nextQuestion()">Next</button>
        </div>
        <div
          v-show="domandaScelta != '' amp;amp; domandaCorrente == domande.length - 1"
          class="button"
        >
          <button @click="showResult()">Finish</button>
        </div>
      </div>
    </div>
  </div>