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

基于React Hooks开发带时长格式校验的电影录入表单求助

完整实现方案

你需要新增错误状态管理、补全校验规则、增加校验触发逻辑、条件渲染错误提示即可完成需求,以下是修改后的完整代码:

import { useState } from 'react'

function Movieform() {
  const [movies, handleChange] = useForm({name:'', rating: 0, duration: ''})
  // 新增错误状态,存储时长校验错误信息
  const [durationError, setDurationError] = useState('')

  // 补全时长校验函数
  const validateDuration = (input) => {
    // 正则匹配:数字(支持小数)+ h/m结尾,不区分大小写
    const durationReg = /^\d+(\.\d+)?[hm]$/i
    // 若时长为非必填项,可删除下方空值判断逻辑,空输入直接返回true即可
    if (!input.trim()) {
      setDurationError('时长不能为空')
      return false
    }
    if (durationReg.test(input.trim())) {
      setDurationError('')
      return true
    } else {
      setDurationError('请使用分钟或小时格式标注时长')
      return false
    }
  }

  // 表单提交逻辑
  const handleSubmit = (e) => {
    e.preventDefault()
    // 提交前先校验时长
    const isDurationValid = validateDuration(movies.duration)
    if (!isDurationValid) return
    // 校验通过后执行后续提交逻辑,比如调用接口保存数据等
    console.log('表单提交成功:', movies)
  }

  return (
    <section>
      <div className='card pa-30'>
        <form onSubmit={handleSubmit}>
          <div className='layout-column mb-15'>
            <label htmlFor='name' className='mb-3'>电影名称</label>
            <input
              type='text'
              id='name'
              name="name"
              value={movies.name}
              placeholder='请输入电影名称'
              onChange={handleChange}
            />
          </div>
         
          <div className='layout-column mb-30'>
            <label htmlFor='duration' className='mb-3'>时长</label>
            <input
              type='text'
              id='duration'
              name='duration'
              value={movies.duration}
              placeholder='请输入时长,如143m或2h'
              onChange={handleChange}
              // 失焦时触发校验
              onBlur={() => validateDuration(movies.duration)}
            />
          </div>
          {/* 条件渲染错误提示 */}
          {durationError && (
            <div
              className='alert error mb-30'
              data-testid='alert'
            >
              {durationError}
            </div>
          )}
          <div className='layout-row justify-content-end'>
            <button
              type='submit'
              className='mx-0'
              data-testid='addButton'
            >
              新增电影
            </button>
          </div>
          </form>
      </div>
    </section>
  )
}

export default Movieform

核心逻辑说明

  • 校验用正则/^\d+(\.\d+)?[hm]$/i可覆盖所有合法格式:支持整数/小数开头,结尾只能是h(小时)或m(分钟),不区分大小写,143m、2h、2.5H、120M都可正常通过校验
  • 支持两种校验触发时机:时长输入框失焦时自动校验、表单提交时全局校验,避免用户漏改错误格式
  • 错误提示容器会根据校验结果自动显隐,符合你要求的交互逻辑
  • 修复了原代码中输入框id缺失的问题,点击label可正常聚焦到对应输入框

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 04:09:01