Как стать автором
Обновить

Комментарии 5

Не хочется нахватать минусов, но просто не могу сдержаться.

Зачем? Зачем вы едите этот кактус? Как этот ворох костылей мог стать мейнстримом?

Мне повезло, я столкнулся с проблемой переопределения колбеков в самом начале знакомства с React. Больше всего меня поразило, что эта проблема никого особо не волнует. Ок, разработчики Реакта наконец выдали какое-то решение. Но ведь это же редкое уродство. Во второй аргумент useCallback ещё нужно добавить какой-нибудь идентификатор, чтобы мемоизировать несколько разных колбеков. Мемоизатор скорее всего будет жрать память. Всё это громоздко и неудобно.

Конечно, кроме мемоизации другого решения и не найти, если колбек передаётся в цикле. Почему не признать, что подходы Реакта тупиковые? Нет, продолжают костылять: «In the future, a sufficiently advanced compiler could create this array automatically.» А может пора отбросить попытки эмулировать декларативность императивщиной и использовать нормальный DSL?
In the future, a sufficiently advanced compiler could create this array automatically

Никакого future ждать не нужно, кстати. Всё уже работает и работает хорошо.


Во второй аргумент useCallback ещё нужно добавить какой-нибудь идентификатор, чтобы мемоизировать несколько разных колбеков

Идентификатор? Зачем? Несколько колбеков в одном? Непонятна ваша мысль. По сути туда передаются все задействованные переменные. Хорошо когда в автоматическом режиме. А внутри shallowComparison.

Что если в одной рендер-функции определяются несколько разных колбеков. Переданные массивы могут совпасть и последствия будут ужасны.) Или я чего-то не понимаю?

Кто-то из нас точно что-то недопонимает. Никакой проблемы тут нет. Хоть 200 callback-ов. Они же вообще никак не связаны между собой.


По сути тут 2 больших ограничения:


  • все хуки должны вызываться всегда ровно в одном и том же порядке, их количество должно быть неизменным в течении всего времени жизни компонента. Т.е. условие внутри хука поставить можно, а хук внутри условия нельзя. Если есть цикл и в цикле хуки, то кол-во итераций в цикле обязательно должно быть статичным. Это ограничение самой платформы хуков. Сделано так, чтобы ими было проще пользоваться. В противном случае каждому хуку пришлось бы присваивать какой-нибудь ID и сопоставлять уже так. Но React-team решили так не делать.
  • если мы хотим чтобы callback был эффективным для Memo|PureComponent, нам нужно чтобы пока данные, от которых он зависит, те же самые, метод тоже был тем же самым (===). Для этого тот второй массив и нужен (и ни для чего более). Т.е. там должны быть перечислены именно те вещи, при изменении которых, React должен будет вернуть не закешированный ранее callback, а этот новый.

Я согласен что это всё выглядит очень странно и может быть даже нелепо. Ну вот такой вот "новый" путь )

Большое спасибо за подробное разъяснение. Я предполагал, что хуки могут запоминать порядок вызова, но решил, что это и правда слишком нелепо.) Выходит, что решения для передачи колбека в цикле по-прежнему нет. На проблему просто забивают. Ждите пока начнутся тормоза, а потом делайте уродливый компонент-прослойку, передающий в колбек дополнительный параметр. Т.е. самый простой код уже по умолчанию имеет потенциальные проблемы с производительностью. Мир сошёл с ума.
Зарегистрируйтесь на Хабре , чтобы оставить комментарий