首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >VUEJS: for循环中的模型未更改

VUEJS: for循环中的模型未更改
EN

Stack Overflow用户
提问于 2020-09-25 00:19:29
回答 3查看 49关注 0票数 0

V型模型:“question.answer”对于每个循环都是相同的。

rating_questions的内容是:

代码语言:javascript
运行
复制
    rating_question = [
    {
        "id":1,
        "question":"How did you like this?",
        "amount_of_stars":8,
        "answer":0
    },
    {
        "id":2,
        "question":"Second question?",
        "amount_of_stars":3,
        "answer":0
    }]

当我为第一个问题选择答案时,答案会保存在rating_question[0].answer中,但如果我为第二个问题选择答案,答案也会保存在rating_question[0].answer中,而不是像我预期的那样保存在rating_questions[1].answer中。

代码语言:javascript
运行
复制
<template>
    <div class="ratings">
        <div class="rating" v-for="(question, index) in rating_questions">
            <div class="question">
                {{ question.question }}
            </div>

            <div class="answer">
                <div class="rating-stars">
                    <span v-for="i in question.amount_of_stars">
                        <input :id="i" name="rating" v-model="question.answer" type="radio" :value="i" class="radio-btn hide" />
                        <label :for="i" >☆</label>
                    </span>
                    {{ rating_questions[index]['answer'] }}
                    {{index}}
                    <div class="clear"></div>
                </div>
            </div>  

        </div>
        <span class="input-group-btn">
            <button class="btn btn-primary btn-sm" id="btn-chat" @click="sendRating">
                Send
            </button>
        </span>
    </div>
</template>

<script>
    export default {
        props: ['user', 'event', 'rating_questions'],

        methods: {
            sendRating() {
                this.$emit('ratingsent', {
                    rating_questions: this.rating_questions
                });
            }
        }    
    }
</script>
EN

回答 3

Stack Overflow用户

发布于 2020-09-25 00:36:21

你的问题不在于Vue的使用,而在于你如何使用<input><label>元素……

<input> id<label> for属性被分配了简单的数字1..question.amount_of_stars...which意味着每个问题的第一个组合将有id = 1,第二个2等等。此外,你对每个组合都使用相同的name

现在,如果你点击第二个问题中的标签(星号),浏览器只需在第一个问题上切换活动组合框。

试试这个:

代码语言:javascript
运行
复制
<input :id="`rating-${question.id}-${i}`" :name="`rating-${question.id}`" v-model="question.answer" type="radio" :value="i" class="radio-btn hide" />
<label :for="`rating-${question.id}-${i}`" >☆</label>

现在:

  • 组中的每个组合(单个问题)将具有相同的 name (确定!)
  • 每个组合(及其对应的标签)将具有不同的代码(确定!)

< id >F219>

此外,通常将:keyv-for一起使用会更好

代码语言:javascript
运行
复制
new Vue({
  data() {
    return {
      rating_questions: [
        {
            "id":1,
            "question":"How did you like this?",
            "amount_of_stars":8,
            "answer":0
        },
        {
            "id":2,
            "question":"Second question?",
            "amount_of_stars":3,
            "answer":0
        }]
    }
  }
}).$mount("#app")
代码语言:javascript
运行
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>

<div id="app">
    <div class="ratings">
        <div class="rating" v-for="(question, index) in rating_questions" :key="question.id">
            <div class="question">
                {{ question.question }}
            </div>

            <div class="answer">
                <div class="rating-stars">
                    <span v-for="i in question.amount_of_stars">
                        <input :id="`rating-${question.id}-${i}`" :name="`rating-${question.id}`" v-model="question.answer" type="radio" :value="i" class="radio-btn hide" />
                        <label :for="`rating-${question.id}-${i}`" >☆</label>
                    </span>
                    {{ question.answer }}
                    <div class="clear"></div>
                </div>
            </div>  

        </div>
    </div>
</div>

票数 0
EN

Stack Overflow用户

发布于 2020-09-25 01:45:44

错误在我的输入id中...每个新问题都有相同的id。

代码语言:javascript
运行
复制
<template>
    <div class="ratings">
        <div class="rating" v-for="(question, index) in rating_questions">
            <div class="question">
                {{ question.question }}
            </div>

            <div class="answer">
                <div class="rating-stars">
                    <span v-for="i in question.amount_of_stars">

                        <input :id="'rating' + index + i" name="rating" v-model="question.answer" type="radio" :value="i" class="radio-btn hide" />
                        <label :for="'rating' + index + i" >☆</label>
                    </span>
                    <div class="clear"></div>
                </div>
            </div>  

        </div>
        <span class="input-group-btn">
            <button class="btn btn-primary btn-sm" id="btn-chat" @click="sendRating">
                Send
            </button>
        </span>
    </div>
</template>

<script>
    export default {
        props: ['user', 'event', 'rating_questions'],

        methods: {
            sendRating() {
                this.$emit('ratingsent', {
                    rating_questions: this.rating_questions
                });
            }
        }    
    }
</script>
票数 0
EN

Stack Overflow用户

发布于 2020-09-25 00:26:41

这个问题有非常简单的解决方法。

看你在修改道具。在vuejs中,道具是不应该更新的。我希望你可能在控制台中遇到了一些错误(虽然不确定,因为在我的例子中有时它也不会出现)

请使用此SFC文件

代码语言:javascript
运行
复制
<template>
  <div class="ratings">
    <!-- using the data variable rather than props -->
    <div class="rating" v-for="(question, index) in questions" :key="index">
      <div class="question">
        {{ question.question }}
      </div>

      <div class="answer">
        <div class="rating-stars">
          <span v-for="i in question.amount_of_stars" :key="i">
            <input
              :id="i"
              name="rating"
              v-model="question.answer"
              type="radio"
              :value="i"
              class="radio-btn hide"
            />
            <label :for="i">☆</label>
          </span>
          {{ questions[index]["answer"] }}
          {{ index }}
          <div class="clear"></div>
        </div>
      </div>
    </div>
    <span class="input-group-btn">
      <button class="btn btn-primary btn-sm" id="btn-chat" @click="sendRating">
        Send
      </button>
    </span>
  </div>
</template>

<script>
export default {
  props: ["user", "event", "rating_questions"],

  data() {
    return {
      questions: this.rating_questions, // because you can not change props in vuejs
    };
  },
  methods: {
    sendRating() {
      this.$emit("ratingsent", {
        rating_questions: this.questions,
      });
    },
  },
};
</script>
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64050450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档