Почему перезапуск обновляет только реквизиты один раз с помощью библиотеки activ-hooks-testing-libary? - PullRequest
3 голосов
/ 16 мая 2019

У меня есть крюк с 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 Ответ

1 голос
/ 17 мая 2019

Собираюсь дать ответ, но если Майк Пейпер отправит сообщение, я отмечу его как решение, так как он дал его мне на https://github.com/mpeyper/react-hooks-testing-library/issues/75.

Цитировать:

Это не будет работать, как ожидается, так как передается только первый аргумент до обратного вызова. Обычно вы передаете объект с несколько ключей и деструктурировать его в обратном вызове:

const { rerender } = renderHook(({ a, b, c }) => useSomeHook(a, b, c))

rerender({ a, b, c}) 

Причина этого в том, что он должен имитировать реквизит оберточного компонента.

...