当前位置:首页 > 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 提交数据:

vue实现问卷

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实现handsontable

vue实现handsontable

Vue 中实现 Handsontable 要在 Vue 项目中集成 Handsontable,可以使用官方提供的 @handsontable/vue 封装库。以下是一个完整的实现步骤。 安装依赖 确…

vue 实现modal

vue 实现modal

Vue 实现 Modal 的方法 使用 Vue 原生组件 通过 Vue 的组件系统可以轻松实现 Modal。创建一个可复用的 Modal 组件,通过 props 控制显示与隐藏。 <templ…

vue实现分栏

vue实现分栏

Vue实现分栏的常见方法 使用CSS Flexbox布局 通过Flexbox可以快速实现分栏效果,适合大多数响应式布局场景 <template> <div class="con…

vue实现滚屏

vue实现滚屏

实现滚屏的基本方法 在Vue中实现滚屏效果可以通过多种方式完成,常见的有原生JavaScript滚动方法、第三方库或CSS动画。以下是几种常见实现方式: 使用window.scrollTo或Elem…

vue实现转页面

vue实现转页面

Vue 实现页面跳转的方法 在 Vue 中实现页面跳转通常可以通过以下几种方式完成,具体取决于项目结构和需求。 使用 router-link 组件 router-link 是 Vue Router…

vue实现页面切换

vue实现页面切换

Vue 实现页面切换的方法 在 Vue 中实现页面切换通常可以通过以下几种方式完成,具体选择取决于项目需求和架构设计。 使用 Vue Router Vue Router 是 Vue.js 官方推荐的…