У обоих рецептов есть проблемы.
Способ 1 потенциально позволяет условно вызывать ловушку при рендеринге компонента, это может привести к ошибке и не рекомендуется :
Не вызывать Хуки внутри циклов, условий или вложенных функций. Вместо этого всегда используйте Hooks на верхнем уровне вашей функции React. Следуя этому правилу, вы гарантируете, что хуки вызываются в одном и том же порядке каждый раз при рендеринге компонента. Это то, что позволяет React правильно сохранять состояние хуков между несколькими вызовами useState и useEffect.
Как объяснено в в этом ответе , это правило можно отменить, если гарантируется, что условие не изменяется между визуализациями.
Чтобы гарантировать это, запомните условие:
function useFunctionality(initState, enable) {
const condition = useMemo(() => enable, []);
if (!condition)
return null;
const [funct, updateFunct] = useState(initState);
return funct;
}
Способ 2 предпочтительнее, потому что он чище, а useState
звонок не дорогой.
Оба способа имеют одну и ту же проблему, они используют состояние, которое никогда не меняется. Если это намерение, это вариант использования для ссылки. Поскольку оно никогда не изменяется, условие может быть помещено в качестве начального значения:
function useFunctionality(initState, enable) {
return useRef(enable ? initState: null).current;
}