当前位置:首页 > 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

<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')
  }
]

样式优化

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

/* 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 实现全选功能 在 Vue 中实现全选功能通常需要结合复选框的状态管理,以下是几种常见的实现方式: 使用 v-model 绑定数组 通过 v-model 绑定一个数组来管理选中的项,全选时将…

vue实现屏幕共享

vue实现屏幕共享

Vue 实现屏幕共享的方法 使用 WebRTC 和 getDisplayMedia API 通过 navigator.mediaDevices.getDisplayMedia 捕获屏幕内容,结合 We…

vue伪函数实现

vue伪函数实现

Vue 伪函数实现方法 伪函数(Mock Function)在 Vue 中常用于测试或模拟某些逻辑,以下是几种常见的实现方式: 使用 Jest 的 jest.fn() 在单元测试中,可以通过 Je…

vue如何实现放大缩小

vue如何实现放大缩小

Vue实现放大缩小功能的方法 在Vue中实现元素的放大缩小功能,可以通过CSS变换、第三方库或直接操作DOM样式来实现。以下是几种常见的方法: 使用CSS transform属性 通过绑定Vue的…

vue实现压缩上传文件

vue实现压缩上传文件

压缩上传文件的实现方法 在Vue中实现文件压缩和上传功能,可以通过以下步骤完成。该方法结合了前端文件压缩库和HTTP请求,确保文件在上传前被有效压缩。 安装必要的依赖 需要使用compressorj…

vue实现横向导航

vue实现横向导航

vue实现横向导航的方法 使用Flex布局实现横向导航 在Vue中可以通过Flex布局快速实现横向导航。创建一个组件,使用display: flex和flex-direction: row属性使导航项…