渐进式编程课
Vue 目录
第 17 课2026.09.22

用户未离开输入框就直接提交时,也立即看见已有范围错误。

第 17 课:无效提交立即显示字段错误

  • 日期:2026-09-22
  • 课程序号:第 17 课
  • 知识点:提交时设置 touched

用途或适用场景

用户未离开输入框就直接提交时,也立即看见已有范围错误。

核心概念

上一课的提示由 touched && !valid 控制;无效提交时将 touched 设为 true,不复制另一个“有错”状态。表单使用 novalidate,让自定义 submit 处理器能接收范围无效的提交。

最小代码或操作示例

vue
<script setup>
import { ref, computed } from 'vue'
const minutes = ref(0)
const touched = ref(false)
const lessons = ref([])
const valid = computed(() => typeof minutes.value === 'number' && minutes.value >= 1 && minutes.value <= 60)
function submit() {
  if (!valid.value) { touched.value = true; return }
  lessons.value.push({ minutes: minutes.value })
}
</script>
<template>
  <form novalidate @submit.prevent="submit">
    <input v-model.number="minutes" type="number" min="1" max="60"
      @blur="touched = true" :aria-invalid="touched && !valid"
      :aria-describedby="touched && !valid ? 'minutes-error' : undefined">
    <p v-if="touched && !valid" id="minutes-error">请输入 1 到 60 分钟</p>
    <button>提交</button>
  </form>
</template>

3~5 分钟练习

保持输入值为 0,不移开焦点就点击提交。

参考答案

touched 变为 true,错误提示出现,课程数组不增加条目。

与上一课的联系

沿用第 16 课的 minutes、valid、touched 和 ARIA 关联;本课只在无效提交时设置已有的 touched;完成后下一课可把焦点移回出错输入框。

时效校验

时效校验:2026-09-24(Vue 3 当前响应式、计算属性、表单和事件修饰符文档;所用 API 未见废弃标记)。

官方参考