Size: a a a

Reatom — стейт-менеджер

2020 August 22

a

artalar in Reatom — стейт-менеджер
Илья
@artalar а есть что-нить как ускорить убрать лишние запуски используя атом
const column = useAtom(itemsState, (items) => items[id] || {}, [id]);

или нет? или не туда смотрю это все ок?
Не понял
источник

a

artalar in Reatom — стейт-менеджер
Что за запуски?)
источник

И

Илья in Reatom — стейт-менеджер
Есть n компонентов у которых:
`
const Column = ({id}) => {
источник

a

artalar in Reatom — стейт-менеджер
Илья
Есть n компонентов у которых:
`
const Column = ({id}) => {
так?)
источник

И

Илья in Reatom — стейт-менеджер
щас пишу чтобы максимально понятно
источник

a

artalar in Reatom — стейт-менеджер
Каждый такой компонент должен ререндерится только при изменении его данных
источник

a

artalar in Reatom — стейт-менеджер
Илья
щас пишу чтобы максимально понятно
гуд
источник

И

Илья in Reatom — стейт-менеджер
Просто или я переработал) или найдется ответ )
источник

И

Илья in Reatom — стейт-менеджер
artalar
гуд
Есть n компонентов у которых:
`
const Column = ({id}) => {
 const element = useAtom(
   itemsState,
   (items) => items[id] || {}
   [id],
 );

 console.log({ id })

 return <>
   {element.html}
 </>
}
itemsState имеет структуру:

itemsState = {
 1: {
   id: 1,
   html: '1'
 },
 2: {
   id: 2,
   html: '2'
 }
}
`


При добавлении нового элемента или правке я вижу console.log всех отображаемых id на экране, а ожидаю только тех id, объекты которые были изменены.

Кажется что запускаются все компоненты у которых useAtom(itemsState) - itemsState в целом изменен и запускается тело селектора

Что в моих ожиданиях не так?
источник

И

Илья in Reatom — стейт-менеджер
id в компоненте не меняется же - сам его объект тоже - ожидаю что он не будет каждый раз запускаться
источник

a

artalar in Reatom — стейт-менеджер
А как этот список рендерится?
источник

a

artalar in Reatom — стейт-менеджер
Скорее всего ререндеры не от useAtom, а от родительского маппинга списка
источник

a

artalar in Reatom — стейт-менеджер
Сомпоненты рендерятся по Object.keys(itemsState)map(…. или от вообще отдельного атома?
источник

И

Илья in Reatom — стейт-менеджер
const columns = useAtom(
   itemsState,
   (items) => {
     return items[id] ? items[id].columns || [generateUid()] : null;
   },
   [id],
 );

 return columns ? (
   <Row>
     <RowColumnsCmp>
       {columns.map((column) => (
         <RowColumnCmp key={column} rowId={id} columnId={column} />
       ))}
     </RowColumnsCmp>
     {/* {item.id} */}
     <RowBorderCmp id={id} />
     <RowSideButtonsCmp id={id} dragHandleProps={dragHandleProps} />
   </Row>
 ) : null;
источник

И

Илья in Reatom — стейт-менеджер
там сложно еще я в целом стараюсь сделать вложенность и каждый раз минимум привязываться - чтобы кратно не рос рендер
источник

И

Илья in Reatom — стейт-менеджер
@artalar добавил лог в родительский
источник

И

Илья in Reatom — стейт-менеджер
источник

И

Илья in Reatom — стейт-менеджер
запустилось сколько - а родительский 0 раз
источник

a

artalar in Reatom — стейт-менеджер
RowInerComponent откуда id берет?
источник

И

Илья in Reatom — стейт-менеджер
источник