Size: a a a

Next.js — русскоговорящее сообщество

2020 May 22

🦜

🦜 in Next.js — русскоговорящее сообщество
Евгений Данилов
useState в котором уже есть какие-то старые данные, после перехода с текущей страницы на текущую с помощью next/link там остаются все старые данные,а не те, что при первом монтировании компонента присваиваться должны (из GIP и просто дефолтные), будто перехода и не было.
Может из-за fast refresh
источник

🦜

🦜 in Next.js — русскоговорящее сообщество
Ты дебажил анмаунт компонентов?
источник

🦜

🦜 in Next.js — русскоговорящее сообщество
Он происходит?
источник

S

Shuh in Next.js — русскоговорящее сообщество
если ты делаешь переход на туже страницу, почему state должен сбрасыватся?
источник

ЕД

Евгений Данилов... in Next.js — русскоговорящее сообщество
Shuh
если ты делаешь переход на туже страницу, почему state должен сбрасыватся?
Ну мне надо обновить её, вернуть к первоначальному состоянию, как это делается без реакта. Потому и спрашиваю, если это нормальное поведения тогда ок, буду сбрасывать вручную отслеживая onRouteChangeComplete, понимая что произошел переход.
источник

S

Shuh in Next.js — русскоговорящее сообщество
ну если бы это сбрасывалось, то при каждой смене query (по типу currentPage) для какой нибудь таблицы, будет происходить релоад всей страницы, что не совсем то что хочется. а сбрасывать state ты можешь подменой key у компонента
источник

ЕД

Евгений Данилов... in Next.js — русскоговорящее сообщество
А как это сделать, я использую модуль shortid для генерации key, но он вроде как сам по себе не меняется при ререндеринге. Значит загнать его в переменную и при unmount сбрасывать? Просто не во всех случаях мне надо этот state сбрасывать, не при всех изменениях useState,а только при вызове роутера.
источник

S

Shuh in Next.js — русскоговорящее сообщество
как быстрый вариант, можешь использовать query у роута, но надо думать что то другое.. просто не совсем понятен кейс
источник

S

Shuh in Next.js — русскоговорящее сообщество
при изменении query сбрасывать state
источник

ЕД

Евгений Данилов... in Next.js — русскоговорящее сообщество
Я в общем подобные проблемы решал так - `let variable = null;
on routerChangeComplete - variable = <new state>`, потом при монтировании компонента - useEffect - if variable not null - setState(variable) но действия ведь асинхронные и монтирование не всегда происходит тогда, когда уже запустился Router event. или наоборот. Что странно, поскольку на 1 странице работает нормально, но вот взяв свой же код на другую страницу - вызывается одна быстрее другой, но не всегда, дебажил через timestamp.

Это же и выдает ошибку setState on unmounted component (если я напрямую в колбэк роутера напишу — если ты изменил страницу, сбрось стейт), через раз. Если бы не эта ошибка то можно было бы вызывать колбэк роутера, он там не один раз выполняется, рано или позно он бы мне сбросил нужный стейт.
источник

S

Shuh in Next.js — русскоговорящее сообщество
а почему не используешь useRouter? или withRouter ?
источник

ЕД

Евгений Данилов... in Next.js — русскоговорящее сообщество
Shuh
а почему не используешь useRouter? или withRouter ?
useRouter имеет колбэк который запустится после монтирования компонента? Или как мне тогда отследить что страница была изменена, переход выполняется по клику на Link, не router.push чтобы там передавать что-то еще.
источник

S

Shuh in Next.js — русскоговорящее сообщество
в Link можешь передавать ?refresh=true
let { query } = useRouter()
useEffect(() => {
 if (query.refresh) {
   // update/clear state here
 }
}, [query])
источник

A

Alexander in Next.js — русскоговорящее сообщество
Владимир Линкевич
router.replace меняет урл не изменяя window.history
Странно, но при возврате назад оно сохранена история
источник

ВЛ

Владимир Линкевич... in Next.js — русскоговорящее сообщество
Alexander
Странно, но при возврате назад оно сохранена история
replace лишь меняет текущий урл
источник

ВЛ

Владимир Линкевич... in Next.js — русскоговорящее сообщество
Shuh
в Link можешь передавать ?refresh=true
let { query } = useRouter()
useEffect(() => {
 if (query.refresh) {
   // update/clear state here
 }
}, [query])
полный ад))

useEffect(() => {
  Router.events.on('routeChangeComplete', (url) => {
   // свой код
 });
}, [Router]);
источник

ВЛ

Владимир Линкевич... in Next.js — русскоговорящее сообщество
Владимир Линкевич
полный ад))

useEffect(() => {
  Router.events.on('routeChangeComplete', (url) => {
   // свой код
 });
}, [Router]);
отписку ток не забдьте добавить :D
источник

S

Shuh in Next.js — русскоговорящее сообщество
Владимир Линкевич
полный ад))

useEffect(() => {
  Router.events.on('routeChangeComplete', (url) => {
   // свой код
 });
}, [Router]);
а зачем router в подписке?
источник

ВЛ

Владимир Линкевич... in Next.js — русскоговорящее сообщество
Shuh
а зачем router в подписке?
а зачем кидать в квери refresh=true который является костылём?)
источник

S

Shuh in Next.js — русскоговорящее сообщество
я в самом начале сказал что это костыль и надо думать что то еще
источник