验证后重置 React Form 值

Posted

技术标签:

【中文标题】验证后重置 React Form 值【英文标题】:Resetting React Form values after validation 【发布时间】:2022-01-09 15:44:54 【问题描述】:

在重置表单中输入字段的值时遇到了这个问题。并想问是否有人知道更好的方法来做到这一点,而不是仅仅为每个字段都设置“useState”......

    const handleSubmit = (e) => 
        e.preventDefault();
        
        emailjs.sendForm('sample_id', 'someother_id', formRef.current, 'user_is')
        .then((result) => 
            console.log(result.text);
        , (error) => 
            console.log(error.text);
        );

        setMessage(true);
        setEmail("");
        setName("");
        setSubject("");
        setTextarea("");
    ;

    return (
        <div className="contact" id="contact">
            <div className="left">
                <img src=""  />
            </div>
            <div className="right">
                <h2>Kontakt</h2>
                <form ref=formRef onSubmit=handleSubmit>
                    <label>Name</label>
                    <input onChange=(e) => setName(e.target.value) type="text" placeholder="Name" name="user_name" value=name />
                    <label>Email</label>
                    <input onChange=(e) => setEmail(e.target.value) type="email" placeholder="Email" name="user_email" value=email />
                    <label>Betreff</label>
                    <input onChange=(e) => setSubject(e.target.value) type="text" placeholder="Subject" name="user_subject" value=subject />
                    <label>Nachricht</label>
                    <textarea onChange=(e) => setTextarea(e.target.value) placeholder="Message" name="message" value=textarea />
                    <button type="submit">Send</button>
                    message && <span>Thanks we will respond ASAP.</span>
                </form>
            </div>
        </div>
    )


【问题讨论】:

如果您不希望每个字段都有一个状态,您可以让一个状态(一个对象)负责所有字段,然后实现useReducer 来处理状态更新。 Recoil 也有状态重置功能 @jsejcksn 使用库只是为了重置状态有点矫枉过正,不是吗? @MartinZ 仅仅使用 React 来实现一个表单是不是有点矫枉过正?我们不知道他的应用程序有多复杂。 @jsejcksn 考虑到标题包含“React 表单”,我怀疑他已经在使用 React 【参考方案1】:

您可以为所有表单值使用单一状态(有点像我们在功能组件之前所做的)

// this could be outside your component
const initialState =  email: "", name: "", subject: "", textArea: "";
// declaring your state
const [formState, setFormState] = React.useState(initialState);

然后

    const handleSubmit = (e) => 
    e.preventDefault();
    
    emailjs.sendForm('sample_id', 'someother_id', formRef.current, 'user_is')
    .then((result) => 
        console.log(result.text);
    , (error) => 
        console.log(error.text);
    );

    setMessage(true);
    setFormState(initialState)
;

您还必须重写输入处理程序。像这样:

<input onChange=(e) => setFormState(...formState, name: e.target.value) type="text" placeholder="Name" name="user_name" value=name />

【讨论】:

在根据前一个状态静音状态时,您应该在 setState-function 中使用 prevState 回调。即:setFormState((prevFormState) =&gt; (...prevFormState, name: e.target.value) 感谢@MartinZ 和 user17578550 给我这些有用的例子,我很感激!!

以上是关于验证后重置 React Form 值的主要内容,如果未能解决你的问题,请参考以下文章

如何重置包含任何验证错误的表单? [关闭]

vue+el-form表单验证、提交及重置

react-hook-form 使用重置选择下拉值

关闭表单时从 react-hook-form 重置值

Antd文件上传没有被重置

element 表单restFields不生效的问题