更新记录
1.0.0(2026-09-02)
下载此版本
- 首个版本发布
- 支持六种题型:单选
single、多选 multiple、填空 fill、评分 score、下拉选择 select、日期 date
- 支持两种模式:单页
page(全部题目平铺)与分步 step(一次一题 + 进度条)
- 必答校验、答案变化即时消错、一键重置、
v-model 双向绑定
- 兼容微信 / 支付宝 / 百度 / 抖音 / 快手 / QQ 小程序、H5、App(vue),纯组件零依赖
平台兼容性
uni-app(4.87)
| Vue2 |
Vue2插件版本 |
Vue3 |
Vue3插件版本 |
Chrome |
Safari |
app-vue |
app-vue插件版本 |
app-nvue |
Android |
Android插件版本 |
iOS |
鸿蒙 |
| √ |
1.0.0 |
√ |
1.0.0 |
- |
- |
√ |
1.0.0 |
- |
√ |
1.0.0 |
- |
- |
| 微信小程序 |
微信小程序插件版本 |
支付宝小程序 |
支付宝小程序插件版本 |
抖音小程序 |
抖音小程序插件版本 |
百度小程序 |
百度小程序插件版本 |
快手小程序 |
快手小程序插件版本 |
京东小程序 |
京东小程序插件版本 |
鸿蒙元服务 |
QQ小程序 |
QQ小程序插件版本 |
飞书小程序 |
小红书小程序 |
快应用-华为 |
快应用-联盟 |
| √ |
1.0.0 |
√ |
1.0.0 |
√ |
1.0.0 |
√ |
1.0.0 |
√ |
1.0.0 |
√ |
1.0.0 |
- |
√ |
1.0.0 |
- |
- |
- |
- |
其他
fg-questionnaire 问卷调查组件
组件名:fg-questionnaire(uni_modules easycom 自动引入,也可手动引入)
版本:1.0.0
配置驱动的问卷调查 / 问卷表单组件:传入题目配置即可渲染,v-model 双向绑定答案对象。支持单选、多选、填空、评分、下拉选择、日期六种题型,单页与分步两种模式,内置必答校验、进度条、一键重置。纯组件零依赖,兼容微信 / 支付宝 / 百度 / 抖音 / 快手 / QQ 小程序、H5、App(vue)。
特性
- 六种题型:单选
single、多选 multiple、填空 fill(单行 / 多行)、评分 score(星星)、下拉选择 select、日期 date
- 两种模式:
page 单页平铺(适合短问卷)、step 分步(一次一题 + 进度条,适合长问卷)
- 必答校验:
required 题目未作答时高亮标红并提示,提交时统一校验;已答即自动消除错误提示
v-model 双向绑定:答案对象 { [questionId]: value },可初始化回显、实时获取
- 纯 view / text / input / textarea / picker 实现:自定义勾选样式,各端渲染一致,不依赖原生 radio / checkbox 的样式差异
- 主题色可配:选中项、评分星、主按钮一键换色
- 支持
disabled 整体禁用、答案回显(setAnswers / 初始 modelValue)、一键重置
快速使用
uni_modules 插件默认开启 easycom,页面中直接使用即可,无需注册:
<template>
<view class="page">
<fg-questionnaire
v-model="answers"
:questions="questions"
@submit="onSubmit"
/>
</view>
</template>
<script>
export default {
data() {
return {
answers: {},
questions: [
{
id: 'gender',
type: 'single',
title: '您的性别是?',
required: true,
optionLayout: 'wrap',
options: ['男', '女']
},
{
id: 'like',
type: 'multiple',
title: '您喜欢哪些水果?(多选)',
required: true,
options: ['苹果', '香蕉', '橘子', '葡萄']
},
{
id: 'score',
type: 'score',
title: '请为本次服务打分',
required: true,
scoreMax: 5,
scoreTexts: ['非常不满意', '非常满意']
},
{
id: 'city',
type: 'select',
title: '您所在的城市?',
required: true,
options: ['北京', '上海', '广州', '深圳']
},
{
id: 'birthday',
type: 'date',
title: '您的生日?',
options: []
},
{
id: 'suggest',
type: 'fill',
title: '您有什么建议?',
rows: 3,
maxlength: 200,
placeholder: '选填,最多 200 字'
}
]
}
},
methods: {
onSubmit(answers) {
console.log('问卷答案:', answers)
uni.showToast({ title: '提交成功', icon: 'success' })
}
}
}
</script>
手动引入
import FgQuestionnaire from '@/uni_modules/fg-questionnaire/components/fg-questionnaire/fg-questionnaire.vue'
export default {
components: { FgQuestionnaire }
}
题目配置(questions 数组每一项)
| 字段 |
类型 |
必填 |
说明 |
| id |
String |
是 |
题目唯一标识,答案对象以此作为 key |
| type |
String |
是 |
题型:single / multiple / fill / score / select / date |
| title |
String |
是 |
题目文本 |
| required |
Boolean |
否 |
是否必答,默认 false |
| remark |
String |
否 |
题目下方说明文字 |
| errorText |
String |
否 |
本题未答时的错误文案,缺省用组件级 requiredText |
| options |
Array |
按题型 |
单选 / 多选 / 下拉的选项,字符串数组或 { label, value } 对象数组(字段名可用 labelKey / valueKey 映射) |
| optionLayout |
String |
否 |
单选 / 多选选项排布:vertical 竖排(默认) / wrap 横排换行(适合"是 / 否") |
| placeholder |
String |
否 |
填空 / 下拉 / 日期的占位文案 |
| rows |
Number |
否 |
填空为多行 textarea 时的行数(>1 生效,默认 1 即单行 input) |
| maxlength |
Number |
否 |
填空输入上限,默认 -1(不限) |
| scoreMax |
Number |
否 |
评分星数(1-10),默认取组件 scoreMax(5) |
| scoreTexts |
Array |
否 |
评分两端文案,如 ['非常不满意', '非常满意'] |
| start / end |
String |
否 |
日期题可选范围 YYYY-MM-DD,缺省取组件 dateStart / dateEnd |
| labelKey / valueKey |
String |
否 |
本题对象选项的字段映射,覆盖组件级默认 |
属性说明
| 属性名 |
类型 |
默认值 |
说明 |
| modelValue |
Object |
{} |
答案对象 { questionId: value },支持 v-model |
| questions |
Array |
[] |
题目配置数组(见上表) |
| mode |
String |
'page' |
page 单页平铺 / step 分步(一次一题 + 进度条) |
| activeColor |
String |
'#3d7ef7' |
主题色:选中项、评分星、主按钮 |
| disabled |
Boolean |
false |
是否禁用整个问卷 |
| showSubmit |
Boolean |
true |
是否显示提交按钮(page 模式底部;step 模式最后一题) |
| submitText |
String |
'提交问卷' |
提交按钮文案 |
| showReset |
Boolean |
true |
是否显示重置按钮(page 模式) |
| resetText |
String |
'重置' |
重置按钮文案 |
| nextText / prevText |
String |
'下一题' / '上一题' |
分步模式切换按钮文案 |
| stepShowNum |
Boolean |
true |
分步模式是否显示"x / n"题号 |
| stepShowPercent |
Boolean |
true |
分步模式是否显示进度百分比 |
| validateOnChange |
Boolean |
true |
作答后是否即时消除该题错误标记 |
| toastError |
Boolean |
true |
校验失败是否 uni.showToast 提示 |
| toastText |
String |
'请完成必答题后再提交' |
校验失败 toast 文案 |
| requiredText |
String |
'此题必答,请作答' |
题目错误提示文案 |
| emptyText |
String |
'暂无题目' |
无题目时占位文案 |
| scoreMax |
Number |
5 |
评分题默认星数(题目级 scoreMax 优先) |
| fillPlaceholder |
String |
'请输入' |
填空默认占位 |
| selectPlaceholder |
String |
'请选择' |
下拉默认占位 |
| datePlaceholder |
String |
'请选择日期' |
日期默认占位 |
| dateStart / dateEnd |
String |
'1900-01-01' / '' |
日期题默认可选范围 |
| labelKey / valueKey |
String |
'label' / 'value' |
对象选项字段映射默认值 |
事件说明
| 事件名 |
参数 |
说明 |
| update:modelValue |
answers |
答案变化,支持 v-model |
| change |
(answers, question, value) |
某题答案变化 |
| submit |
answers |
点击提交且全部必答题已作答 |
| fail |
invalidQuestions |
校验失败,参数为未作答的必答题数组 |
| reset |
- |
点击重置(答案已清空) |
| step-change |
(index, question) |
分步模式切换题目(下一步 / 上一步) |
方法说明(ref 调用)
| 方法名 |
返回值 |
说明 |
| getAnswers() |
Object |
获取答案深拷贝 |
| setAnswers(obj) |
- |
批量设置答案(合并,不回清其他题目) |
| validate() |
{ valid, invalid } |
手动校验所有必答题 |
| reset() |
- |
清空全部答案、回到第一题 |
分步模式示例
<fg-questionnaire
v-model="answers"
mode="step"
:questions="questions"
@submit="onSubmit"
/>
分步模式下:顶部显示进度条与题号,每题答完点"下一题"(必答题未作答会拦截),上一题可回改,最后一题按钮变为"提交问卷",提交时统一校验全部必答题。
答案数据结构
{
gender: '男', // single:选项 value
like: ['苹果', '香蕉'], // multiple:选项 value 数组
score: 5, // score:数字
city: '北京', // select:选项 value
birthday: '2000-01-01', // date:YYYY-MM-DD
suggest: '希望增加夜间模式' // fill:字符串
}
注意事项
- 组件内部使用 view / text / input / textarea / picker 等 uni-app 通用组件实现,不使用原生 radio / checkbox,保证各端渲染样式一致;请勿在
nvue 页面中使用
picker 在 App / 小程序端为系统级选择器,H5 端为浏览器原生控件,交互体验以各端为准
- 校验与
uni.showToast 的提示文案均可通过 requiredText / toastText / toastError 定制;需要更精细的定位提示时,可监听 fail 事件自行处理
- 单选 / 多选 / 下拉选项为字符串数组时,答案即选项文本;为对象数组时取
valueKey 字段值,缺省 value 时取 labelKey 字段文本
modelValue 与 questions 均为响应式:外部修改 modelValue 会回显;新增题目会自动补默认答案,已有答案保留