【问题标题】:React - Do I HAVE to add an onChange event handler to each input field to make input field NOT read only?React - 我是否必须向每个输入字段添加一个 onChange 事件处理程序以使输入字段不是只读的?
【发布时间】:2018-11-14 03:54:18
【问题描述】:

我有一个简单的表格。如果我只有一个 onSubmit 事件处理程序,我的 inout 字段是只读的(我不想要)。当我向每个输入字段另外添加一个 onChange 事件处理程序时,它们不再是只读的。我的问题是:

  1. 除了 onSubmit 之外,我是否必须始终添加 onChange 以便输入字段在 React 中不是只读的
  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>
                    )
            }
        }
    

【问题讨论】:

  • 您的表单具有受控输入。所以是的,您需要始终使用onChange 将输入值与状态保持同步
  • 那是因为你的 value 是从状态中获取的,所以你实际上需要修改状态,然后它会用新值重新呈现你的输入,你可以删除 value={this.state.name} 并且不会“只读”。但是我认为您当前的方法更好,否则以后您将不得不使用选择器或其他方式来获取您的价值,而不是在您的状态下使用它。

标签: javascript reactjs


【解决方案1】:

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

你必须阅读 React 文档 https://reactjs.org/docs/forms.html#controlled-components

【讨论】:

  • 谢谢。我阅读了文档以及有关不受控制的组件的文档,据我所知,可以使用 ref 而不是设置状态。在这种情况下,我不必使用更改事件处理程序,但我想知道使用受控组件有什么好处?如果我只想发送数据而不是显示数据等 - 使用 ref 而不是 setState、onChange 事件处理程序等有缺点吗?
  • 您可以使用 ref,但这不是常见的做法。 React 方式是使用受控组件并避免使用 ref。请阅读此goshakkk.name/controlled-vs-uncontrolled-inputs-react
【解决方案2】:

您为名称输入设置了值,它始终保持为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>
            )
    }
}

【讨论】:

  • 谢谢!一个问题:如果我从我的状态中删除姓名,那么我不能使用和发送任何数据,例如在这种情况下的“姓名”-对吗?还是有其他方法可以做到这一点,因为我想提交带有输入值的表单
  • 不,除了设置名称状态(setState)之外,没有其他合适的方法可以做到这一点。您可以更好地控制输入组件,以便更改它们的值。
  • 只是想仔细检查我是否理解正确。使用 onChange,我将初始值(在我的情况下是一个空字符串)更改为输入值,使用 onSubmit 我发送日期等,这之前由 onChange 事件处理程序更改,但是,我不能使用 onSubmit 事件处理程序更改任何内容?!
  • 您可以控制组件,以便您可以随时设置名称值。在输入的constructorcomponentDidMountonChange 中启动它,或者如果您更愿意在onSubmit 中更改它。我会用一个例子来更新我的答案。
猜你喜欢
  • 2020-07-27
  • 1970-01-01
  • 2018-12-19
  • 2022-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多