我有一个包含多个文本输入的表单。我将它们全部设置为受控输入。键入时,新文本在字段中显示的延迟最多可达数秒。这是一个示例字段:
string
我无法弄清楚是什么导致它变得如此之慢或者该如何解决它。
更新:这里的组件应该足以显示正在发生的事情。
cin
答案 0 :(得分:20)
我有类似的情况,我的解决方案是禁用React Dev Tools。它们以某种方式影响输入字段。问题是如果您单击了React Dev Tools选项卡,则刷新页面是不够的。它们仍在影响您的投入。您必须打开新页面才能阻止它们。您也可以完全从Chrome中删除它们,但我不建议这样做,因为它们很有用。 :)
答案 1 :(得分:5)
发生这种情况的原因有很多。我遇到了类似的问题并将主要原因过滤到:
无论是什么原因,我找到了一个快速解决方案。如果您只想将其存储到状态但不使用它进行实时渲染。然后,您可以安全地替换' onChange' to' onBlur'。这没有dealay和滞后。如果你知道其他任何不起作用的情况,请告诉我!
更改代码如下:
<label>Event Name</label>
<input
type="text"
placeholder="Title"
className="form-control"
name="title"
value={this.state.event.title}
onBlur={this.handleChange} />
答案 2 :(得分:3)
这是我找到的修复程序。它将父状态设置为onBlur。请审核这个
import React, { useState } from 'react';
import MUIField from '@material-ui/core/TextField';
import _ from 'lodash';
export default (props) => {
const [value, setValue] = useState(props.defaultValue);
const prop = _.omit(props, ['onChange', 'value', 'defaultValue']);
return (
<MUIField {...prop} value={value}
onChange={e => { setValue(e.target.value); }}
onBlur={() => {
props.onChange({ target:{ value }});
}}/>);
};
答案 3 :(得分:1)
以下是输入模式Plug in or pattern for dealing with large forms in React?的示例。主要的是将您的输入作为一个组件,将更改传递给父级,但如果它们是相同的,则不会从props更新。
答案 4 :(得分:1)
我的问题是我的状态对象很复杂,因此导致呈现问题。我的解决方案是管理组件中注释的状态,然后在模糊时更新容器状态。
const { data, onEdit } = props;
const { containerNotes } = data;
const [notes, setNotes] = useState('');
useEffect(
() => {
setNotes(containerNotes);
},
[containerNotes],
);
const onChangeNotes = () => ({ target: { value } }) => {
setNotes(value);
};
const onBlurNotes = (prop) => ({ target: { value } }) => {
const newData = update(data, {
[prop]: { $set: value },
});
onEdit(newData);
};
return (
<input
type="text"
placeholder="Title"
name="title"
value={notes}
onChange={onChangeNotes()}
onBlur={onBlurNotes('containerNotes')}
/>
)
答案 5 :(得分:1)
看到它仍然可以得到答复,以为我会更新并关闭它。在handleChange
中调用onChange
将使整个表单在每次更改时都重新呈现,从而减慢了速度。如果您使用的是简单表单,则可以更新onBlur
或创建单独的输入组件,以便将重新渲染隔离到该输入。就个人而言,我会并建议使用Formik来构建表单,因为它会为您抽象出这种复杂性。
答案 6 :(得分:1)
显然,React-Hook-Form
擅长于最大程度地减少重新渲染,并可能优化性能。我还没有尝试过。
答案 7 :(得分:0)
我有redux logger中间件需要足够的时间来创建这个输入延迟。所以,尝试禁用它。