ReactJS event.target.value 返回未定义

Posted

技术标签:

【中文标题】ReactJS event.target.value 返回未定义【英文标题】:ReactJS event.target.value returns as undefined 【发布时间】:2021-03-26 08:29:31 【问题描述】:

我在 ReactJS 中制作了一个带有一个文本输入的表单,当它提交时,我想获取它的值并将其放入一个变量中。但是当我使用 console.log() 时,它会以undefined 的形式返回。我该如何解决?这是我的代码。

class App extends Component 
    state = 
        todoTitle: ""
    ;

    render() 
        return (
            <div>
                <center>
                    <form
                        onSubmit=(event) => 
                            event.preventDefault();
                            this.setState(todoTitle: event.target.value,);
                            console.log(this.state.todoTitle); // Returns "undefined"
                        
                    >
                        <input
                            type="text"
                            autocomplete="off"
                            class="form-control"
                            name="todoInput"
                            placeholder="Enter todo"
                            style= width: "400px", height: "50px" 
                        />
                        <input
                            type="submit"
                            value="Submit"
                            id="submitButton"
                        ></input>
                    </form>
                </center>
        
    

【问题讨论】:

setState 应该类似于 this.setState(todoTitle: event.target.value); @ani:您需要任何其他有关 ReactJS、Hooks、异步 javascript 的帮助,请随时向 emmeiwhite@gmail.com 发送消息或写电子邮件。快乐编码。如果有用,请给答案评分:) 谢谢 【参考方案1】:

您的代码还有一些其他错误,但我会回答您的问题。

setState 触发重新渲染,因此您的状态在下次运行之前无法记录。您可以只记录您在 setState 中输入的内容。

console.log(event.target.value);

这个问题有更多信息。 setState doesn't update the state immediately

另外,您可以进行回调。

this.setState( todoTitle: event.target.value , () =>
  console.log(this.state.todoTitle)
);

【讨论】:

【参考方案2】:

您可以稍微修改您的应用程序以获取输入文本字段的 onChange 值,然后将其存储在数组中以防以下示例:

export default class App extends React.Component 
  state = 
    todoTitle: "",
    todoList: []
  ;

  render() 
    return (
      <div>
        <center>
          <form
            onSubmit=event => 
              event.preventDefault();
              this.setState(
                
                  todoList: [...this.state.todoList, this.state.todoTitle]
                ,
                () => 
                  console.log(this.state.todoList);
                
              );
            
          >
            <input
              type="text"
              autocomplete="off"
              class="form-control"
              name="todoInput"
              placeholder="Enter todo"
              onChange=event => 
                this.setState( todoTitle: event.target.value );
                console.log(event.target.value);
              
              style= width: "400px", height: "50px" 
            />
            <input type="submit" value="Submit" id="submitButton" />
          </form>
        </center>
      </div>
    );
  

完整应用在这里:Stackblitz

【讨论】:

【参考方案3】:

试试这个:

class App extends React.Component 
  constructor(props) 
    super(props);
    this.state =  todoTitle: "" ;
    this.handleSubmit = this.handleSubmit.bind(this);
    this.handleChange = this.handleChange.bind(this);
  

  handleChange(event) 
    event.preventDefault();
    this.setState( todoTitle: event.target.value );
  

  handleSubmit(event) 
    event.preventDefault();
    console.log(this.state.todoTitle);
  

  render() 
    return (
      <div>
        <center>
          <form onSubmit=this.handleSubmit>
            <input
              type="text"
              autocomplete="off"
              class="form-control"
              name="todoInput"
              placeholder="Enter todo"
              style= width: "400px", height: "50px" 
              onChange=this.handleChange
            />
            <input type="submit" value="Submit" id="submitButton" />
          </form>
        </center>
      </div>
    );
  

这将更改输入更改的状态,然后登录提交状态。另一种方法是通过 getElementById 或 React 中的类似方法获取输入元素及其值。

您的代码格式也不是很好,并且遗漏了很多结束标签。

在这里阅读更多: Get form data in ReactJS

【讨论】:

【参考方案4】:

您需要创建一个controlled inputuseRef 以供React 跟踪您的todoTitle 状态。

要创建controlled input,您需要使用onChange eventvalue=this.state.todoTitle 属性。

同样在您的表单上,最好添加一个onSubmit 事件。但是,还有一个选项可以在表单提交按钮上设置提交。在这种情况下,我们需要使用onClick=this.handleSubmit,如下&lt;input type="submit" value="Submit" id="submitButton" onClick=this.handleSubmit /&gt;

以下代码将为您工作:

class Form extends React.Component 
  state = 
    todoTitle: "",
  ;

  handleSubmit = (e) => 
    e.preventDefault();
    console.log(this.state.todoTitle);
  ;
  render() 
    return (
      <div>
        <form onSubmit=this.handleSubmit>
          <input
            type="text"
            autocomplete="off"
            class="form-control"
            name="todoInput"
            placeholder="Enter todo"
            style= width: "400px", height: "50px" 
            value=this.state.todoTitle
             onChange=(e) => this.setState( todoTitle: e.target.value )
          />
          <input type="submit" value="Submit" id="submitButton" />
        </form>
      </div>
    );
  

【讨论】:

以上是关于ReactJS event.target.value 返回未定义的主要内容,如果未能解决你的问题,请参考以下文章

一看就懂ReactJS

Reactjs - 如何在 reactjs 材料表中加载和映射数据

ReactJS学习笔记-深入理解ReactJS的面向组件即对象

ReactJS学习笔记-深入理解ReactJS的面向组件即对象

源码ReactJS-AdminLTE:原始AdminLTE仪表板的ReactJS版本

ReactJs入门