Решаем задачи React собеседования #1 Убрать лишние перерендеры

Поділитися
Вставка
  • Опубліковано 11 січ 2025

КОМЕНТАРІ • 49

  • @ножикМакс
    @ножикМакс Рік тому +11

    а зачем useCallback если инпут uncontroled?

  • @karis7539
    @karis7539 Рік тому +3

    можно ещё убрать перерендер кнопки, передавая в setNames функцию:
    setNames((prev) => [newName, ...prev])

  • @karis7539
    @karis7539 Рік тому +3

    рефы в коллбэки можно не передавать, они не реактивны и даже если реф поменяется - useEffect, useCallback и тп не смогут отреагировать

  • @voyvb
    @voyvb 5 місяців тому

    Спасибо, хорошо объясняешь.

  • @somebuddysomeone5787
    @somebuddysomeone5787 4 місяці тому +1

    Имхо, автор перемудрил.
    Перед тем как добавлять мемоизацию, можно попробовать вынести стейт из App в отдельный компонент, изолировать его. Если вынести интут и баттон в отдельный компонент со стейтом `name`, то инпут при введении текста не будет триггерить ре-рендер всего приложения - только при добавлении нового элемента в `names`, а ре-рендер при добавлении в `names` неизбежен, так как это основной стейт приложения, от которого все зависит. В этом сценарии memo для Button не нужен.
    Потом, добавлять List в memo не имеет смысла, так как при изменение `names`, он будет всегда перерендириваться. Хоть с мемо, хоть без.
    Таким образом, только обертка ListItem в мемо имеет смысл.

    • @ИванВалучев-э5р
      @ИванВалучев-э5р 10 днів тому

      а зачем ListItem оборачивать в memo, если у нас родительский List в твоем случае будет ререндерится только тогда, когда изменяется массив, и по сути и мемо тоже не нужен

  • @DreamTeam-yw6bg
    @DreamTeam-yw6bg 6 місяців тому

    Ну я бы инпут и кнопку в отдельный компонент бы вынес, коллбэк бы прокинул (используя useCallback и memo, хотя и то не принципиально было бы, выгоднее его перерисовать будет), useCallback через prev

  • @xxxxrat
    @xxxxrat 6 місяців тому +2

    Изменение пропсов не ведет к перерендерингу, проверьте это сами в песочнице (только стейт родителя не меняйте при этом).
    То есть перерендеринг возможен только при изменении стейта компонента или одного из его предков (изменение контекста тоже можно считать изменением стейта предка).

  • @groovyboytube
    @groovyboytube 11 місяців тому

    Хотелось бы ссылку на исходник или на codesandbox. И так и не ясно почему в итоге кнопка перерендерилась, выходит не до конца убраны перерендеры?

  • @catsouls5345
    @catsouls5345 5 місяців тому

    А нельзя просто name убрать из зависимостей?

  • @MikhailYan-b8y
    @MikhailYan-b8y Рік тому +2

    Плохая практика используется на строке 30 нельзя добавлять в начало массива элемент очень негативно будут смотреть если так оставить, нужно просто значение поменять местами и тогда сразу решится вопрос с пере рендером списка.

    • @svgaryaev
      @svgaryaev Рік тому

      а что тогда делать, если нужно добавлять элемент в начало списка, а не в конец?

    • @MikhailYan-b8y
      @MikhailYan-b8y Рік тому

      @@svgaryaev сказать что такая логика вносит не понимая для пользователей. Логично добавлять в конец. Ну и если ты хранишь на беке данные то тебе могут отдавать данные по дате создания и проблем не будет.

    • @svgaryaev
      @svgaryaev Рік тому

      @@MikhailYan-b8y ничего не логично, есть же оператор unshift, значит добавление элемента в начало списка одна из базовых задач, да, выполняется за O(n) вместо константы для добавления в конец, но та же сортировка по дате создания будет выполняться за O(nlogn), это тестовое задание, какие пользователи, какой бэк?)

    • @MikhailYan-b8y
      @MikhailYan-b8y Рік тому

      ​@@svgaryaevнадо слать такого заказчика который такую фигню хочет. Использование только push or concat, spread и только в конец массива. Есть такое слово оптимизации, если клиенту такое слово недоступно то нужно обходить его.

    • @svgaryaev
      @svgaryaev Рік тому

      @@MikhailYan-b8y удачи с поисками работы

  • @alexeyfilippov42
    @alexeyfilippov42 Рік тому

    вот жто хорошее видео. молодец

  • @НикВетров-г7ь
    @НикВетров-г7ь Рік тому

    А f (I) можно для реакт 🚀🧐или моей головой😅

  • @pvttrix
    @pvttrix Рік тому

    насколько в реальном продуктовом проекте нужно вот настолько забодиться о рендерах? Понятно, что если что-то стоит нам слишком "дорого" то да,, но перерендер кнопки - это проблема?

    • @vladcid3938
      @vladcid3938 Рік тому

      Да если у вас компоненты списка в которых вы меняете количество и начинается перерендер всех элементов с кнопкой.

    • @ножикМакс
      @ножикМакс Рік тому +1

      больше вреда. там где люди поопытней от этого ушли.

    • @ПользовательПользователь-с8к
      @ПользовательПользователь-с8к Рік тому +1

      Заботиться не надо до тех пор, пока не увидите просадку производительности. Даже если увидите, сначала надо искать первопричину, а потом уже оптимизировать

    • @GonzaVladimir
      @GonzaVladimir 10 місяців тому

      На 100%. Если используешь принцип solid и придерживаешься, 90% всей оптимизации уже решаться на месте. Остальные 10% решит fsd методология

    • @DreamTeam-yw6bg
      @DreamTeam-yw6bg 6 місяців тому

      дороже будет кнопку в memo обернуть, чем ее перерисовать. И да надо заботиться

  • @Todortodorov62
    @Todortodorov62 11 місяців тому

    а шо так тихо?)

  • @ГригорийСапожников-с1щ

    Изменение пропсов не вызывает ререндер

    • @kitsunaana9783
      @kitsunaana9783 9 місяців тому

      с каких это пор?

    • @true227
      @true227 8 місяців тому

      Ага, пропсы изменились у компонента, а он не перерендерился, что за бред?

    • @xxxxrat
      @xxxxrat 6 місяців тому +1

      Ребята базу не знают

    • @ПожилойБилибоба
      @ПожилойБилибоба 5 місяців тому +1

      ​@@true227пропсы меняются только если поменялся какой то родительский компонент, вот именно это и вызывает перерендер, а не сами пропсы

  • @asifabbasov3801
    @asifabbasov3801 Рік тому +2

    очень тихо

    • @BigXil
      @BigXil  Рік тому +1

      Заметил уже когда залил) Если буду делать ещё видосы - исправлю.

  • @EvgeniyFrontendDev
    @EvgeniyFrontendDev Рік тому

    про inputRef не додумался бы

  • @warcraft.mp4889
    @warcraft.mp4889 6 місяців тому +1

    Кринж