【发布时间】:2020-02-25 11:19:15
【问题描述】:
我正在尝试大型 React 表单,但表单中的每个输入都很复杂并且具有复杂的状态。我将所有输入的状态保存在parent 组件中,每个输入都包装在child 组件中。我在父级中有一个状态数组,其中包含所有输入元素的当前状态值。目前,每次输入中有onChange 时,我都会尝试通过setState() 重置父级中的整个状态数组。最多 5 个输入是可以的,但是一旦我超过了这个(比如 100 个输入),我开始注意到程序中有一些严重的滞后。 请注意:该程序还允许您重新排列 delete 和 add 输入,因此状态需要适应这些更改即。第一个输入可以与第二个输入交换位置或在第 10 个输入之后插入。
我的目标是找到一种方法来优化这个 onChange 的性能。最终,我真的不需要将数据放在parent 组件中,我只需要在单击页面底部的save 时收集输入的值。
重申一下,我有两个组件。
父组件
子组件
Child 组件基本上是一个input,用户可以在其中编写数百行文本。
Parent 组件包含 100 个子组件,基本上如下所示:
export default function Parent(props) {
const [state, setState] = useState(createDummyData());
useEffect(() => {});
const onInputChange = (value, index) => {
var tempValue = [...state];
tempValue[index] = value;
setState(tempValue);
};
return (
<>
<div style={{ display: "flex", flexDirection: "column" }}>
{state.map((item, index) => (
<Child
value={state[index].content}
index={index}
onChange={onInputChange}
/>
))}
<button style={{backgroundColor: "red"}}>save input data</button>
</div>
</>
);
}
子组件长这样
export default function Child(props) {
useEffect(() => {});
const onChange = event => {
props.onChange(event.target.value, props.index);
};
return (
<>
<input value={props.value} onChange={onChange} />
</>
);
}
我还没有找到解决这个问题的简单方法。有些人似乎建议使用 Redux,其他人似乎说使用 useMemo 和 useEffect 的组合来防止重新渲染。非常感谢您的帮助。
我注意到的一件事是,如果我尝试将单个状态保留在子组件中,它们会更快地呈现onChange。这可能是因为它不必每次都为父状态数组设置状态。如果可能的话,我希望能够在单击保存时简单地通过并获取子节点的状态。在这种情况下我会使用ref 吗?没有参考可以做到吗?
我也想避免使用 onBlur() 只是为了这个项目的目的
codesandbox 复制如下供参考:https://codesandbox.io/s/cocky-knuth-jm8n6?fontsize=14
【问题讨论】:
-
您没有设置导致延迟的主要原因
标签: javascript reactjs frontend state onchange