表单输入的值在 React 中提交时未更新

Posted

技术标签:

【中文标题】表单输入的值在 React 中提交时未更新【英文标题】:Value of Form Input not updating on Submit in React 【发布时间】:2019-07-11 10:11:37 【问题描述】:

我是 React 新手,正在编写一个基本程序,其中使用两个输入字段和一个按钮,我想通过另一个组件显示提交的数据。 我已经在 App 组件中声明了状态,并使用了 handleChange 和 handleSubmit 方法。我已将此状态数据用作 Display 组件中的道具。但我得到的是输入更改而不是提交时显示的数据。

看看我的代码:

import React,  Component  from 'react';

import './App.css';



class App extends Component 
  constructor()
    super();
    this.state=
      first:'',
      last:''
    
    this.handleChange=this.handleChange.bind(this);
    //this.handleSubmit=this.handleSubmit.bind(this);
  
//handleChange method will capture the change in the values of input field
//Here [e.target.name]:e.target.value will set the input value to name="first" and name="last"
    handleChange(e)
      this.setState(
      [e.target.name]:e.target.value
      );
    

    handleSubmit(e)
      e.preventdefault();
      this.handleChange();
    
  render() 

    return (
      <div className="App">
      <div class="row">
       <input name="first" onChange=this.handleChangetype="text" value=this.state.first></input>
       </div>
       <div class="row">
       <input name="last" onChange=this.handleChangetype="text" value=this.state.last></input>
       </div>
       <div class="row">
       <input  name="submit" type="button" onSubmit=this.handleSubmit></input>
       </div>
       <Display name=this.state.first last=this.state.last/>
      </div>

    );
  


const Display=(props)=>
    return(
      <div>
        <div class="row">
        props.name
        </div>
        <div class="row">
        props.last
        </div>
      </div>
    )






export default App;

也有人能解释一下为什么我们写[e.target.name]:e.target.value 在 setState 中,为什么我们将其设为 []?

【问题讨论】:

【参考方案1】:

您使用的handleChange 函数将状态分别设置为firstlast 状态更改时。这种模式在 React 中称为Controlled Components。

关于为什么我们在handleChange函数中使用[],正如您在代码的cmets中已经指出的那样,将状态设置为firstlast,它们也是name输入的属性。这种语法称为计算属性,您可以在React docs 中找到对此的解释。

如果您希望Display 组件仅在您按下提交时获取状态,另一种方法是为它们维护两个单独的状态。一个用于表单,另一个用于显示的经过验证的表单。

演示:

const  Component  = React;

class App extends Component 
  constructor()
    super();
    this.state=
      first:'',
      last:''
    
    this.handleSubmit=this.handleSubmit.bind(this);
  
    
  handleSubmit(first, last)
    this.setState(
      first,
      last,
    )
  
  render() 

    return (
      <div className="App">
       <Form onSubmit=this.handleSubmit />
       <Display name=this.state.first last=this.state.last/>
      </div>

    );
  


class Form extends Component 
  constructor()
    super();
    this.state=
      first:'',
      last:''
    
    this.handleChange=this.handleChange.bind(this);
    this.handleSubmit=this.handleSubmit.bind(this);
  
  
  handleChange(e)
      this.setState(
        [e.target.name]:e.target.value
      );
  
  
  handleSubmit(e) 
    e.preventDefault();
    this.props.onSubmit(this.state.first, this.state.last);
  

  render() 
    return (
      <form onSubmit=this.handleSubmit>
        <div className="row">
       <input name="first" onChange=this.handleChangetype="text" value=this.state.first />
      </div>
      <div className="row">
       <input name="last" onChange=this.handleChangetype="text" value=this.state.last />
      </div>
      <div className="row">
       <input  name="submit" type="submit" />
      </div>
     </form>
    );
  


const Display=(props)=>
    return(
      <div>
        <div className="row">
        props.name
        </div>
        <div className="row">
        props.last
        </div>
      </div>
    )



ReactDOM.render(<App />, document.getElementById("root"));
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<div id="root"></div>

【讨论】:

你能解释一下为什么你在App中声明状态并添加handleSubmit方法吗?还有 this.props.onSubmit(this.state.first, this.state.last);在handleSubmit 中的Form 中做什么?为什么要在这个handleSubmit in Form 中使用props?能否简单介绍一下 App 和 Form 组件的使用逻辑? App 组件保存从Form 验证和提交的状态,只需按照您的要求显示。 Form 持有的状态是您可以用来验证的状态,直到用户按下提交

以上是关于表单输入的值在 React 中提交时未更新的主要内容,如果未能解决你的问题,请参考以下文章

如果提交表单时未选中复选框,如何将布尔值更新为 0

填写值后在输入文本框时未触发提交。在 IE 中

React - 表单提交后清除输入值

将html表单中的数据插入sql数据库(html,php,sql)时未保存输入的值

更新 redux 状态/提交表单时页面重新加载

React Hooks Form:提交时未定义的值