gpt4 book ai didi

reactjs - 仅在 React 表单上重新呈现更新的元素

转载 作者:行者123 更新时间:2023-12-04 04:23:33 26 4
gpt4 key购买 nike

我想实现一个动态构建的表单,其中包含可扩展的受控组件。我遇到的问题是更新状态导致整个表单重新呈现(或昂贵的东西?)导致史诗类型滞后。

// Generate some example fields
let defaultFields = {};
for(let n=0; n<1000; n++){
defaultFields[n.toString()] = {'id':n.toString(), 'value':'','label':'Field '+n}
}
const [valuesById, setValuesById] = useState(defaultFields);

const updateValueCallback = React.useCallback((e)=>{
e.preventDefault();
e.persist();
setValuesById(prevValuesById => {
let fieldId = e.target.id;
return {...prevValuesById,
[fieldId]:{
'id':fieldId,
'value':e.target.value,
'label':'Field '+fieldId
}};
});
});
return <div>
{ Object.entries(valuesById).map(([id,formField]) => {
return <p key={formField.id}>
<label>{formField.label}
<SingleLineStringInput isRequired={false} value={formField.value} onChangeCallback={updateValueCallback} id={formField.id} name={'name_'+formField.id} />
</label>
</p>
})
}
</div>;

如果 999 个字段的 Prop 都没有改变,那么为什么要重新渲染?或者这里实际发生了什么(这些字段实际上并没有在调试工具中闪烁,而是在父项中闪烁)?我真的需要帮助来更好地理解这一点,并且需要一个与我所做的没有太大不同的修复,因为我们已经在这个基本结构之上构建了大量逻辑,并且现在才意识到它没有扩展。

单线输入:

const SingleLineStringInput = React.memo(({name, id, value, onChangeCallback}) => {
console.log("UPDATING "+id);
return <input className={'input ' + inputClasses.join(' ')} name={name} id={id} type="text"
value={(value === null) ? '' : value}
onChange={onChangeCallback} />
});

最佳答案

好的,我会尽力提供帮助,您使用 memo 和 useCallback 做得很好,但是您没有将依赖项数组传递给 useCallback,因为您的回调对于每个渲染都是相同的,您可以传递一个空数组给它,所以它在每个渲染器上都是相同的函数,你可以这样做

const updateValueCallback = React.useCallback((e)=>{
e.preventDefault();
e.persist();
setValuesById(prevValuesById => {
let fieldId = e.target.id;
return {...prevValuesById,
[fieldId]:{
'id':fieldId,
'value':e.target.value,
'label':'Field '+fieldId
}};
});
}, []); // dependencies array

现在,如果您更改字段值,该字段将被重新呈现

Sandbox向您展示它是如何完成的

希望对你有帮助

关于reactjs - 仅在 React 表单上重新呈现更新的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58489082/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com