Size: a a a

2020 November 18

🚀🚀

🚀🔬 🚀🔬🚀🔬... in ☄️ effector
Bogdan
Есть стор с глобальным флагом. Он используется в обработчиках клика на элементах списка(через useStore). Изменение флага приводит к перерендеру всех элементов, что совершенно не нужно. Как тогда поступить? Использовать в обработчике getState?
вместо такого подхода

const $items = createStore([])
const openUrl = createEvent()

const Item = ({id}) => {
 const items = useStore($items)
 const {url} = items[id]

 return <Foo onClick={() => openUrl(url)} />
}


можно использовать сэмпл для подключения данных уже после срабатывания события, вне ui

const $items = createStore([])
const click = createEvent()

const openUrl = createEvent()

sample({
 source: $items,
 clock: click,
 fn: (items, id) => items[id].url,
 target: openUrl,
})

const Item = ({id}) => {
 return <Foo onClick={() => click(id)} />
}
источник

🦜

🦜 in ☄️ effector
Bogdan
и что такое dragEvent? мне нужно в самом обработчике dragStart вернуть значение на основе стора
dragEvent любой другой ивент
источник

🦜

🦜 in ☄️ effector
Bogdan
и что такое dragEvent? мне нужно в самом обработчике dragStart вернуть значение на основе стора
что за либу ты юзаешь?
источник

V

Vetro in ☄️ effector
Вынести список в отдельный мемо компонент засунуть обработчик в юзколлбэк с депсом  стора
источник

B

Bogdan in ☄️ effector
У меня нативное событие dragStart
источник

🚀🚀

🚀🔬 🚀🔬🚀🔬... in ☄️ effector
🚀🔬 🚀🔬🚀🔬
вместо такого подхода

const $items = createStore([])
const openUrl = createEvent()

const Item = ({id}) => {
 const items = useStore($items)
 const {url} = items[id]

 return <Foo onClick={() => openUrl(url)} />
}


можно использовать сэмпл для подключения данных уже после срабатывания события, вне ui

const $items = createStore([])
const click = createEvent()

const openUrl = createEvent()

sample({
 source: $items,
 clock: click,
 fn: (items, id) => items[id].url,
 target: openUrl,
})

const Item = ({id}) => {
 return <Foo onClick={() => click(id)} />
}
то есть если не хочешь чтобы ререндерились все компоненты — избавь их от необходимости знать о данных
источник

V

Vetro in ☄️ effector
🚀🔬 🚀🔬🚀🔬
то есть если не хочешь чтобы ререндерились все компоненты — избавь их от необходимости знать о данных
А вообще да, вот так будет правильнее всего
источник

🚀🚀

🚀🔬 🚀🔬🚀🔬... in ☄️ effector
передавай в эвент только те данные, которые есть у компонентов изначально, а вместо useStore подключай данные в сэмпле, по сути просто перенос вычисления в сэмпл
источник

B

Bogdan in ☄️ effector
🚀🔬 🚀🔬🚀🔬
передавай в эвент только те данные, которые есть у компонентов изначально, а вместо useStore подключай данные в сэмпле, по сути просто перенос вычисления в сэмпл
Это понятно. Но в конкретно этом случае не подходит.
onDragStart={() => callEvent(); /* а как мне ивент вернет true или false? */}
источник

🦜

🦜 in ☄️ effector
Bogdan
Это понятно. Но в конкретно этом случае не подходит.
onDragStart={() => callEvent(); /* а как мне ивент вернет true или false? */}
нативный ивент и не требует же
источник

B

Bogdan in ☄️ effector
🦜
нативный ивент и не требует же
Если вернуть false, то драг отменяется
источник

🦜

🦜 in ☄️ effector
Bogdan
Если вернуть false, то драг отменяется
может у тебя с dragEnd что-то не так
источник

🦜

🦜 in ☄️ effector
источник

🚀🚀

🚀🔬 🚀🔬🚀🔬... in ☄️ effector
Bogdan
Это понятно. Но в конкретно этом случае не подходит.
onDragStart={() => callEvent(); /* а как мне ивент вернет true или false? */}
а, ну то есть эти данные необходимы и самому компоненту? тогда в реакте только ререндеры
источник

B

Bogdan in ☄️ effector
источник

🦜

🦜 in ☄️ effector
нативные вообще не требуют, чтобы им что-то возвращали
источник

🦜

🦜 in ☄️ effector
ты точно либу не юзаешь?
источник

🚀🚀

🚀🔬 🚀🔬🚀🔬... in ☄️ effector
🦜
ты точно либу не юзаешь?
это вроде старый способ сделать preventDefault
источник

B

Bogdan in ☄️ effector
🦜
ты точно либу не юзаешь?
может и не нативный. Это из react-grid-layout
источник

🦜

🦜 in ☄️ effector
Bogdan
может и не нативный. Это из react-grid-layout
ух бля
источник