Это заблуждение в React сегодня. Многие думают, что компонент функции не будет вызван, если реквизит и состояние не изменятся. По правде говоря, ваша функция может вызываться много раз при повторном рендеринге родительского компонента, и React проверяет старый Shadow DOM, чтобы определить, соответствует ли он новому Shadow DOM. Что мы можем скажем, так это то, что возвращенный JSX не будет обновляться в реальном DOM, если реквизиты и состояние не были изменены.
Что вы можете сделать, чтобы сократить время Движок React вызывает компонент функции, это попытка предотвратить ненужное обновление компонентов (включая ваши родительские компоненты). Вот несколько вещей, которые я вижу, глядя на ваш код:
Новый экземпляр fetchPost
создается при каждом вызове вашей функции. Это означает, что при каждом выполнении у него будет другой адрес памяти. Затем он передается дочерним компонентам как props
, что означает, что каждый раз, когда выполняется ваш SinglePostBySearch
компонент, дочерние элементы будут вынуждены отображаться. У вас могут быть похожие ситуации в родительском компоненте, которые вызывают чрезмерный вызов этого компонента. Чтобы избежать этого, любая функция, которую вы передаете children
как prop
, должна быть заключена в useCallback
, чтобы она правильно запоминалась и не создавала новый экземпляр каждый раз.
Вы вызываете функцию getElt
каждый раз, когда выполняется функция компонента, даже если данные не изменились. Если вам необходимо предотвратить многократное выполнение функции, это может быть полезно для useMemo
или useCallback
(в зависимости от варианта использования) и указания зависимостей (loading
, isThereQuery
, posts
) в массиве deps
крючка. Таким образом, функция будет пересчитана только при изменении любой из этих зависимостей.
Вы заключаете loading
, isThereQuery
и posts
в анонимный объект {}
каждый раз, когда вы передаете их. Это создает новый объект каждый раз, когда он видит это, что означает, что у него есть новый адрес памяти - и заставит всех потомков, которым вы передадите его в качестве реквизита, перерисовать. Хук useState
уже поддерживает адрес памяти значения, поэтому, обернув его в новый объект, вы можете потенциально вызвать проблемы.
В React, когда вы используете интерполяцию для привязки данные непосредственно в JSX ({getElt({loading},{isThereQuery},{posts})}
), React считает это дочерним элементом. Я не уверен, как анонимный объект повлияет на это, но не мешает избавиться от лишних объектов, обертывающих каждый параметр, тем более, что вы все равно снова разрушаете их в функции getElt
.