【发布时间】:2019-04-21 23:45:13
【问题描述】:
我有一个 React 组件,它呈现一个中等大小的输入列表(100 多个项目)。它在我的计算机上呈现正常,但在我的手机上存在明显的输入延迟。 React DevTools 显示整个父对象在每次按键时都会重新渲染。
有没有更有效的方法来解决这个问题?
https://codepen.io/anon/pen/YMvoyy?editors=0011
function MyInput({obj, onChange}) {
return (
<div>
<label>
{obj.label}
<input type="text" value={obj.value} onChange={onChange} />
</label>
</div>
);
}
// Passed in from a parent component
const startingObjects =
new Array(100).fill(null).map((_, i) => ({label: i, value: 'value'}));
function App() {
const [objs, setObjects] = React.useState(startingObjects);
function handleChange(obj) {
return (event) => setObjects(objs.map((o) => {
if (o === obj) return {...obj, value: event.target.value}
return o;
}));
}
return (
<div>
{objs.map((obj) => <MyInput obj={obj} onChange={handleChange(obj)} />)}
</div>
);
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
【问题讨论】:
-
看起来你是在调用你的函数而不是传递它。
onChange={handleChange(obj)}应该是onChange={() => handleChange(obj)} -
<MyInput />的密钥也丢失了 -
@DCTID handleChange 正在对事件函数进行柯里化。所以在调用的时候,会返回一个函数来处理事件函数。
标签: reactjs react-hooks