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

如何在React待办列表中用useState禁止提交空表单并给出填写提示

实现方案

核心改动点

  • 新增errorMsg状态变量,用于管理空提交的提示信息
  • 表单提交时先校验任务名称、执行期限去除首尾空格后是否为空,任一为空则拦截提交逻辑
  • 错误提示会在3秒后自动消失,不影响后续操作
  • 移除了提交按钮上重复绑定的onClick事件(表单本身已绑定onSubmit,回车和点击按钮都会触发,避免重复执行提交逻辑)

完整可运行代码

import React, {useEffect, useState} from "react";

export let Tasks = () => {
    let [tasksList, setTasksList] = useState([]);
    let [nameOfTask, setNameOfTask] = useState('');
    let [termOfTask, setTermOfTask] = useState('');
    // 新增错误提示状态
    let [errorMsg, setErrorMsg] = useState('');

    let createTask = (isInput, termOfTask) => {
        let newTask = {
            id: Math.random().toString().substr(1,90),
            task: isInput,
            term: termOfTask
        }
        setTasksList([...tasksList, newTask])
    }

    useEffect(() => {
        setTasksList(JSON.parse(localStorage.getItem('tasksList')) || []);
    },[])

    useEffect(() => {
        localStorage.setItem('tasksList', JSON.stringify(tasksList));
    },[tasksList])

    let getValueNameOfTask = (e) => {
        setNameOfTask(e.target.value)
    }

    let getValueOfTaskTerm = (e) => {
        setTermOfTask(e.target.value);
    }

    let taskCreated = (e) => {
        e.preventDefault();
        // 新增空值校验逻辑
        const trimmedTask = nameOfTask.trim()
        const trimmedTerm = termOfTask.trim()
        if (!trimmedTask || !trimmedTerm) {
            setErrorMsg('禁止提交空表单,请补全任务名称和执行期限')
            // 3秒后自动清空错误提示
            setTimeout(() => setErrorMsg(''), 3000)
            return
        }
        createTask(trimmedTask, trimmedTerm)
        setNameOfTask('');
        setTermOfTask('');
    }

    let taskFinished = (id) => {
        setTasksList(tasksList.filter(todo => todo.id !== id))
    }

    return (
        <div className="tasks_page">
            <div className="form_part">
                <form onSubmit={taskCreated} className="form_of_new_task">
                    <label>新建任务</label>
                    <input
                        type="text"
                        id="name_of_task"
                        placeholder="任务名称"
                        onChange={getValueNameOfTask}
                        value={nameOfTask}
                    />
                    <input
                        type="text"
                        id="term_of_task"
                        placeholder="执行期限"
                        onChange={getValueOfTaskTerm}
                        value={termOfTask}
                    />
                    {/* 错误提示渲染 */}
                    {errorMsg && <p style={{color: 'red', margin: '8px 0'}}>{errorMsg}</p>}
                    <button id="submit">创建</button>
                </form>
            </div>
            <div className="tasks_to_do">
                <h1>待执行任务列表:{tasksList.length}</h1>
                <div>
                    {tasksList.map(el => 
                        <div key={el.id} className="different_task">
                            <h1>{el.task}</h1>
                            <p>{el.term}</p>
                            <button onClick={() => taskFinished(el.id)}>已完成</button>
                        </div>
                    )}
                </div>
            </div>
        </div>
    )
}

效果说明

提交空内容或者全空格内容时,不会创建新任务,同时会在表单下方显示红色的错误提示,3秒后提示自动消失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 03:51:00