当前位置:首页 > VUE

vue实现问卷

2026-01-12 10:16:15VUE

Vue 实现问卷系统

使用 Vue 实现问卷系统可以通过组件化开发、动态表单绑定和数据管理来实现。以下是关键步骤和代码示例:

基础项目结构

安装 Vue 和必要依赖(如需要状态管理可添加 Vuex):

npm install vue@next vue-router

问卷组件设计

创建动态问题组件 Question.vue

<template>
  <div class="question">
    <h3>{{ question.text }}</h3>
    <div v-if="question.type === 'radio'">
      <label v-for="option in question.options" :key="option">
        <input 
          type="radio" 
          v-model="selectedAnswer" 
          :value="option"
        >
        {{ option }}
      </label>
    </div>
    <div v-else-if="question.type === 'checkbox'">
      <label v-for="option in question.options" :key="option">
        <input 
          type="checkbox" 
          v-model="selectedAnswers" 
          :value="option"
        >
        {{ option }}
      </label>
    </div>
    <input 
      v-else 
      type="text" 
      v-model="selectedAnswer"
      placeholder="请输入答案"
    >
  </div>
</template>

<script>
export default {
  props: {
    question: {
      type: Object,
      required: true
    }
  },
  data() {
    return {
      selectedAnswer: '',
      selectedAnswers: []
    }
  }
}
</script>

问卷页面集成

主问卷页面 Survey.vue

vue实现问卷

<template>
  <div class="survey">
    <Question 
      v-for="(q, index) in questions" 
      :key="index" 
      :question="q"
      @update:answer="updateAnswer(index, $event)"
    />
    <button @click="submitSurvey">提交问卷</button>
  </div>
</template>

<script>
import Question from './Question.vue'

export default {
  components: { Question },
  data() {
    return {
      questions: [
        {
          text: "您的年龄段是?",
          type: "radio",
          options: ["18岁以下", "18-25岁", "26-35岁", "36岁以上"]
        },
        {
          text: "您喜欢哪些编程语言?(多选)",
          type: "checkbox",
          options: ["JavaScript", "Python", "Java", "C++"]
        },
        {
          text: "请留下您的建议:",
          type: "text"
        }
      ],
      answers: []
    }
  },
  methods: {
    updateAnswer(index, answer) {
      this.$set(this.answers, index, answer)
    },
    submitSurvey() {
      console.log('提交的答案:', this.answers)
      // 这里添加提交到后端的逻辑
    }
  }
}
</script>

状态管理(可选)

对于复杂问卷系统,可使用 Pinia/Vuex 管理状态:

// stores/survey.js (Pinia示例)
import { defineStore } from 'pinia'

export const useSurveyStore = defineStore('survey', {
  state: () => ({
    questions: [],
    currentAnswers: []
  }),
  actions: {
    async loadQuestions() {
      // 从API加载问题
    },
    saveAnswer(questionId, answer) {
      // 保存答案逻辑
    }
  }
})

路由配置

router/index.js 中配置问卷路由:

const routes = [
  {
    path: '/survey',
    component: () => import('../views/Survey.vue')
  }
]

样式优化

添加基础样式增强用户体验:

vue实现问卷

/* Survey.vue 样式部分 */
.survey {
  max-width: 600px;
  margin: 0 auto;
  padding: 20px;
}
.question {
  margin-bottom: 30px;
  padding: 15px;
  border: 1px solid #eee;
  border-radius: 5px;
}
button {
  padding: 10px 20px;
  background: #42b983;
  color: white;
  border: none;
  border-radius: 4px;
  cursor: pointer;
}

进阶功能实现

分页问卷加载:

// 在Survey.vue的data中添加
currentPage: 0,
pageSize: 3,

// 计算属性
paginatedQuestions() {
  const start = this.currentPage * this.pageSize
  return this.questions.slice(start, start + this.pageSize)
}

表单验证:

// Question.vue中添加
watch: {
  selectedAnswer(val) {
    this.$emit('validate', !!val)
  }
}

后端集成示例

使用 axios 提交数据:

methods: {
  async submitSurvey() {
    try {
      const response = await axios.post('/api/survey', {
        answers: this.answers
      })
      console.log('提交成功', response.data)
    } catch (error) {
      console.error('提交失败', error)
    }
  }
}

该实现提供了问卷系统的核心功能,包括动态问题渲染、答案收集和提交。可根据实际需求扩展问题类型、添加跳转逻辑或结果分析功能。

标签: 问卷vue
分享给朋友:

相关文章

vue卖座网实现

vue卖座网实现

Vue 卖座网实现 项目结构搭建 使用 Vue CLI 快速初始化项目,安装必要依赖如 Vue Router、Vuex、Axios。 创建核心目录结构:components(通用组件)、views(页…

vue实现点击页面切换

vue实现点击页面切换

实现点击页面切换功能 在Vue中实现点击页面切换功能,可以通过路由跳转或组件动态渲染两种方式完成。以下是具体实现方法: 使用Vue Router实现页面跳转 安装Vue Router后,在项目中…

vue实现setinterval

vue实现setinterval

在 Vue 中使用 setInterval Vue 中可以通过生命周期钩子和方法结合 setInterval 实现定时任务。以下是一个完整的实现示例: <template> <…

vue实现心电图

vue实现心电图

Vue 实现心电图效果 在 Vue 中实现心电图效果通常需要结合 Canvas 或 SVG 进行动态绘图,模拟心电图数据的实时变化。以下是两种实现方式的核心思路和代码示例: 使用 Canvas 绘制…

vue实现影院

vue实现影院

Vue实现影院功能的基本思路 使用Vue框架开发影院功能需要结合前端组件化开发、状态管理以及后端API交互。以下是关键实现步骤: 影院页面布局设计 影院页面通常分为顶部导航栏、影院列表区域和底部导航…

vue实现 treegrid

vue实现 treegrid

Vue 实现 TreeGrid 的方法 使用现成组件库 Element UI、Ant Design Vue 等流行组件库提供了现成的 TreeTable/TreeGrid 组件,可直接使用。 El…