javascript - React-输入字段在onChange后变成字符串

标签 javascript reactjs input state

我有一个包含三个组件的小应用

  1. 父=> 应用程序
  2. 儿子 => 类(class)
  3. 孙子 => 类(class)

应用程序状态位于应用程序组件中,在类(class)组件中,我有一个带有 onChange 事件的输入字段,该事件通过该事件来更改应用程序组件中的状态,问题是每次我键入输入都会更改为字符串我无法继续输入并更改状态。

值到达父级。

这是我的类(class)代码

import React, { Component } from 'react'

class Course extends Component {
    updatedGrade = (e) => {
        this.props.updateCourseGrade(Number(e.target.value), Number(e.target.id));

    };
    render() {
        const {id, courseType, courseName, courseGrade} = this.props.course;
        return (
            <tr key={id}>
                <td>
                    {courseName}
                </td>
                <td> 
                    {(courseType ? 'a' : 'm' )}
                </td>
                <td>
        {(courseGrade !== '' 
            ? courseGrade 
            : <input 
                type="number"
                id={id}
                onChange={this.updatedGrade}
                value={courseGrade}
            /> 
        )}
                </td>
                <td>
                    <button 
                        onClick={this.props.removeCourse.bind(this, id)}
                        style={btnStyle}
                    >
                        remove
                    </button>
                </td>
            </tr>
        )
    }
}

这是我的应用程序相关代码:

    class App extends Component {
  state = {
    courses: [
      {
        id: 1,
        courseName: 'bioliogy,
        courseType: false,
        courseHours: 10,
        courseGrade: ''
      },{
        id: 2,
        courseName: 'Mahematics,
        courseType: true,
        courseHours: 20,
        courseGrade: ''
      },{
        id: 3,
        courseName: 'History,
        courseType: false,
        courseHours: 30,
        courseGrade: 50
      }
    ]
  };



  updateCourseGrade(courseGrade, id){

    //const courseGradeNum = Number(courseGrade);
    this.setState({
      courses: this.state.courses.map(course => course.id === id ? {...course, courseGrade } : course)
    })
  console.log('courseGrade ', courseGrade);

现在,当我这样做时:

 updateCourseGrade(courseGrade, id){

    const courseGradeNum = Number(courseGrade);
    this.setState({
      courses: this.state.courses.map(course => course.id === id ? {...course, courseGradeNum } : course)
    })

在输入名为 courseGrade 时,状态将获得一个新值,但我不希望这样。 此外,courseGrade 已在 Course 组件中定义为 Number

我能做什么?也许我不应该在 course 组件中使用值?

更新

根据Freeman Lambda请求,这是我更改输入字段中的值后的状态, 所需类(class)的 courseGrade 状态发生变化。但因为输入字段消失了,我无法继续输入。

链接到显示发生情况的视频 https://www.screencast.com/t/Cyz1v6zMWsq

最佳答案

这里:

    {(courseGrade !== '' 
            ? courseGrade 
            : <input 
                type="number"
                id={id}
                onChange={this.updatedGrade}
                value={courseGrade}
            /> 
        )}

一旦 courseGrade!== ''

,您就明确地将输入更改为纯字符串 a

如果您希望能够继续输入,则必须在输入过程中坚持输入。如果您希望输入在键入后消失,则必须添加一个按钮来控制删除输入的状态,例如:

class Course extends Component {
    state = {
        gradeValidated: false,
    }
    updatedGrade = (e) => {
        this.props.updateCourseGrade(Number(e.target.value), Number(e.target.id));

    };
    toggleGradeInput = (e) => {
        this.setState((state) => ({ gradeValidated: !state.gradeValidated }));

    };
    render() {
        const {id, courseType, courseName, courseGrade} = this.props.course;
        return (
            <tr key={id}>
                <td>
                    {courseName}
                </td>
                <td> 
                    {(courseType ? 'a' : 'm' )}
                </td>
                <td>
        {(this.state.gradeValidated 
            ? courseGrade 
            : <input 
                type="number"
                id={id}
                onChange={this.updatedGrade}
                value={courseGrade}
            /> 
        )}
                </td>
                <td>
                    <button 
                        onClick={this.toggleGradeInput}
                        style={btnStyle}
                    >
                        toggle input
                    </button>
                    <button 
                        onClick={this.props.removeCourse.bind(this, id)}
                        style={btnStyle}
                    >
                        remove
                    </button>
                </td>
            </tr>
        )
    }
}

关于javascript - React-输入字段在onChange后变成字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55044419/

相关文章:

reactjs - react js mapStateToProps 触发 Uncaught TypeError : Cannot read property 'map' of undefined

reactjs - 传递所有 props 的 HOC

c++ - 使c++不等待用户输入

javascript - 将字符串写入 Hrefs 但忽略某些类

javascript - Gatsby worker 错误 :

javascript - 使用带有 start 指定的时间片参数的 MediaRecorder 的正确方法

java - 接受用户输入时打印格式

javascript - VBA 循环浏览 JavaScript 生成的表中的复选框

javascript - typescript 中的条件返回类型

python - 使用selenium解析网页时的表单、输入问题