javascript - 在输入 onChange 期间 react 改变父状态被卡住

标签 javascript reactjs

我正在构建一个由至少 50 个输入组成的巨大表单。 我在表单组件中编写了一个函数,它将把输入的值保存到表单状态:

父函数

saveToState(details) {
    const { company } = this.state;
    company[details.part][details.element] = details.value;
    this.setState({ company });
  }

传递给子组件(输入)

<FieldInput
  label="Name (as shown) *"
  part="information"
  element="displayName"
  saveToState={this.saveToState}
/>

这是输入组件:

import React, { Component } from 'react';
export default class FieldInput extends Component {
  render() {
    const { label, part, element, saveToState } = this.props;
    return (
      <div className="field">
        <label>{label}</label>
        <div className="ui input">
          <input
            type="text"
            name={`${part}[${element}]`}
            onChange={(e) => saveToState({
              part,
              element,
              value: e.target.value
            })}
          />
        </div>
      </div>
    );
  }
}

结果,每当我在输入中键入内容时,需要 200-300 毫秒才能真正显示我在输入中写入的内容,状态会立即更新,但每当我键入字符时,我都会设置父表单的新状态,并且更新它会更新整个组件。我发现的唯一方法是在父组件中使用 saveToState 而不将其传递下去。但这需要1000行代码,有什么办法解决这个问题吗?谢谢!

最佳答案

有很多方法可以解决这个问题。最简单也是最快的一种是使用 onBlur 而不是 onChange 这样 setState 不会在您按下输入时发生,而是在您按下输入时发生输入失去焦点。

import React, { Component } from 'react';
export default class FieldInput extends Component {
  render() {
    const { label, part, element, saveToState } = this.props;
    return (
      <div className="field">
        <label>{label}</label>
        <div className="ui input">
          <input
            type="text"
            name={`${part}[${element}]`}
            onBlur={(e) => saveToState({
              part,
              element,
              value: e.target.value
            })}
          />
        </div>
      </div>
    );
  }
}

关于javascript - 在输入 onChange 期间 react 改变父状态被卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39688759/

相关文章:

javascript - Magento 管理面板 - 下拉菜单不起作用/显示

reactjs - 如何避免 "options" Prop 被内联初始化?

reactjs - 如何在 enzyme 中测试对象类型 Prop 的属性?

javascript - 作为 prop 传递的日期对象变为 [object Object] 而不是 [object Date]

javascript - 即使设置了 %PYTHON%,Node.js (npm) 也拒绝找到 python

javascript - 获取 Javascript 正则表达式错误——甚至不使用它们

javascript - 带有 Angular JS 解析列表的选项列表

javascript - 如何通过模板中使用的 onclick 函数异步更改模型变量(无需显式刷新)

reactjs - 如何设置 react-admin Datagrid 标题的样式?

javascript - 如果网络请求花费太长时间,是否停止执行?