В моем приложении React есть хранилище с избыточностью, в котором содержится пользователь со следующей моделью:
{
id: "",
name: "",
email: "",
isAdmin: false,
client: { id: undefined },
token: "",
tokenExpiry: null
};
На простой странице я запрашиваю базу данных для других данных, связанных с этим пользователем. Для этого я использую преимущество useEffect
hook:
useEffect(() => {
// Check JWT auth token and refresh if near expiry
auth.refresh(
{ token: user.token, tokenExpiry: user.tokenExpiry },
// Request user "field" data
loadFields(user.client.id, user.token)
);
}, [user.client.id, user.token]);
При сборке React выдает предупреждение React Hook useEffect has missing dependencies: 'loadFields' and 'user.tokenExpiry'. Either include them or remove the dependency array
.
Если я правильно понимаю useEffect
, второе Параметр - это значения, которые Reach будет «наблюдать», после любого изменения компонент будет перерисован (аналогично тому, как работает componentDidUpdate
) ...
Хотя в моем useEffect
используются другие значения вызовите, я хочу повторно обработать эту функцию только когда user.client.id
или user.token
изменен. Это сделано для того, чтобы избежать ненужных повторных визуализаций при изменении других частей пользовательской модели, поэтому я не хочу добавлять user.tokenExpiry
в качестве зависимости.
Поскольку функция loadFields
также используется как функция вне useEffect
logi c, я не могу поместить его в useEffect
, поэтому я попытался добавить его как зависимость, но это вызывает повторный рендеринг l oop, так как он имеет вызов dispatch
внутри него:
const loadFields = async (clientId, token) => {
setIsLoading(true);
try {
await dispatch(fetchFields(clientId, token));
setIsLoading(false);
} catch (error) {
setIsLoading(false);
dispatch(resetFields());
}
};
Так каков правильный путь к импелменту useEffect
в этом сценарии?