Задать вопрос
Ответы пользователя по тегу React
  • Как правильно разделить блок на компоненты?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега React
    Иначе смысл от этих компонентов если можно их добавить после новой идеи.
    Сначала нужно сделать просто и понятно. Потом, при необходимости, уже усложнять. Заранее усложнять себе жизнь совершенно ни к чему.

    Есть две основные причины выделения компонента: возможность переиспользования и скрытие сложности. В данном случае сложности никакой нет, поэтому не будем брать её в расчёт.
    Давайте посмотрим на предложенную вами структуру с точки зрения переиспользования. У вас название компонента жёстко привязано к его содержимому, следовательно, переиспользовать его можно будет только если у вас в каком-то другом месте будет ровно такой же блок. То есть переиспользуемость невелика.

    А вот если мы скажем, что это компонент SettingsControl, например, у которого есть title и children (а в них может быть что угодно), то сможем переиспользовать блок для всех остальных настроек. Но, может, этот дизайн используется не только в настройках, а вообще по всему проекту - тогда разделение и именование будет уже другим.
    Сам контрол тоже можно обобщить до RadioInputWithImages - тогда, если у вас в каком-то другом месте будет похожий контрол выбора котят, а не темы приложения, вы просто поменяете контент, а логика и вёрстка будут переиспользованы.

    В целом, предметно обсуждать деление на компоненты по огрызку одного макета невозможно - это холистический процесс.
    Ответ написан
  • Как получить все id элементов после рендеринга DOM?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега React
    У вас именно Реакт?
    Если так, то обычно эти компоненты (и эти якорные ссылки в них) рендерятся из каких-то данных (state), а это значит, что id всех секций у вас уже есть.
    Если вы рендерите как-то не так, то вы странно тогда используете Реакт. Должно быть проще доработать, чем пытаться лезть на низкий уровень и пытаться вытащить что-то из готовых компонентов.

    P.S. вижу, что в предыдущем вопросе у вас то же самое. Может, вам просто тогда на ванильный JS переписать? И понятнее будет для вас, и клиентам меньше грузить. Вдобавок, можно прямо на сервере рендерить 99% разметки и нормально индексировать сайт. Вряд ли у вас там какие-то сложные интерфейсы, которые реально требуют Реакта.
    Ответ написан
    Комментировать
  • Почему появляется ошибка "Received `false` for a non-boolean attribute"?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега React
    Имя кастомного класса должно начинаться с доллара: $collapsed.
    Ответ написан
    Комментировать
  • Как записывать такие данные в интерфейс с помощью RTK QUERY?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега React
    oldPrice: dto.oldPrice
    Укажите тут (и везде) правильно название поля в dto, в чём проблема-то?
    То, что вы создали какой-то интерфейс ProductCardDTO, вовсе не означает, что RTK магически вам все поля, полученные в ответ на запрос, переименует. Если сервер отдаёт old_price, то так и должно поле в интерфейсе называться. Интерфейс подстраивается под реальность, а не наоборот.
    Ответ написан
  • Что выбрать RTK Query, Thunk или Saga?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега React
    Все они не дружат с серверным рендерингом, поэтому лучше использовать TanStack Query.
    Ответ написан
    4 комментария
  • Анимация бесконечного slider next js, как работать с классами в массиве объектов?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега React
    Основной проблемой я тут вижу то, что вы в state храните компоненты. Так не делать не надо, в state нужно хранить данные, а из них уже рендерить нужное. Тогда вы и классы сможете гибко добавлять какие надо и что угодно.

    Так же есть вопрос по key, сыпет в консоль предупреждение, что кей не уникален в самом последнем return. Во-первых, я не пойму зачем там key, во-вторых, я не пойму как это пофиксить.
    Вы рендерите элементы массива (pages), и, чтобы отличать их друг от друга, Реакту нужен какой-то идентификатор (подробнее в документации). У вас он как бы есть, но, во-первых, как сказано выше, его ломает то, что вы храните в state уже отрендеренные компоненты, а во-вторых, вы в качестве ключа для всех элементов используете одно и то же значение (cardDetails.id), а оно должно быть уникальным.

    как выключить двойной вызов setTimeout в dev mode
    Не надо его выключать, надо корректно чистить таймауты, для отлова таких проблем двойной вызов и делают.

    Видимо, вы запутались и вам кажется, что вы изучаете Next.js, а на самом деле вы изучаете React (от Next в вашем коде нет абсолютно ничего) и вам явно нужно вернуться к документации и прочитать её от начала и до конца, там есть и ответы на ваши вопросы и примеры.
    Ответ написан
    Комментировать
  • Как решить проблему одинаковых ключей?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега React
    Проблема решается указанием ключа для самого баннера. Тогда при смене слайда старый будет просто выкидываться и не будет ничего ломать:
    <BannerContent key={currentSlide} currentSlide={currentSlide} />


    А у <motion.x /> ключи можно вообще убрать, без них песочница не ломается.
    Ответ написан
  • Ререндеринг при использовании setError?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    Скорее всего, ваша проблема находится здесь:
    if (files[0].size > 150) {
        setError('file', { type: 'custom', message: 'Недопустимый размер' });
    }
    ...
    setStep(2)

    Вы идёте на следующий шаг даже при наличии ошибки валидации, вот у вас всё и перерендеривается.
    Ответ написан
  • Как в зависимость useMemo добавить условие?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега React
    const state = useMemo(() => {
        return Math.floor(Math.random() * 100)
    }, [value === 0 ? 0 : 1])

    Но в данном случае будет всё равно два варианта: ноль и не-ноль.

    Вы, очевидно, неправильно используете useMemo, но что нужно использовать вместо него по такому описанию задачи сказать нельзя.
    Ответ написан
    7 комментариев
  • Почему не происходит перерисовка при изменении объекта?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега React
    Отвечу на вопрос почему.
    Причины две:
    1. При старте вы сохраняете копию массива в локальный стейт и дальше работаете с ней.
    2. Даже если бы вы этого не делали, а итерировали по оригинальному массиву, всё равно бы не работало как вы ожидаете, потому что вы мутируете внутреннее состояние объекта, а Реакт в него не смотрит и запускает перерегдер только тогда, когда меняется ссылка на сам объект.
    Ответ написан
    Комментировать
  • Как верно покрыть тестами хук реактовский?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега React
    - expect(result.current).toBe(5);
    + expect(result.current.current).toBe(5);

    Функция renderHook возвращает объект, в котором в свойстве result содержится объект, в котором в свойстве current хранится результат вызова хука. Результат вызова вашего хука - ref, который тоже является объектом со свойством current, содержащим id интервала.

    Вроде, сообщение об ошибке максимально понятное ¯\_(ツ)_/¯
    Ответ написан
    Комментировать
  • Как вывести компонент React несколько раз учитывая количество count в объекте?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега React
    return new Array(ingredient.count).fill(null).map((_, index) => <Meat key={index} />);

    Создаём массив нужной длины, заполням его чем угодно (это обязательно, иначе работать не будет) и итерируем по нему как обычно в Реакте.
    Как правило индекс массива лучше не использовать в качестве ключа, но поскольку здесь компоненты взаимозаменяемые (раз не принимают пропсы), то от индекса вреда не будет.
    Ответ написан
    2 комментария
  • Как получить параметры в Resource Route в Remix?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега React
    Никакого бреда, всё чётко и понятно, да ещё и с примером:
    Route params are defined by route file names. If a segment begins with $ like $invoiceId, the value from the URL for that segment will be passed to your loader.
    https://remix.run/docs/en/main/route/loader#params
    Ответ написан
    Комментировать
  • Почему не обновляется значение в useState?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега React
    onChange={(_, checked) => {}}
    С чего вы взяли, что функция в onChange принимает второй аргумент?

    setChecked(checked);
    Это асинхронное действие, оно не блокирует поток исполнения до тех пор, пока значение в state изменится.

    handleClearField();
    Следовательно, при вызове этой функции вы работаете ещё с текущим значением, а не с новым.

    Один из возможных вариантов решения:
    const [checked, setChecked] = useState(false);
    
    const handleClearField = (checked) => {
        setChecked(checked);
    
        if (checked) {
            console.log('1');
        } else {
            console.log('2');
        }
    };
    
    return (
      <>
        <FormControlLabel
           control={
              <Checkbox
                  checked={checked}
                  onChange={(event) => handleClearField(event.target.checked)}
               />
           }
            label="Тест"
         />
      </>
    );
    Ответ написан
  • В чем заключается суть оптимизации скорости обновления компонентов через useReducer?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега React
    Почему мои поиски в попытках найти логику хука провалились
    Кто ж вас знает ¯\_(ツ)_/¯

    как выйти на след
    Я поиском по репе на Гитхабе воспользовался: https://github.com/facebook/react/blob/6f18664b82b...
    Ответ написан
    2 комментария
  • Почему не обновляется состояние?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега React
    Не нужно сохранять результат items.filter() в state, туда нужно класть только поисковую фразу, а фильтровать просто при рендере налету перед .map().
    Ответ написан
    Комментировать
  • Как в next js добавить класс к элементу?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега React
    Примерно так:
    {navLinks.map((link) => (
        <Icon href={link.href} key={link.svgIcon} title={link.svgIcon} className={isCurrent ? `active` : undefined} />
    ))}
    
    ...
    import classNames, { type Argument } from "classnames";
    
    type Props = {
        title: string;
        href: string;
        className: Argument;
    }
    
    <Link href={props.href} className={classNames('svgh m-auto', props.className)>
        <SvgMail width="30" height="30" viewBox="0 0 50 50" />
    </Link>
    https://www.npmjs.com/package/classnames
    Ответ написан
    1 комментарий
  • React не подгружаются картинки?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега React
    - img: {img1},
    + img: img1,
    Запись img: {img1}, равна img: { img1: '... image content ...' }.

    P.S. Ну и:
    <div className='region__top__cards'>
      {product.map((product) => (
        <Cards key={product.title} title={product.title} img={product.img} price={product.price} oldprice={product.oldPrice} rate={product.rate}/>
      )}
    </div>
    Ответ написан
    1 комментарий
  • Почему требует еще ключей?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега React
    Ключ должен быть у самого верхнего элемента внутри цикла. В вашем случае это fragment:
    <React.Fragment key={category}>
     <h2>...</h2>
     <ul>...</ul>
    </React.Fragment>
    Ответ написан
    1 комментарий
  • Как исправить проблему с асинхроностью?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    Ошибка первая: вы в sliceHandler передаёте div-обёртку, а внутри функции думаете, что это какой-то его ребёнок.
    Ошибка вторая: вы пытаетесь получить реактовское служебное свойство key через атрибут html-тега. Значение key даже через props нельзя получить, не говоря уже про html.

    Давайте вы своими словами опишете, чего хотите добиться и зачем, а мы вам подскажем, как это сделать правильно.
    Ответ написан
    2 комментария