Я пытаюсь написать свою собственную многоразовую функцию перехвата useEffect useEffectOnce()
для запуска только один раз (при монтировании и размонтировании), но это кажется невозможным. Моя функция вызывается после каждого повторного рендеринга: https://codesandbox.io/s/mjx452lvox
function useEffectOnce() {
console.log("I am in useEffectOnce");
useEffect(() => {
console.log("I am in useEffectOnce's useEffect");
return () => {
console.log("i am leaving useEffectOnce's useEffect");
};
}, []);
}
function App() {
const [count, setCount] = useState(0);
useEffectOnce(); // once!?
return (
<div className="app">
<h3>useEffectOnce (my reusable function)... Wait, once!?</h3>
<button onClick={() => setCount(count + 1)}>
You clicked me {count} times
</button>
</div>
);
}
Примечания:
- Хук useEffect () внутри useEffectOnce () работает должным образом
useEffectOnce(() => {}, []);
ничего не меняет
... и затем большой сюрприз, такое же поведение с многоразовой функцией перехвата useState (!?): https://codesandbox.io/s/2145m37xnr
Моя функция useButton
вызывается после каждого повторного рендеринга и при первом, независимом нажатии кнопки.
function useButton(initialCounterValue) {
const [usebuttoncount, setUseButtonCount] = useState(initialCounterValue);
console.log("I am in useButton");
const handleuseButtonClick = () => {
setUseButtonCount(usebuttoncount + 1);
};
return {
usebuttoncount,
onClick: handleuseButtonClick
};
}
function App() {
const [count, setCount] = useState(0);
const useButtonCounter = useButton(0);
return (
<div className="app">
<h3>
useButton (my reusable useState function) is called only when... OMG!?
</h3>
<button onClick={() => setCount(count + 1)}>
You clicked me {count} times
</button>
<br />
<button {...useButtonCounter}>
(useButton hook) You clicked me {useButtonCounter.usebuttoncount} times
</button>
</div>
);
}
use
, заключается в том, что у вас есть линтинг, так что вы случайно не используете свои пользовательские функции, которые содержат крючки в случайных местах, а не в верхней части компонента, как и должны быть крючки. Вы вызываете свои пользовательские перехватчики в компоненте, что приводит к определению, оценке и выполнению фактических перехватчиков реакции. Пользовательские хуки не могут иметь ту же функциональность, что и исходные хуки, поскольку в React есть настраиваемая логика для их оценки. - person Shubham Khatri   schedule 19.11.2018useEffectWrapper(...args => useEffect(...args))
. Он делает то же самое. Все хуки всегда вызываются при рендере. Но встроенные хуки могут поддерживать внутреннее состояние между вызовами, а обычные функции - нет. - person Estus Flask   schedule 19.11.2018