Почему перезапуск обновляет только реквизиты один раз с помощью библиотеки activ-hooks-testing-libary?
У меня есть крюк с useEffect
, Я заметил, что useEffect
не запускается более двух раз, потому что после одного rerender
вызов с другими данными, последующие вызовы не получают обновленные данные.
export default function(lookForUsername) {
const [dashboardHref, setDashboardHref] = useState(`https://www.example.com/`);
useEffect(() => {
// this is where I have code that i want to
// run on re-render, but it won't because it stops getting updated
}, [lookForUsername]);
return [dashboardHref];
}
Мой тест это происходит
// this will log false, false on first run
const { rerender, waitForNextUpdate } = renderHook((lookForUsername=false, otherOption=false) => {
console.log(lookForUsername, otherOption);
return useMyHook(lookForUsername);
});
console.log('first re-render');
// this will make the console say true, false
rerender(true, true);
console.log('second re-render');
// console will still say true, false
rerender(false, false);
console.log('third re-render');
// console will stay true, false (so it's not just one behind)
rerender(true, true);
Я не понимаю, почему повторная визуализация с другим значением обновляет реквизиты в renderHook в первый раз, а не в последующие.
ПРИМЕЧАНИЕ. Я обновил заголовок и формулировку вопроса, чтобы лучше отражать проблему после дополнительной отладки.
ОБНОВЛЕНИЕ Я слишком упростил мой пример. Первоначально я только передавал один аргумент в этом посте, но проблема заключалась в том, когда я передавал несколько аргументов
1 ответ
Собираюсь дать ответ, но если Майк Пейпер отправит сообщение, я отмечу его как решение, так как он дал его мне на https://github.com/mpeyper/react-hooks-testing-library/issues/75.
Цитировать:
Это не будет работать так, как ожидалось, поскольку только первый аргумент передается обратному вызову ловушки. Обычно вы передаете объект с несколькими ключами и деструктурируете его в обратном вызове:
const { rerender } = renderHook(({ a, b, c }) => useSomeHook(a, b, c))
rerender({ a, b, c})
Причина этого в том, что он должен имитировать реквизит обертывающего компонента.