El
Ага, ну, тогда разумно юзать юскалбэк
Мне таки непонятно, почему debounce не считает (или что там происходит) коллбек onChange'a той самой функцией, которую он должен дебаунсить. Компонент не создаётся заново, коллбек onChange'a один.
Китикет
Узкий кейс тоже гуглится но чуть сложнее не более
Ну для узкого кейса надо мозги уже включать и разбивать на мелкие подзадачи
Alexey
В среднем - да
Чиновники едят мясо, я — капусту. В среднем мы едим голубцы.
Dmitriy
Ну для узкого кейса надо мозги уже включать и разбивать на мелкие подзадачи
Вот и вывод , что либо не хотят включать либо нечего
Китикет
Чиновники едят мясо, я — капусту. В среднем мы едим голубцы.
Чиновников только 100 например, а вас 1000000, так что в среднем вы едите капусту)
Alexey
Веган
btw i use Arch (c)
Eugene
Recharts еще
Dmitriy
@popuguy а спасибо уточке сказать?)
Seva
привет через что я могу ловить ширину экрана, что бы отображать разные компоненты ?
Dmitriy
шо
https://ru.m.wikipedia.org/wiki/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%83%D1%82%D1%91%D0%BD%D0%BA%D0%B0
Roman
кто юзает селекторы с useSelector, что делаете когда надо передать пропы в селектор: каррируете или замыкаете?
Seva
document.documentElement.clientWidth
минимальное значение показывает 980 или я что то не то делаю
Китикет
кто юзает селекторы с useSelector, что делаете когда надо передать пропы в селектор: каррируете или замыкаете?
Ну когда что-то помимо стейта передается в селектор, это уже не совсем селектор
Китикет
С mapStateToProps все очевиднее намного)
Roman
useSelector(createCurriedSelector(myProp)) или useSelector((state) => mySelector(state, { myProp })
Влад
Ну так в аргументах не только же стейт редакса верно?
Ivan
С mapStateToProps все очевиднее намного)
Просто надо приучиться думать в другую сторону.
Roman
Просто надо приучиться думать в другую сторону.
я-то приучусь, мне надо так, чтоб другие на проекте понимали, что надо делать
Roman
1
я тоже склонялся к этому варианту, смущает то, что я его почти нигде не вижу в доках
Китикет
Мне таки кажется что это с составными селекторами из reselect будет костылем, так как каким-то образом передать туда аргумент из пропсов можно лишь на этапе создания селектора, а какой смысл они будут иметь если у них не будет возможности реализовать мемоизацию?
Китикет
Ну да, походу ошибся, все таки есть такая возможность, как раз потому что можно что угодно передать 2 аргументом
Китикет
Китикет
Я в общем почему-то не знал про существование 2 аргумента, хотя reselect уже 2 года юзаю) Мне подобным образом селектить что-то прямо для рендера не приходилось, обычно только где-то в логике, так что остро вопрос не стоял)
Китикет
Зато теперь у меня есть пару мест на примете, где можно переписать намного удобнее
Китикет
useSelector(createCurriedSelector(myProp)) или useSelector((state) => mySelector(state, { myProp })
Единственное, в 1 варианте я бы обьектом добавлял, потому что так расширять удобнее
Roman
Единственное, в 1 варианте я бы обьектом добавлял, потому что так расширять удобнее
как раз в первом варианте это не важно, потому что при расширении просто добавляешь аргументов а вот во втором случае, если вложенные селекторы требуют разных пропов, то им придется пропускать аргументы, и тогда лучше объектом
Китикет
как раз в первом варианте это не важно, потому что при расширении просто добавляешь аргументов а вот во втором случае, если вложенные селекторы требуют разных пропов, то им придется пропускать аргументы, и тогда лучше объектом
Меня вот что смущает, при изменении пропсов, старый пропс застрянет в колбеке, который был передан в useSelector В отличие от mapStateToProps, где селектор можно вызывать каждый раз с актуальными пропсами
Oleg
useSelector(createCurriedSelector(myProp)) или useSelector((state) => mySelector(state, { myProp })
Первый вариант называется карированием?
Roman
Меня вот что смущает, при изменении пропсов, старый пропс застрянет в колбеке, который был передан в useSelector В отличие от mapStateToProps, где селектор можно вызывать каждый раз с актуальными пропсами
тут ещё вот какое дело, если у тебя селектор вызывается несколько раз на странице с разным пропом (например список одинаковых компонентов с разным id) то в варианте 2 попадет кеширование реселекта, потому что он сравнивает только с предыдущим значением и придется либо использовать re-reselect, либо опять-таки оборачивать в фабрику по созданию селектора чтоб каждый компонент получил свой селектор а в таком случае уже легче каррировать сразу
Китикет
Почему просто не взять из селектора всё, что нужно и вычислить данные на основе пропсов непосредственно в компоненте?
Ну я в принципе так и делаю, либо получаю нужный айтем на уровне где они маппятся
Oleg
Более чисто и наглядно же.
Roman
Почему просто не взять из селектора всё, что нужно и вычислить данные на основе пропсов непосредственно в компоненте?
потому что проп может участвовать не в "финальном выборе", а быть в самой середине бизнес-логики
Китикет
Но я сейчас немного запутался во всей этой мишуре с пропсами и селекторами, а возможности пощупать нет, потому что нормальных сендбоксов с useSelector нету, а проект я сейчас не могу новый создать
Roman
А в чём там можно запутаться? Пропсы прилетают от родителя, а useSelector берёт данные из стора.
Китикет
А в чём там можно запутаться? Пропсы прилетают от родителя, а useSelector берёт данные из стора.
Пропсы можно достать из функции вроде (state, props) => something, но когда создаешь через createSelector в последней функции они доступны не будут и нужно делать костыль в виде функции вроде (_, props) => props.something В этом и путаница
invasion
Может кто-то в двух словах объяснить в чем разница между Component и PureComponent?
Чистая функция не должна иметь сайд эффекты. Она предсказуема, получает данные и их же отдает (но в реакте, это jsx), но модифицирует их по правилам иммутабельности.
Eugene
В reselect нет ownProps?🤔
Dmitriy
да
Нет)
Китикет
А в чём там можно запутаться? Пропсы прилетают от родителя, а useSelector берёт данные из стора.
Проблема не в useSelector Но с ним, как я уже говорил, другая штука, там функция зажевывает аргумент в замыкание и когда пропс изменится, useSelector об этом не узнает
Roman
Не верю. Пример.
я сейчас с телефона не могу вспомнить, но точно есть. хочется чтоб в компоненте вообще логики не было - все в селектор к тому же если возвращать из селектора объект, из которого потом доставать по пропу, то придется передавать в селектор функцию shallow equal, потому что по дефолту useSelector сравнивает по референсу, и будуь ререндеры лишние
invasion
Также если она получает, data1 и начинает её изменять без иммутабельности, то отдаст result2, поэтому мы должны копировать дату. Хз, я так понимаю чистые функций. Может я не прав. Поправьте.
Китикет
Мне кажется что можно без него обойтись, но мб я просто не очень понял что ты имеешь в виду)
Китикет
Вот мне дико пощупать хочется все эти варианты, чтобы четко обозначить все проблемы, но щас реально занят и не могу песочницу зафигачить) Мб попозже
Roman
Можешь пример краткий набросать где придется shallowEqual подрубить?
const mySelector = (state) => ({not: ‘a’, primitive: ‘value’}) Когда useSelector получает ответ от селектора, он сравнивает через === (чтобы решить, делать ререндер или нет), а объект будет каждый раз новый
Roman
Так надо просто createSelector заюзать мб?
на играет роли, все равно будет возвращаться новый объект
Китикет
А state всегда новый
А есть кейсы когда нужно от всего стейта возвращать обьект?
Roman
Так надо просто createSelector заюзать мб?
а нет, ты прав, поможет https://react-redux.js.org/next/api/hooks#equality-comparisons-and-updates
Китикет
Решение проблемы const everything = state => state.someStoreSegment const valueA = state => everything(state).valueA const valueB = state => everything(state).valueB const values = createSelector( valueA, valueB, (valueA, valueB) => ({ valueA, valueB }) )
Китикет
Roman
Решение проблемы const everything = state => state.someStoreSegment const valueA = state => everything(state).valueA const valueB = state => everything(state).valueB const values = createSelector( valueA, valueB, (valueA, valueB) => ({ valueA, valueB }) )
осталось только заставить всех так писать... а что если у тебя элементарный селектор, напрямую из state - его придется оборачивать в createSelector все равно
Китикет
осталось только заставить всех так писать... а что если у тебя элементарный селектор, напрямую из state - его придется оборачивать в createSelector все равно
Почему? Если ты достаешь обьект из стора (не изменяя этот обьект никак, то есть не создавая новый) - можно брать без createSelector, и будет возвращаться тот же обьект
Китикет
Я свойства 1 уровня вложенности вот так достаю всегда: const valueA = state => everything(state).valueA Потому что составной селектор тут не нужен
Roman
а ладно точно тоже каждый раз путаюсь