2017-10-07 14 views
0

我有一个简单的表单。如果我只有一个onSubmit事件处理程序,我的inout字段是只读的(我不想)。当我另外添加onChange事件处理程序到每个输入字段时,它们停止只读。我的问题是:React - 我是否需要为每个输入字段添加一个onChange事件处理程序,以使输入字段不能只读?

  1. 我必须总是在另外添加一个onchange到的onsubmit所以如果这样的输入字段不只读的阵营
  2. ,为什么呢?
  3. 还是我只是在做我的示例代码什么问题?谢谢

    class App extends React.Component { 
         constructor(props){ 
          super(props); 
          this.state={ 
           name:'' 
          } 
          this.testing=this.testing.bind(this); 
         } 
         testing(e){ 
          e.preventDefault(); 
          //axios call here, sending data/name 
         } 
    
         render() { 
          return (
           <div> 
            <form onSubmit={this.testing}> 
             <input name="name" value={this.state.name}/> 
            </form> 
           </div> 
           ) 
         } 
        } 
    
+1

您窗体已控制的输入。所以是的,你需要总是使用'onChange'来将输入值保持在* sync *的状态。 –

+2

这是因为你输入的值是从状态获得的,所以你实际上需要修改状态,然后用新的值重新输入你的输入,你可以删除'value = {this.state.name}'而不会为“只读”。但是我认为你目前的做法更好,否则以后你将不得不使用选择器或其他方式来取得你的价值,而不是将它置于你的状态。 – Walk

回答

2

是的,你不得不这样做。您将输入值绑定到this.state.name变量,您必须提供更改此值的方法。

您必须阅读文档做出反应 https://reactjs.org/docs/forms.html#controlled-components

+0

谢谢。我阅读了文档以及关于非控制组件的文档,据我所知,可以使用ref而不是设置状态。在这种情况下,我不必使用更改事件处理程序,但我想知道使用受控组件的好处是什么?如果我只想发送数据但不显示数据等 - 是否有使用ref over setState,onChange事件处理程序等的缺点? – javascripting

+0

你可以使用ref,但这不是常见的做法。反应方式是使用受控组件并避免使用ref。请阅读此https://goshakkk.name/controlled-vs-uncontrolled-inputs-react/ – Yozi

+0

谢谢,文章真的很棒! – javascripting

1

你坐了名的输入值,它始终保持this.state.name这是''。所以你必须控制它并添加一个onChange(如this.setState({ name: event.target.value })

如果你不想控制输入,只需删除该值,并从你的状态中删除名称。

我建议你阅读有关controlled components in react docs

下面是如何控制组件将有助于一个例子:(清理输入的值)

class App extends React.Component { 
    constructor(props){ 
     super(props); 
     this.state={ 
      name:'' 
     } 
     this.testing=this.testing.bind(this); 
    } 
    testing(e){ 
     e.preventDefault(); 
     //axios call here, sending data/name 
    } 

    cleanUp(){ 
     this.setState({ name: "" }); 
    } 

    render() { 
     return (
      <div> 
       <form onSubmit={this.testing}> 
        <input name="name" value={this.state.name} onChange={ (event) => this.setState({name: event.target.value})}/> 
        <div onClick={this.cleanUp.bind(this)>CleanUp</div>} 
       </form> 
      </div> 
      ) 
    } 
} 
+0

谢谢!一个问题:如果我从我的状态中删除名称,那么我不能使用和发送任何数据,如在这种情况下'名称' - 正确?还是有另一种方法来做到这一点,因为我想提交我的表单与输入值 – javascripting

+0

不,没有其他适当的方式来做到这一点,但设置名称状态(setState)。 您更好地控制输入组件,以便您可以更改它们的值。 – Developia

+0

只是想仔细检查我的理解是否正确。使用onChange,我将初始值(在我的情况下是一个空字符串)更改为输入值,并使用onSubmit发送日期等等,这些以前由onChange事件处理程序更改,但是,我无法用onSubmit事件处理程序更改任何内容? – javascripting

相关问题