You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue.js中如何检查所有单选框问题已作答后允许页面离开

解决方案

你需要修改两处代码即可实现需求:

1. 修复子组件parentComponent.vue的问题

当前子组件存在两个逻辑缺陷:

  • No选项的单选框没有绑定@change事件,选中后不会触发数据更新
  • 无论选Yes还是No都固定返回status=1,无法区分用户选择
    修改后的子组件代码如下:
<template>
  <div class="py-2">
    <div>
      <input
        type="radio"
        :id="taskData.id + 'Yes'"
        :name="taskData.name"
        value="yes"
        @change="updateData"
      />
      <label :for="taskData.id + 'Yes'">{{ taskData.name }} Yes</label>
    </div>
    <div>
      <input
        type="radio"
        :id="taskData.id + 'No'"
        :name="taskData.name"
        value="no"
        @change="updateData"
      />
      <label :for="taskData.id + 'No'">{{ taskData.name }} No</label>
    </div>
  </div>
</template>

<script>
export default {
  props: ["taskData"],
  methods: {
    updateData(e) {
      this.$emit("update-form-data", {
        id: this.taskData.id,
        // 可根据业务需求调整status的取值,这里示例用1代表Yes、0代表No
        status: e.target.value === 'yes' ? 1 : 0,
      });
    },
  },
};
</script>

同时修复了原代码中label的for属性和单选框id不匹配的问题,保证点击label可以正常选中对应单选框。

2. 完成simulateBeforeRouteLeave的判断逻辑

你可以用Array.every()方法遍历所有任务,判断所有任务的status都不为初始值null即可,修改后的App.vue方法代码:

simulateBeforeRouteLeave() {
  // 只要存在任意一个task的status是null,说明还有未作答的题目
  const hasUnanswered = !this.tasks.data.every(task => task.status !== null)
  if (hasUnanswered) {
    alert("请选择所有选项");
  } else {
    console.log("允许用户离开 'next()'");
    // 实际项目中这里调用路由守卫的next()方法即可
  }
},

Array.every()会在所有元素都满足判断条件时返回true,只要有一个不满足就返回false,刚好适配全量校验的场景,即使后续任务是从API动态拉取的,这段逻辑也不需要改动。

内容的提问来源于stack exchange,提问作者babis95

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 19:36:01