vue实现答题功能一页一题并最后得出分数

  1. 实现效果如图
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

每点下一题会切换题目,知道最后一题变为完成答题,然后进入答题完成页面显示分数
2.template代码

<template>
  <div class="second"> 
    <div class="back" style="padding-top:10px" @click="$router.back(-1)">
      <i class="iconfont icon-jiantou" style="margin-left: 10px; display: block; font-size: 23px;color:rgb(203, 204, 204)"></i>
    </div>
    <div class="dati">
    <!-- 问卷题 -->
    <div v-for="(item, index) in questionList" :key="item.id" >
      <!-- 测试 -->
      <div class="test-content" v-if="index == page">
      //这是根据每道题的id在头部显示第几题
        <div class="test-title" v-if="item.id == 1">第一题</div>
        <div class="test-title" v-if="item.id == 2">第二题</div>
        <div class="test-title" v-if="item.id == 3">第三题</div>
        <div class="test-title" v-if="item.id == 4">第四题</div>
        <div class="test-title" v-if="item.id == 5">第五题</div>
        <div class="test-title" v-if="item.id == 6">第六题</div>
       
		//题号+题目
        <div class="content-title">{{ index + 1 }}.{{ item.title }}</div>
		//四个选项,我这里item代表从后端获取到的所有题数组
        <van-radio-group v-model="radio">
          <van-radio :name="item.a " class="text-x">{{
            item.a
          }}</van-radio>
          <van-radio :name="item.b " class="text-x">{{
            item.b
          }}</van-radio>
          <van-radio :name="item.c " class="text-x">{{
            item.c
          }}</van-radio>
          <van-radio :name="item.d " class="text-x">{{
            item.d
          }}</van-radio>
         
        </van-radio-group>
		//进入下一题
        <div class="btn">
         
          <div
            class="next"
            @click="toNext(index, item.id)"
            v-if="isShow"
            :class="index == 0 ? 'next' : 'before-next'"
            
          >
            <span class="spa">下一题</span>
          </div>

          <!-- 提交 -->
          <div
            class="tijiao"
            v-if="!isShow"
            @click.prevent="getCode"
            :class="index == 0 ? 'next' : 'before-next'"
          >
           <span class="spa"> 完成答题</span>
          </div>
        </div>
      </div>
    </div>
    </div>
  </div>
</template>

3.API接口内容

//pk答题(获取所有题)
export const getQuest = () => axios.get("/api/v1/pub/questionAll")
//答题(将所得分数score传给后端)
export const getScore = (score,token)=> axios.get("/api/v1/pri/user/putResult",{
    params:{//请求头,我这里后端需要携带token
        "token":token,
        score:score
    }
})

2.script代码

 <script>
 //访问后端接口,来得到所有题数组,以及将得到的最终得分传给后端保存起来
import { getQuest,getScore } from "@/api/getData.js";
export default {
//缓存,获取到vuex中保存的token,可以看
//https://blog.csdn.net/weixin_51935690/article/details/117167797?spm=1001.2014.3001.5502
//来如何保存token
    computed: {
    getToken() {
      return this.$store.state.token;
    }
  },
  name: "SecondQuestionnaire",
  data() {
    return {
         // 获取问卷数据
      questionList:[],
      // 当前页
      page: 0,
      // 选项
      radio: "",
      // 题目的id
      ids: [],
      // 分数
      score:0,
      // 存放每一题的id和num
      questionInfos: [],
      // 当前题目的序号等于当前题目的条数
      isShow: true,
    };
  },
  mounted(){
      //页面渲染完成调用方法获取数据
      this.getQuestion();
  },
  methods: {
    // 获取问卷数据
    async getQuestion() {
        try{
               const result =  await getQuest()
               console.log(result);
               if(result.data.code == 0){
                   this.questionList = result.data.data;
                   console.log(this.questionList);
               }

            }catch(error){
                console.log(error)
            }
    },

    // 点击下一题
    toNext(index, id) {
        console.log(this.page);
      // 2. 保存答题数据
      let question = { ids: this.radio.slice(0)};
      this.questionInfos[index] = question;
	//每一道题10分,得到选项后判断与后端传来的答案是否一致。一致+10分,不一致不加分
      if (this.questionInfos[index].ids==this.questionList[index].answer) {
        this.score=this.score+10;
        console.log(this.score);
      }else{
         this.score=this.score+0;
        console.log(this.score);
      }
      // 3. 索引+1;
      index++;
      // 5. page ++
      this.page++;
      console.log(this.page);
      // 6. 其他(如按钮隐藏)
      // 当前页等于最后一题 下一题按钮隐藏
      if (this.page == this.questionList.length - 1) {
        return (this.isShow = false);
      } else {
        return (this.isShow = true);
      }
    },

    // 点击提交
    async submit(n) {
      alert(this.score)
     async getCode () {
          // 发送ajax请求(携带token和score分数)
          const result = await getScore(this.score,this.getToken)
          console.log(result);
          // 根据结果数据处理
        if(result.data.code===0) {
          // 去分数界面
          this.$router.replace('/score')
        } else {
          // 显示警告提示
          console.log("答题失败");
        }
      },
  },
};
</script>
  • 2
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: 可以使用Vue2中提供的v-if,v-for和v-show指令来实现一题一题答题功能。首先,可以使用v-for指令来遍历所有的题目,然后使用v-if和v-show指令来控制显示哪一题最后,可以使用v-on指令来处理上一题一题按钮的点击事件,从而实现一题一题答题功能。 ### 回答2: 要使用Vue2实现一题一题答题功能,可以按照以下步骤进行: 1. 创建题目数据:首先,我们需要创建一个题目的数据集合,可以使用数组或对象的形式存储题目相关的信息,例如题目的编号、题目的内容、题目的选项和正确答案等。 2. 建立题目组件:创建一个题目组件,通过props接收上一题和下一题的题目数据,并将当前题目的信息展示出来。在组件中使用v-model指令来绑定用户的答案,这样可以将用户输入的答案保存在组件的data属性中。 3. 控制题目切换:在父组件中创建一个题目的容器组件,并使用v-for指令遍历题目数据集合,并将题目数据传递给子组件。通过按钮或其他交互方式,可以控制题目的切换,切换到下一题时将当前题目的答案保存到一个数组中,切换到上一题时将数组中的上一题答案显示出来。 4. 添加答题逻辑:在题目组件中添加答题逻辑,判断用户选择的答案是否与题目的正确答案一致,根据判断结果展示不同的提示信息。 5. 添加分页功能:如果题目较多,可以考虑添加分页功能,通过计算当前题目的索引位置,动态切换题目组件的显示,使用户只能看到当前页的题目。 总结:通过以上步骤,我们可以使用Vue2来实现一题一题答题功能。通过题目组件间的数据传递和控制,以及答题逻辑的处理,可以实现答题过程的流畅切换和正确答案的展示。 ### 回答3: 要使用Vue2实现一题一题答题功能,可以按照以下步骤进行: 1. 首先,在Vue组件中设置一个题目列表的数据,每个题目有一个题目文本和一组答案选项。可以使用一个数组来表示题目列表,每个元素是一个对象,包含题目文本和答案选项数组。 2. 在Vue的data选项中设置一个当前题目的索引值,默认为0,表示第一个题目。另外,可以设置一个布尔类型的变量来表示是否显示答案,初始值为false。 3. 在组件的模板中,通过v-if指令来根据当前题目索引值显示对应的题目和答案选项。可以使用v-for指令循环遍历题目的答案选项数组,动态生成选择题选项。 4. 为了实现一题一题功能,可以在模板中添加两个按钮,分别绑定上一题和下一题的方法。点击上一题按钮时,将当前题目索引值减1;点击下一题按钮时,将当前题目索引值加1。 5. 在上一题和下一题的方法中,需要对当前题目索引值进行边界判断,确保在题目范围内。当切换到上一题或下一题时,可以将显示答案的变量重置为false,以便用户重新选择答案。 6. 在模板中添加一个提交按钮,绑定一个提交答案的方法。在提交答案的方法中,可以根据当前题目索引值和用户选择的答案,对答案进行判断,并更新显示答案的变量为true,以显示正确答案。 7. 可以根据需要在模板中添加其他功能,比如显示当前题目号、进度条、计分等。 以上是使用Vue2实现一题一题答题功能的大致步骤,具体实现细节需要根据具体的需求和组件结构来进行调整和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值