推荐用单个 reactive 对象统一管理问卷状态,将题目结构与用户作答内聚于 formState.questions 中,每题初始化即带 selected/value 等响应式字段,跳转与提交均基于题对象自身字段计算,避免分散状态和额外组装。
用 reactive 维护问卷调查的状态,核心是把「题目结构」和「用户作答」统一建模为响应式对象,而不是分散管理。关键不在“能不能”,而在“怎么组织才不易错、易扩展、好提交”。
不要分开定义 questions: reactive([]) 和 answers: reactive({})。这样容易不同步、难校验、跳转逻辑混乱。推荐结构如下:
reactive 包裹,例如 const formState = reactive({ questions: [], current: 0, // 当前题序号 })
selected 或 value 字段,比如单选题的选项数组里加 selected: false,简答题字段加 value: ''
$set 或判断是否存在单选、多选、填空、上传等类型,都存在同一份 questions 数组中。渲染时用 v-if 判断 item.type,而不是为每种题型单独声明 reactive 数据。
v-model="item.selectedOptionId";多选题用 v-model="item.selectedOptionIds";文本题用 v-model="item.value"
ref 或局部 reactive 存答案,否则父级无法统一收集“下一题”不是简单 current++,而是根据当前题的 jump_id 或选项的 jump_id 决定去向。作答状态也应随题走:
selectedOptionId,并检查该选项是否带 jump_id,有则直接跳转current++;若有,则跳转到对应 id 的题最终提交的数据结构,和初始化时保持一致,不需要额外组装。例如:
{ id: 13, selected_option_id: 34 }
{ id: 17, selected_option_ids: [32, 35] }
{ id: 18, value: "我的回答..." }
formState.questions,对每题 pick 出对应字段,push 到提交数组,干净利落