当前位置:首页 > VUE

vue实现问卷题目

2026-01-17 22:23:51VUE

Vue 实现问卷题目

数据模型设计

使用 Vue 的响应式特性管理问卷数据,通常设计为嵌套结构:

data() {
  return {
    questionnaire: {
      title: "用户满意度调查",
      questions: [
        {
          id: 1,
          type: "radio", // 单选/多选/文本等
          title: "您对产品满意度如何?",
          options: ["非常满意", "满意", "一般", "不满意"],
          required: true
        },
        {
          id: 2,
          type: "textarea",
          title: "请提出改进建议:",
          required: false
        }
      ]
    },
    answers: {} // 存储用户回答
  }
}

动态组件渲染

根据题目类型渲染不同输入组件:

<template>
  <div v-for="q in questionnaire.questions" :key="q.id">
    <h3>{{ q.title }}<span v-if="q.required">*</span></h3>

    <!-- 单选 -->
    <div v-if="q.type === 'radio'">
      <label v-for="opt in q.options" :key="opt">
        <input 
          type="radio" 
          v-model="answers[q.id]" 
          :value="opt"
          :required="q.required">
        {{ opt }}
      </label>
    </div>

    <!-- 文本输入 -->
    <textarea 
      v-else-if="q.type === 'textarea'"
      v-model="answers[q.id]"
      :required="q.required">
    </textarea>
  </div>
</template>

表单验证

通过计算属性或方法实现验证:

computed: {
  isValid() {
    return this.questionnaire.questions.every(q => {
      return !q.required || this.answers[q.id]?.trim()
    })
  }
}

提交处理

异步提交时处理数据:

methods: {
  async submit() {
    if (!this.isValid) return alert("请完成必填项");

    const payload = {
      questionnaireId: this.questionnaire.id,
      answers: this.answers
    };

    try {
      await api.submitSurvey(payload);
      this.$router.push('/thank-you');
    } catch (error) {
      console.error("提交失败:", error);
    }
  }
}

高级功能实现

题目逻辑跳转
通过 watch 监听答案变化:

watch: {
  answers: {
    handler(newVal) {
      if (newVal[1] === "不满意") {
        this.showFollowUpQuestion = true;
      }
    },
    deep: true
  }
}

拖拽排序
使用 vue-draggable 库:

<draggable 
  v-model="questionnaire.questions" 
  @end="saveQuestionOrder">
  <!-- 题目列表 -->
</draggable>

实时保存
添加防抖自动保存:

vue实现问卷题目

import { debounce } from 'lodash';

created() {
  this.debouncedSave = debounce(this.saveDraft, 3000);
},

watch: {
  answers: {
    handler() {
      this.debouncedSave();
    },
    deep: true
  }
}

标签: 问卷题目
分享给朋友:

相关文章

vue实现插入题目

vue实现插入题目

Vue 实现插入题目的方法 在 Vue 中实现插入题目功能,通常需要结合表单绑定、动态渲染和数据管理。以下是几种常见的实现方式: 使用 v-model 绑定表单输入 通过 v-model 实现题目数…

css制作题目

css制作题目

CSS 制作题目示例 以下是一些常见的 CSS 题目示例,涵盖基础到进阶的内容,适合练习和测试 CSS 技能。 基础题目 题目 1:设置文本颜色和字体大小 编写 CSS 代码,将所有 <p&g…

vue 实现问卷

vue 实现问卷

Vue 实现问卷系统 基础结构搭建 使用 Vue CLI 或 Vite 初始化项目,安装必要依赖(如 vue-router、element-ui 等)。创建以下核心组件: Questionnaire…

vue实现问卷联动

vue实现问卷联动

Vue 实现问卷联动功能 问卷联动是指根据用户的选择动态显示或隐藏相关问题,通常用于复杂表单场景。Vue 的响应式特性和条件渲染非常适合实现这种需求。 数据驱动设计 使用 Vue 的 data 或…

vue实现问卷星

vue实现问卷星

Vue 实现问卷星功能 项目初始化 使用 Vue CLI 或 Vite 创建一个新的 Vue 项目,确保安装了必要的依赖项如 vue-router 和 element-ui(可选)。 通过 npm 或…

vue实现问卷题目

vue实现问卷题目

Vue 实现问卷题目 在 Vue 中实现问卷题目可以通过组件化和响应式数据管理来完成。以下是实现问卷题目的关键步骤和代码示例。 数据结构设计 问卷数据通常包含题目列表、题目类型(单选、多选、填空等)…