当前位置: 首页 > 知识库问答 >
问题:

React 16.4-手动表单输入填充及其来自GetDerivedStateFromProps的更新?

干浩阔
2023-03-14

在React16.4上更新后,我面临一个问题,在GetDerivedStateFromProps逻辑中有一些突破性的变化。现在,它会在每个组件更新时在传入的和自己的组件的道具上触发。

因此,我已经阅读了文档和手册,但仍然不知道在哪些情况下表单输入字段应该基于传入的道具(Controlled Component),同时能够通过用户自己的输入进行修改?

我也尝试过这篇文章,但它只涉及一次性更新的情况,而不是手动输入的情况:为什么在SetState之后调用getDerivedStateFromProps?

import PropTypes from 'prop-types'
import React from 'react'

export class NameEditor extends React.Component {
  static propTypes = {
    currentLevel: PropTypes.number
  }

  static defaultProps = {
    currentLevel: 0
  }

  constructor(props) {
    super(props)

    this.state = {
      currentLevel: 0
    }
  }

  static getDerivedStateFromProps(nextProps) {
    return {
      currentLevel: nextProps.currentLevel
    }
  }

  _handleInputChange = e => {
    this.setState({
      currentLevel: e.target.value
    })
  }

  render() {
    const { currentLevel } = this.state

    return (
        <input
          placeholder={0}
          value={currentLevel}
          onChange={this._handleInputChange}
        />
    )
  }
}

export default NameEditor

共有1个答案

陆烨烁
2023-03-14

更新:

目前,_handleinputchange方法将只修改子组件的状态,该子组件将调用GetDerivedStateFromProps

该方法的工作方式是,当每个newProps或setState调用发生时都会调用它。

    null

为了解决这个问题:我们将需要一个来自父组件的回调函数,它执行与HandleInputChange相同的工作。

所以:

  1. 向父组件添加HandleCurrentLevelChange方法,该方法将只有一个参数e.target.value,它的任务是修改处于父状态的CurrentLevel
  2. 将创建的HandleCurrentLevelChange所需名称传递给NameEditor。
  3. 按以下方式修改您孩子的handlr:
  _handleInputChange = (e, cb) => {
    this.setState({
      currentLevel: e.target.value
    }, () => {
      cb && cb(e.target.value) //this makes the callback optional.
    });
  }
        <input
          placeholder={0}
          value={currentLevel}
          onChange={(e) => this._handleInputChange(e, handleCurrentLevelChange)}

onchange属性和处理程序的新行为将允许更改同时发生在您的子级和父级。

 类似资料:
  • 我正在尝试为我的角应用程序编写一个e2e测试,特别是一个具有3个选择输入的表单。测试需要涉及从这些选择中随机选择选项。第一个选择已填充了数据,但其他 2 个选择在选择前一个选项时异步填充,因此它们彼此依赖。 选择输入还使用 ng 禁用,并且仅当有根据其 ng 重复表达式可用的选项时才启用。 我在测试中使用了页面对象方法,因此我尝试制作一些实用函数来实现测试中需要的随机选择行为: 页面对象: 鉴于从

  • 我有一个,供用户更改电子邮件 如何停止Chrome自动填充输入。 Chrome记住登录页面的输入数据,并自动填写帐户设置页面。 Chrome自动填充更改我的电子邮件

  • 问题内容: 就像是有什么,但对?我要显示的数据是使用的关联。 我已经尝试使用过,但是在这种情况下,我必须在hibernate状态下使用它,这需要我指定using,并且每当我检索到through时,列表中的元素之间都会有空格,具体取决于。 我需要自动填充集合,因为我需要在创建时动态生成。当我使用plain时,得到以下内容: 还有其他解决方案吗? 编辑 我正在尝试实现动态表格 问题答案: 您无法在MV

  • 我需要创建PDF表格,可以用来从用户的输入。它们需要包含下拉框和文本框。请建议哪种软件或工具最适合我的目的

  • 问题内容: 我有一些PDF表单,我想用Django Web应用程序中的数据自动填充,然后提供给用户下载。哪个python库可以让我轻松地预填充PDF表单?这些表格旨在打印出来。 问题答案: 如果你要生成非常动态的PDF,并且需要以编程方式控制所有PDF(数据和布局),则Reportlab非常有用。 仅在现有的PDF中填写表格,reportlab是过大的,基本上,你将不得不在reportlab中从头

  • 在Thymeleaf中,我可以使用 但是我不知道如何输出到表单动作属性中。 有人对Thymeleaf超文本标记语言有什么想法吗? 样例JavaSpring-MVC控制器代码