【问题标题】:Clear and reset form input fields清除和重置表单输入字段
【发布时间】:2017-05-11 17:54:41
【问题描述】:

我有一个包含各种输入字段和两个按钮的表单;一个用于提交,一个用于取消。

<form id="create-course-form">
  <input type="text" name="course_Name" ref="fieldName">
  <input type="text" name="course_org" ref="fieldOrg">
  <input type="text" name="course_Number" ref="fieldNum">

  <input type="submit" name="saveCourse" value="Create">
  <input type="button" name="cancelCourse" value="cancel" onClick={this.cancelCourse}>
</form>

我想要的是在单击取消按钮时清空所有输入。到目前为止,我已经通过使用每个输入的 ref 属性来做到这一点。

cancelCourse(){
  this.refs.fieldName.value="";
  this.refs.fieldorg.value="";
  this.refs.fieldNum.value="";
}

但是,我想清空输入字段,而不必单独清空每个字段。我想要类似的东西(jQuery):$('#create-course-form input[type=text]').val('');

【问题讨论】:

  • 使用托管输入。

标签: reactjs


【解决方案1】:

这里的答案取决于您的输入是受控还是不受控。如果您不确定或需要更多信息,请查看官方文档对controlled componentsuncontrolled components 的评价。 感谢 @Dan-Esparza 提供链接。

另外,请注意using string literals in ref is deprecated。请改用标准回调方法。


清除包含不受控制字段的表单

您可以清除整个表单,而不是单独清除每个表单域。

cancelCourse = () => { 
  document.getElementById("create-course-form").reset();
}

render() {
  return (
    <form id="create-course-form">
      <input />
      <input />
      ...
      <input />
    </form>
  );
}

如果您的表单没有id 属性,您也可以使用ref

cancelCourse = () => { 
  this.myFormRef.reset();
}

render() {
  return (
    <form ref={(el) => this.myFormRef = el;}>
      <input />
      <input />
      ...
      <input />
    </form>
  );
}

清除带有受控字段的表单

如果您使用受控表单字段,您可能必须显式重置表单中的每个组件,具体取决于您的值在状态中的存储方式。

如果它们是单独声明的,你需要明确地重置每一个:

cancelCourse = () => { 
  this.setState({
    inputVal_1: "",
    inputVal_2: "",
    ...
    inputVal_n: "",
  });
}

render() {
  return (
    <input value={this.state.inputVal_1} onChange={this.handleInput1Change}>
    <input value={this.state.inputVal_2} onChange={this.handleInput2Change}>
    ...
    <input value={this.state.inputVal_n} onChange={this.handleInputnChange}>
  );
}

下面的演示:

class MyApp extends React.Component {
  constructor() {
    super();
    this.state = {
      inputVal_1: "",
      inputVal_2: "",
      inputVal_3: "",
      inputVal_4: "",
      inputVal_5: "",
      inputVal_6: "",
      inputVal_7: "",
      inputVal_8: "",
      inputVal_9: "",
      inputVal_10: ""
    };
  }
  
  handleInput1Change = (e) => {
    this.setState({inputVal_1: e.target.value});
  }
  
  handleInput2Change = (e) => {
    this.setState({inputVal_2: e.target.value});
  }
  
  handleInput3Change = (e) => {
    this.setState({inputVal_3: e.target.value});
  }
  
  handleInput4Change = (e) => {
    this.setState({inputVal_4: e.target.value});
  }
  
  handleInput5Change = (e) => {
    this.setState({inputVal_5: e.target.value});
  }
  
  handleInput6Change = (e) => {
    this.setState({inputVal_6: e.target.value});
  }
  
  handleInput7Change = (e) => {
    this.setState({inputVal_7: e.target.value});
  }
  
  handleInput8Change = (e) => {
    this.setState({inputVal_8: e.target.value});
  }
  
  handleInput9Change = (e) => {
    this.setState({inputVal_9: e.target.value});
  }
  
  handleInput10Change = (e) => {
    this.setState({inputVal_10: e.target.value});
  }
  
  cancelCourse = () => { 
    this.setState({
      inputVal_1: "",
      inputVal_2: "",
      inputVal_3: "",
      inputVal_4: "",
      inputVal_5: "",
      inputVal_6: "",
      inputVal_7: "",
      inputVal_8: "",
      inputVal_9: "",
      inputVal_10: ""
    });
  }
  
  render() {
    return (
      <form>
        <input value={this.state.inputVal_1} onChange={this.handleInput1Change} />
        <input value={this.state.inputVal_2} onChange={this.handleInput2Change} />
        <input value={this.state.inputVal_3} onChange={this.handleInput3Change} />
        <input value={this.state.inputVal_4} onChange={this.handleInput4Change} />
        <input value={this.state.inputVal_5} onChange={this.handleInput5Change} />
        <input value={this.state.inputVal_6} onChange={this.handleInput6Change} />
        <input value={this.state.inputVal_7} onChange={this.handleInput7Change} />
        <input value={this.state.inputVal_8} onChange={this.handleInput8Change} />
        <input value={this.state.inputVal_9} onChange={this.handleInput9Change} />
        <input value={this.state.inputVal_10} onChange={this.handleInput10Change} />
        <input type="submit" name="saveCourse" value="Create" />
        <input type="button" name="cancelCourse" value="cancel" onClick={this.cancelCourse} />
      </form>
    );
  }
}

ReactDOM.render(<MyApp />, document.getElementById("app"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="app"></div>

不过,有一种更简洁的方法可以做到这一点。不用n 状态属性和n 事件处理程序,每个输入一个,通过一些巧妙的编码,我们可以显着减少代码。

在构造函数中,我们只声明一个空对象,它将用于保存输入值。我们只使用一个输入处理程序并将我们想要更改其值的输入元素的索引传递给它。这意味着单个输入的值是在我们开始输入的那一刻生成的。

要重置表单,我们只需要将输入对象再次设置为空即可。

输入值为this.state.inputVal[i]。如果i 不存在(我们尚未在该输入中输入任何内容),我们希望该值为空字符串(而不是 null)。

cancelCourse = () => { 
  this.setState({inputVal: {}});
}

render() {
  return (
    <form>
      {[...Array(n)].map(
        (item, i) => <input value={this.state.inputVal[i] || ""} onChange={this.handleInputChange.bind(this, i)} />
      )}
    </form>
  );
}

下面的演示:

class MyApp extends React.Component {
  constructor() {
    super();
    this.state = {
      inputVal: {}
    };
  }
  
  handleInputChange = (idx, {target}) => {
    this.setState(({inputVal}) => {
      inputVal[idx] = target.value;
      return inputVal;
    });
  }
  
  cancelCourse = () => { 
    this.setState({inputVal: {}});
  }
  
  render() {
    return(
      <form>
        {[...Array(10)].map(  //create an array with a length of 10
          (item, i) => <input value={this.state.inputVal[i] || ""} onChange={this.handleInputChange.bind(this, i)} />  //bind the index to the input handler
        )}
        <input type="submit" name="saveCourse" value="Create" />
        <input type="button" name="cancelCourse" value="cancel" onClick={this.cancelCourse} />
      </form>
    );
  }
}

ReactDOM.render(<MyApp />, document.getElementById("app"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="app"></div>

【讨论】:

  • 感谢您的回答,我正在使用不受控制的文件,所以我使用了 reset() 函数,它现在就像一个魅力一样工作
  • 对于想知道“受控”和“不受控”字段是什么的未来读者,请查看docs on the React homepage for working with forms
  • @Chris 使用受控组件清除表单的最佳做法是什么?有人告诉我“将输入状态设置为 '' 被认为是反模式。”,他们建议在 componentWillUnmount 上使用它,但要谨慎。而作为替代使用 document.getElementById("someID").value = '' 所以我迷路了?任何想法
  • @yokodev,不太关注。请考虑发布一个新问题并在那里发布更多信息。还要说明你已经阅读了这个问题,但你仍然不理解 X 和 Y。还给我发了一个链接,我会检查出来。
  • 如何用钩子做到这一点?
【解决方案2】:

很简单:

handleSubmit(e){
    e.preventDefault();
    e.target.reset();
}
<form onSubmit={this.handleSubmit.bind(this)}>
  ...
</form>

祝你好运:)

【讨论】:

  • 我收到此错误TypeError: Cannot read property 'preventDefault' of undefined 而不是表单,我有另一个组件,我正在调用 handleSubmit()。我正在使用反应 js
  • @tramada 它会为我清理表单中的所有输入。请重新检查
  • 关于如何重置表单输入的最佳答案。
  • 尝试在e.preventDefault() 之前执行e = e || window.event 处理TypeError: Cannot read property 'preventDefault' of undefined @Amnahkhatun
  • 又好又容易!谢谢你
【解决方案3】:

使用event.target.reset() 仅适用于不受控制的组件,不推荐使用。对于受控组件,您可以执行以下操作:

import React, { Component } from 'react'

class MyForm extends Component {
  initialState = { name: '' }

  state = this.initialState

  handleFormReset = () => {
    this.setState(() => this.initialState)
  }

  render() {

    return (
      <form onReset={this.handleFormReset}>
        <div>
          <label htmlFor="name">Name</label>
          <input
            type="text"
            placeholder="Enter name"
            name="name"
            value={name}
            onChange={this.handleInputOnChange}
          />
        </div>
        <div>
          <input
            type="submit"
            value="Submit"
          />
          <input
            type="reset"
            value="Reset"
          />
        </div>
      </form>
    )
  }
}

ContactAdd.propTypes = {}

export default MyForm

【讨论】:

  • +1 供您使用 initialState,如果您要在多个位置重置表单(例如,重置按钮,但在提交后),那就太好了
【解决方案4】:

您也可以通过使用 anything.target.reset() 定位当前输入来实现。这是最简单的方法!

handleSubmit(e){
 e.preventDefault();
 e.target.reset();
}

<form onSubmit={this.handleSubmit}>
  ...
</form>

【讨论】:

    【解决方案5】:

    以下代码应一键重置表单。

    import React, { Component } from 'react';
    
    class App extends Component {
        constructor(props){
        	super(props);
        	this.handleSubmit=this.handleSubmit.bind(this);
        }
        handleSubmit(e){
        this.refs.form.reset();
        }
        render(){
            return(
            <div>
            	<form onSubmit={this.handleSubmit} ref="form">
                    <input type="text" placeholder="First Name!" ref='firstName'/><br/<br/>
                	<input type="text" placeholder="Last Name!" ref='lastName'/><br/><br/>
                    <button type="submit" >submit</button>
                </form>
           </div>
        }
    }

    【讨论】:

    【解决方案6】:

    要清除您的表单,承认您的表单元素值保存在您的状态中,您可以像这样映射您的状态:

      // clear all your form
      Object.keys(this.state).map((key, index) => {
          this.setState({[key] : ""});
       });
    

    如果您的表单在其他字段中,您可以像这样简单地将它们插入到状态的特定字段中:

     state={ 
            form: {
            name:"",
            email:""}
          }
    
          // handle set in nested objects
          handleChange = (e) =>{ 
            e.preventDefault(); 
    
            const newState = Object.assign({}, this.state);
            newState.form[e.target.name] = e.target.value;
            this.setState(newState);
          }
    
          // submit and clear state in nested object 
          onSubmit = (e) =>{ 
            e.preventDefault(); 
    
           var form =   Object.assign({}, this.state.form);
           Object.keys(form).map((key, index) => {
              form[key] = "" ;
            });
    
           this.setState({form})
          } 
    

    【讨论】:

      【解决方案7】:

      这个最适合重置表单。

      import React, { Component } from 'react'
      class MyComponent extends Component {
        constructor(props){
          super(props)
          this.state = {
            inputVal: props.inputValue
          }
          // preserve the initial state in a new object
          this.baseState = this.state ///>>>>>>>>> note this one.
        }
        resetForm = () => {
          this.setState(this.baseState) ///>>>>>>>>> note this one.
        }
        submitForm = () => {
          // submit the form logic
        }
        updateInput = val => this.setState({ inputVal: val })
        render() {
          return (
            <form>
              <input
                onChange={this.updateInput}
                type="text
                value={this.state.inputVal} />
              <button
                onClick={this.resetForm}
                type="button">Cancel</button>
              <button
                onClick={this.submitForm}
                type="submit">Submit</button>
            </form>
          )
        }
      }
      

      【讨论】:

        【解决方案8】:

        提交表单时,“事件”将作为参数传递给handleSubmit 方法,如果这样,您可以通过键入event.target 访问&lt;form&gt; 元素。那么你只需要使用 .reset() 表单方法重置表单。

        https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/reset

          handleSubmit = (event)=>{
            event.preventDefault()
            ....
        
            event.target.reset()
          }
        
          render() {
            return (
              <>
                <form onSubmit={this.handleSubmit}>
                  <label htmlFor='movieTitle'>Title</label>
                  <input name='movieTitle' id='movieTitle' type='text' />
        
                  <input type='submit' value='Find Movie Info' />
                </form>
              </>
            )
          }
        

        【讨论】:

          【解决方案9】:

          我不知道这是否仍然相关。但是当我遇到类似的问题时,这就是我解决它的方法。

          如果您需要清除不受控制的表单,您只需在提交后执行此操作即可。

          this.<ref-name-goes-here>.setState({value: ''});
          

          希望这会有所帮助。

          【讨论】:

            【解决方案10】:

            import React, { Component } from 'react'
            
            export default class Form extends Component {
              constructor(props) {
                super(props)
                this.formRef = React.createRef()
                this.state = {
                  email: '',
                  loading: false,
                  eror: null
                }
              }
            
              reset = () => {
                this.formRef.current.reset()
              }
            
              render() {
                return (
                  <div>
                    <form>
                      <input type="email" name="" id=""/>
                      <button type="submit">Submit</button>
                      <button onClick={()=>this.reset()}>Reset</button>
                    </form>
                  </div>
                )
              }
            }

            【讨论】:

              【解决方案11】:

              /* 查看 newState 并在 eventSubmit() 中使用它来重置所有状态. 我已经测试过它对我有用。请让我知道错误 */

              import React from 'react';
                  
                  const newState = {
                      fullname: '',
                      email: ''
                  }
                  
                  class Form extends React.Component {
                      constructor(props) {
                          super(props);
                          this.state = {
                              fullname: ' ',
                              email: ' '
                          }
                  
                          this.eventChange = this
                              .eventChange
                              .bind(this);
                          this.eventSubmit = this
                              .eventSubmit
                              .bind(this);
                      }
                      eventChange(event) {
                          const target = event.target;
                          const value = target.type === 'checkbox'
                              ? target.type
                              : target.value;
                          const name = target.name;
                  
                          this.setState({[name]: value})
                      }
                  
                      eventSubmit(event) {
                          alert(JSON.stringify(this.state))
                          event.preventDefault();
                          this.setState({...newState});
                      }
                  
                      render() {
                          return (
                              <div className="container">
                                  <form className="row mt-5" onSubmit={this.eventSubmit}>
                                      <label className="col-md-12">
                                          Full Name
                                          <input
                                              type="text"
                                              name="fullname"
                                              id="fullname"
                                              value={this.state.fullname}
                                              onChange={this.eventChange}/>
                                      </label>
                                      <label className="col-md-12">
                                          email
                                          <input
                                              type="text"
                                              name="email"
                                              id="email"
                                              value={this.state.value}
                                              onChange={this.eventChange}/>
                                      </label>
                                      <input type="submit" value="Submit"/>
                                  </form>
                              </div>
                          )
                      }
                  }
                  
                  export default Form;
                  
              

              【讨论】:

                【解决方案12】:

                最简单的方法是仅使用 HTML 定期执行此操作,并使用“重置”按钮类型,根本不需要在 react 中弄乱任何东西,没有状态,什么都没有。

                import React, {useState} from 'react'
                
                function HowReactWorks() {
                  
                  return (
                    <div>
                      <form>
                        <div>
                          <label for="name">Name</label>
                          <input type="text" id="name" placeholder="name" />
                        </div>
                        <div>
                          <label for="password">Password</label>
                          <input type="password" id="password" placeholder="password" />
                        </div>
                        <button type="reset">Reset</button>
                        <button>Submit</button>
                      </form>
                    </div>
                  )
                }
                
                export default HowReactWorks
                
                • 为不知道如何在 react 中包含 HTML 的人编辑

                【讨论】:

                • 请尽量回答被问到的问题,给出在特定情况下无用的答案是没有帮助的。这个问题清楚地表明他们已经在使用 React,所以给出一个在 React 世界中不起作用的答案不是一个可行的解决方案。
                【解决方案13】:

                你也可以用这个方法

                const resetData = (e) => {
                e.preventDefault();
                settitle("");
                setdate("");
                };
                    
                <input type="text" onChange={(e) => settitle(e.target.value)} value={title} />
                    
                <input type="date" onChange={(e) => setdate(e.target.value)} value={date} />
                    
                <button onClick={resetData}>Reset Data</button>
                

                【讨论】:

                  【解决方案14】:

                  HTMLFormElement.reset() 方法恢复表单元素的默认值。此方法与单击表单的重置按钮执行相同的操作。

                  import React from 'react'
                  
                  
                  export default class Example extends React.Component {
                  
                    /*
                    // One way
                    handleSubmitted = ({ res, fields, form }) => {
                      form.reset() // resets "username" field to "admin"
                    }
                  */
                  // Another way
                   handleSubmitted = (e) => {
                      e.target.reset() // resets "username" field to "admin"
                    }
                  
                    render() {
                      return (
                        <form onSubmitted={this.handleSubmitted}>
                          <input
                            name="username"
                            initialValue="admin" />
                        </form>
                      )
                    }
                  }
                  

                  【讨论】:

                    【解决方案15】:
                    state={ 
                      name:"",
                      email:""
                    }
                    
                    handalSubmit = () => {
                      after api call 
                      let resetFrom = {}
                      fetch('url')
                      .then(function(response) {
                        if(response.success){
                           resetFrom{
                              name:"",
                              email:""
                          }
                        }
                      })
                      this.setState({...resetFrom})
                    }
                    

                    【讨论】:

                    • 如果可能,最好在您的代码中包含一些解释,以描述它如何回答问题,以及为什么它与此处已有的其他几个答案不同。
                    【解决方案16】:

                    为什么不使用 HTML 控制的项目,例如 &lt;input type="reset"&gt;

                    【讨论】:

                    • 用作评论
                    猜你喜欢
                    • 2022-11-17
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2018-11-30
                    • 1970-01-01
                    相关资源
                    最近更新 更多