【问题标题】:Able to type inside input text field without onChange method无需 onChange 方法即可在输入文本字段中输入
【发布时间】:2020-01-20 12:44:16
【问题描述】:

我正在学习 React,下面是我正在尝试的示例代码。我能够渲染这个组件并且能够在没有任何 handleChange() 方法的情况下在输入字段中输入字符吗?这样好吗?因为我所知道的是,为了使输入字段可用于输入,我们需要添加类似下面的 handleChange 方法

handleChange(e) {
    this.setState({ [e.target.name]: e.target.value });
}

import React from "react";

class StudentForm extends React.Component {
  constructor() {
    super();
  }

  render() {
    return (
      <div>
        <form>
          <h1>Student Form</h1>
          <input type="text" name="firstname"></input>
        </form>
      </div>
    );
  }
}

export default StudentForm;

【问题讨论】:

标签: reactjs react-native


【解决方案1】:

handleChange用于设置状态值。

没有 onChange 处理程序,您可以输入,但您的值不会存储在任何地方。

例如,如果您尝试访问您的状态this.state.firstname,您将始终得到undefined。

你应该有controlled component。这是一种在状态中访问和存储价值的简单而干净的方式。

要使您的组件受控,您应该在输入时使用 value 和 onChange 属性,

<input type="text" name="firstname" value={this.state.firstname} onChange={this.handleChange.bind(this)}></input>

【讨论】:

  • 我不认为 React 允许我们在没有 onchange 处理程序的情况下输入,对吗?
  • @Mrbond,您也可以在没有 onChange 处理程序的情况下输入。
【解决方案2】:

是的,请考虑以下事项

<input type="text" name="firstname" />

这是一个uncrontrolled input,这意味着React 现在不是value,也不是如何更改它。要使input 受控,您需要显式指定value 和onChange 属性以将此输入绑定到React 的state

const Input = () =>{
    const [value, setValue] = useState('')

    return <input value={value} onChange={e => setValue(e.target.value)} />
}

现在input 完全由 React 控制,它提供了必须打印的 value 以及更改它的方法

【讨论】:

  • 谢谢大佬,现在我明白了受控元素的概念。你回答了我的问题。
【解决方案3】:

进行以下更改后,我将此输入元素设置为受控元素,现在如果不使用 onChange 处理程序,我将无法输入任何内容。

import React from "react";

class StudentForm extends React.Component {
  constructor() {
    super();
    this.state = {
      firstname: ""
    };
  }

  render() {
    return (
      <div>
        <form>
          <h1>Student Form</h1>
          <input
            type="text"
            name="firstname"
            value={this.state.firstname}
          ></input>
        </form>
      </div>
    );
  }
}

export default StudentForm;

【讨论】:

  • 这是因为您已经将状态值绑定到您的输入,现在您的输入需要 onChange 处理程序,或者您可以将其设为defaultValue。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-19
  • 1970-01-01
  • 2019-03-14
相关资源
最近更新 更多