Size: a a a

2019 September 12

DD

Dmytro Dovhan in React Kyiv
Andrey Listochkin
какие люди! привет-привет!
источник

AM

Alex Malamud in React Kyiv
Alex Malamud
Подшаманить чутка с бабелем и сделать customPrice.val()?.length
называется этот пропоузал optional chaining
источник

DB

Dima Bildin in React Kyiv
Terry Sahaidak
мені здається в цьому прикладі val() мало б завжди повертати масив)
Это выглядит, как инпут, тогда строка. .val() должно всегда возвращать строку. И если это так, то нет смысла во втором условии, просто if input.val()
источник

SS

Serhii Sydoruk in React Kyiv
Доброго дня панство!

Подскажите по хукам и фетчам)

Есть компонент с хуком, в котором пристувует запрос:

useEffect( () => {
   const {isFetched, isFetching} = companiesState;
 console.log( 'ExampleComponent: ready to be initiated' );
   console.log( `ExampleComponent:isFetched: ${isFetched}, isFetching: ${isFetching}` );

 if ( !isFetched && !isFetching ) {
   console.log( 'ExampleComponent: fetch initiated' );
   fetchAllCompanies( companiesDispatch );
 }
}, [ companiesState.isFetched, companiesState.isFetching ] );


Если в приложении использовать больше одного компонента, с таким эффектом (2 разных компонента проверяют если данных нет - сделать запрос).

В итоге вижу на каждый из компонентов

ExampleComponent: ready to be initiated
ExampleComponent:fetch initiated
ExampleComponent:isFetched: false, isFetching: false

OtherComponent:ready to be initiated
OtherComponent:fetch initiated
OtherComponent: isFetched: false, isFetching: false


Как сделать так, что бы когда первый из компонентов начинает вызывать fetchAllCompanies что бы любой другой не делал лишний запрос а дождался выполнения?

Пока что думаю только про debounce для fetchAllCompanies функции, есть ли другие решения?
источник

G

GNU/Vsevolod.rs in React Kyiv
Serhii Sydoruk
Доброго дня панство!

Подскажите по хукам и фетчам)

Есть компонент с хуком, в котором пристувует запрос:

useEffect( () => {
   const {isFetched, isFetching} = companiesState;
 console.log( 'ExampleComponent: ready to be initiated' );
   console.log( `ExampleComponent:isFetched: ${isFetched}, isFetching: ${isFetching}` );

 if ( !isFetched && !isFetching ) {
   console.log( 'ExampleComponent: fetch initiated' );
   fetchAllCompanies( companiesDispatch );
 }
}, [ companiesState.isFetched, companiesState.isFetching ] );


Если в приложении использовать больше одного компонента, с таким эффектом (2 разных компонента проверяют если данных нет - сделать запрос).

В итоге вижу на каждый из компонентов

ExampleComponent: ready to be initiated
ExampleComponent:fetch initiated
ExampleComponent:isFetched: false, isFetching: false

OtherComponent:ready to be initiated
OtherComponent:fetch initiated
OtherComponent: isFetched: false, isFetching: false


Как сделать так, что бы когда первый из компонентов начинает вызывать fetchAllCompanies что бы любой другой не делал лишний запрос а дождался выполнения?

Пока что думаю только про debounce для fetchAllCompanies функции, есть ли другие решения?
Думаю тебе стОит вынести логику фетча из компонента в отд. компонент
источник

G

GNU/Vsevolod.rs in React Kyiv
и каждый просто будет ждать его
источник

G

GNU/Vsevolod.rs in React Kyiv
GNU/Vsevolod.rs
Думаю тебе стОит вынести логику фетча из компонента в отд. компонент
"синглтон" если по умному
источник

G

GNU/Vsevolod.rs in React Kyiv
и перформанснее будет, вызов хуков тоже не бесплатен
источник

SS

Serhii Sydoruk in React Kyiv
эээээ… на каждый запрос создавать компонент прослойку чисто для запроса данных?

При 8 сторах и в среднем 4-5 запросов на каждый, 32 компонента fetch-прослойки?
источник

G

GNU/Vsevolod.rs in React Kyiv
Serhii Sydoruk
эээээ… на каждый запрос создавать компонент прослойку чисто для запроса данных?

При 8 сторах и в среднем 4-5 запросов на каждый, 32 компонента fetch-прослойки?
Зачем прослойку? У тебя стейт общий?
сделай что то типа
const Fetcher = () => {
 useEffect(() => {
   fetchAll().then(data => setState(data))
 })
}

const Component = () => {
 const { someData, isFetching } = state
 return (
   isFetching ? <Spinner /> : <DisplayData data={someData} />
 )

}
источник

G

GNU/Vsevolod.rs in React Kyiv
<Fetcher />
<Component />
<Component />
...
источник

G

GNU/Vsevolod.rs in React Kyiv
GNU/Vsevolod.rs
Зачем прослойку? У тебя стейт общий?
сделай что то типа
const Fetcher = () => {
 useEffect(() => {
   fetchAll().then(data => setState(data))
 })
}

const Component = () => {
 const { someData, isFetching } = state
 return (
   isFetching ? <Spinner /> : <DisplayData data={someData} />
 )

}
Или же заменить Fetcher на свой хук, что то типа useAllData()
источник

AM

Alex Malamud in React Kyiv
Serhii Sydoruk
эээээ… на каждый запрос создавать компонент прослойку чисто для запроса данных?

При 8 сторах и в среднем 4-5 запросов на каждый, 32 компонента fetch-прослойки?
вообще в компонентах не должно быть сайд эфектов
источник

AM

Alex Malamud in React Kyiv
сделай какой-то API client, который будет инициализироваться вместе с App
источник

SS

Serhii Sydoruk in React Kyiv
<Page>
  <CompaniesList/>
  <SomeComponent>
      <OtherComponent>
          <CompaniesCount />
      </OtherComponent>
  </SomeComponent>
<Page>


Вот не хотелось думать о том, кто первый появится и пытаться кого-то засаспендить.

Переучиваюсь с Redux/MobX на хуки и просто хочу что бы состояние стора (описаного по примеру из https://kentcdodds.com/blog/how-to-use-react-context-effectively) влияло на то, будут ли другие компоненты делать fetch или дождутся когда прийдет первый запрос
источник

AM

Alex Malamud in React Kyiv
и дергай этот API client из миддлвары редакса
источник

SS

Serhii Sydoruk in React Kyiv
ну да, редакс))
как без него?)
источник

AM

Alex Malamud in React Kyiv
а, если без редакса то все немного сложнее)
источник

SS

Serhii Sydoruk in React Kyiv
why… why me…
источник

SS

Serhii Sydoruk in React Kyiv
@alexeyraspopov а как вы делаете?) перечитал в чате твои рецепты для хуков (соотвественно и статья указаная выше где то в ваших обсжудениях хуков всплывала)
источник