#reactjs #redux #rtk-query
Вопрос:
При использовании запроса RTK в компоненте React очень возможно возникновение ошибки утечки памяти / отсутствия операции, если компонент будет отключен до завершения запроса.
Например, если вы используете isError
или isSuccess
RTK попытается установить их, даже если компонент размонтирован.
Ранее я вручную проверял, что выборка не была прервана, и устанавливал состояние только в случае необходимости. Я не уверен, как справиться с этим с помощью запроса RTK, в котором состояние обрабатывается автоматически.
Возможно, я неправильно понимаю, как с этим бороться, или RTK-запрос может справиться с этим каким-то неизвестным мне способом.
Ответ №1:
На данный момент это сообщение об ошибке можно проигнорировать, потому что на самом деле оно уже исчезает в React 18:
https://github.com/reactwg/react-18/discussions/82
Подводя итог, мы удаляем это предупреждение. Случай, для которого это актуально (подписки), не очень часто встречается в коде продукта и обычно инкапсулируется в пользовательских крючках и библиотеках. Случай, с которым сталкивается большинство разработчиков продуктов, — это тот, когда это предупреждение не только бесполезно/вводит в заблуждение, но и подталкивает разработчиков к худшим решениям, пытаясь подавить предупреждение. Надеюсь, это изменение уменьшит путаницу и позволит вам удалить из кода кучу смонтированных проверок.
Комментарии:
1. Спасибо! Я понятия не имел, что это такое.
Ответ №2:
Это ваша интерпретация или вы действительно получаете сообщение об ошибке здесь? В RTK-запросе эти данные будут сохранены в хранилище (в случае, если вы вернетесь назад), но будут удалены через 60 секунд, если ни один компонент, использующий их, не монтируется. Утечка памяти практически невозможна, она просто не привязана к отдельному компоненту, потому что она основана на Redux.
Комментарии:
1. Это происходит. Я протестировал его, выполнив запрос по нажатию кнопки, на выполнение которого ушло не менее 5 секунд. Я сразу же сошел со страницы. Через 5 секунд
unmounted component
в консоли отобразится сообщение об ошибке. Возможно, у меня что-то настроено неправильно, однако я не думаю, что это так, и мои варианты использования довольно просты.2. Не могли бы вы, пожалуйста, проверить, по-прежнему ли это происходит с последней бета-версией версии v1.7, и если это так, пожалуйста, откройте проблему с воспроизведением?
3. Будет сделано! Я настроил этот небольшой тест исключительно для того, чтобы проверить, была ли это проблема с RTK, поскольку у меня были те же мысли, что и у вас.