React - L'utilisation de useMemo() entraîne toujours un ralentissement de la saisie au clavier
P粉340264283
2023-09-03 17:16:59
<p>J'ai ce code, qui comporte de nombreuses zones de saisie, chaque zone de saisie est utilisée pour modifier une valeur de prix.
Comme il y a beaucoup de zones de saisie (3 prix par zone et 3 prix par prix), pour éviter de tout restituer à chaque fois, j'ai utilisé useMemo sur la fonction qui met à jour la valeur de la zone de saisie, et en plus de a également utilisé useReducer pour éviter que le code ne soit trop long pour contrôler la zone de saisie. </p>
<p>Cependant, la saisie de caractères (ou de chiffres) ne s'affiche pas instantanément, mais prend un court laps de temps pour s'afficher, sans parler d'une saisie continue. </p>
<pre class="brush:php;toolbar:false;">const handleUpdate = useMemo(
() => (propriété, valeur, obid) =>
dispatch({ type : "UPDATE_DATA", propriété, charge utile : valu, id : obid });
},
[expédition]
);</pré>
<p>Et il y a un réducteur : </p>
<pre class="brush:php;toolbar:false;">function réducteur (état, action) {
commutateur (action.type) {
...
cas "UPDATE_DATA" :
retour {
...État,
données : state.data.map((élément) => {
if (item.id === action.id) {
return { ...item, [action.property] : action.payload } ;
}
retourner l'objet;
}),
} ;
}
}</pré>
<p>Je recommande de vérifier l'intégralité du code, car le problème (ou la solution) peut résider ailleurs. Afin de voir l'intégralité du code, vous pouvez vous référer à ce lien sandcodebox. Veuillez me pardonner d'avoir copié une partie du code, ce qui a entraîné un mauvais format CSS.
Notez que la fonction fetch a été remplacée par un long tableau de données simulées. </p>
<p>Lien : https://codesandbox.io/s/unruffled-feynman-g9nox2?file=/src/App.js</p>
通常,
useMemo
的作用是在渲染期间缓存昂贵计算的值。然而,在您的情况下,您没有任何昂贵的渲染计算;每次输入更改时,您只是渲染一个非常大的树。实际上,因为所有状态都在App
组件上,所以每次都会重新渲染整个应用。在React中优化这个问题的方法是尽可能跳过渲染组件。为此,将页面的不相关部分拆分为不同的组件。一旦分离逻辑,用
React.memo()
包装它,这是一种可以完全跳过组件渲染的不同优化技术。对我来说,您可以做出的最明显的更改是:
TodosDatos
移出App
组件,因为它是常量,不需要在每次渲染时重新定义(这可能会占用内存)。<Table>
放入一个新的组件中,并使用React.memo()
进行记忆。确保将所有表格的依赖值传递给新组件的props。我在这里实现了这些更改:https://codesandbox.io/s/green-breeze-mmum6n?file=/src/App.js。现在您应该注意到键入几乎是即时的。您还可以在其他地方进行多次优化,以获得更好的性能。