首页 > 解决方案 > 将输入绑定反应到状态与局部变量

问题描述

我正在查看用于绑定输入以响应状态的教程。我不明白为什么我需要将它绑定到状态而不是本地变量,因为它不会导致渲染。

就我而言,我有一个登录表单,在教程中它是发送消息表单。这个想法是使用反向数据流在提交时将值发送到 App.js(parent)。它看起来像这样:

class Login extends Component{

    constructor(){
        super()
        this.state = {
            username: ''
        };
        this.login = this.login.bind(this)
        this.handleChange = this.handleChange.bind(this)
    }
    handleChange(e) {
        this.setState({
            username: e.target.value
        });
    }
    //here I make a post request and then I set the user in app.js
    handleSubmit(e) {
        e.preventDefault();
        fetch('http://localhost:8080/login', {
            method: 'post',
            body: JSON.stringify(username)
        }).then(data =>  data.json())
          .then(data => {
              this.props.setUser(data)
              this.setState({
                  username: ''
              })
          }
    }
    render(){
        return (
            <section>
                <form onSubmit={this.submit}>
                    <input placeholder="username" 
                         onChange={this.changeInput} type="text"
                         value={this.state.username}/>
                </form>
            </section>
        )
    }

是否有理由使用 setState 而不是仅使用不会导致渲染的局部变量?

标签: javascriptreactjs

解决方案


您不必这样做,您可以在不将用户名存储在状态中的情况下使其工作。您所要做的就是监听提交事件并使用 ref 获取当时的输入值。

class Login extends Component {
  handleSubmit(e) {
    e.preventDefault();
    console.log(this.refs.username.value)
  }

  render() {
    return (
      <form onSubmit={this.handleSubmit}>
        <input ref="username" type="text" />
        <button type="submit">Submit</button>
      </form>
    );
  }
});

然而,使用 React 执行此操作的常用方法是将输入值存储在状态中,并在每次值更改时更新状态。这称为受控组件,它确保输入值和状态始终彼此一致。

class Login extends Component {
  constructor() {
      super()
      this.state = {
          username: ''
      };
  }

  handleChange(e) {
      this.setState({
          username: e.target.value
      });
  }

  render() {
    return (
      <div>
        <form onSubmit={this.handleSubmit}>
          <input onChange={e => this.setState({ username: e.target.value })} type="text" value={this.state.username} />
          <button type="submit">Submit</button>
        </form>
      </div>
    )
  }
}

除其他外,它使验证输入值或在需要时对其进行修改变得更容易。例如,您可以通过在状态更改时将状态转换为大写来强制使用大写。


推荐阅读