渐进式编程课
Vue 目录
第 20 课2026.09.28

成功保存练习时长后,立即在表单下方看到已有记录。

第 20 课:显示已提交时长列表

  • 日期:2026-09-28
  • 课程序号:第 20 课
  • 知识点:v-for

用途或适用场景

成功保存练习时长后,立即在表单下方看到已有记录。

核心概念

v-for="lesson in lessons" 为数组中的每个对象渲染一行;本课只追加记录,不重排列表或维护行内状态。

最小代码或操作示例

vue
<script setup>
import { ref, computed, useTemplateRef } 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)
const minutesInput = useTemplateRef('minutes-input')
function submit() {
  if (!valid.value) {
    touched.value = true
    minutesInput.value?.focus()
    return
  }
  lessons.value.push({ minutes: minutes.value })
  minutes.value = ''
  touched.value = false
}
</script>
<template>
  <form novalidate @submit.prevent="submit">
    <input ref="minutes-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>
  <ul><li v-for="lesson in lessons">{{ lesson.minutes }} 分钟</li></ul>
</template>

3~5 分钟练习

连续提交 5 和 10,观察输入框及列表。

参考答案

输入框每次成功后清空;列表依次显示“5 分钟”“10 分钟”。

与上一课的联系

沿用第 19 课的 submit、lessons、minutes 和失败聚焦;本课只新增 v-for 把已有数据渲染为列表;下一课可为每条记录补充稳定标识以支持重排。

时效校验

时效校验:2026-09-28(已打开 Vue 3 当前列表渲染与表单绑定文档;v-for 与 v-model.number 未见废弃标记;沿用第 19 课的 useTemplateRef 需 Vue 3.5+;此例无行内状态或重排)。

官方参考