Ответы пользователя по тегу React
  • Как скрыть элемент страницы с помощью tampermonkey (userscript) в iframe, содержимое которого сделано через react?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Проще всего это делается через css селектор атрибутов вида [class^="chat__root__"] . Заметьте я использовал не полное имя класса, а только начало и модификатор ^= указывающий сверять только начало(если класс не первый, то можно использовать *=). Почему? Потому что "непонятные буковки" в конце - это генерируемый при сборке хэш, который поменяется при выпуске следующей версии фронта и если вы к нему привяжитесь - ваш скрипт очень скоро перестанет работать.

    Если фрейм с другого адреса, то надо создать этот userscript именно для этого адреса и уже применять там:
    // @run-at document-start
    
    function addCss(css, root = window) {
      const style = root.document.createElement('style');
      style.innerHTML = css;
      (root.document.head || root.document.documentElement).append(style);
      return style;
    } 
    
    const css = `
      [class^="chat__root__"] {
        dislpay: none !important;
      }
    `;
    
    addCss(css);

    Если с этого же, то придётся заморочиться:
    // @run-at document-start
    
    const css = `
      [class^="chat__root__"] {
        dislpay: none !important;
      }
    `;
    
    // отлавливаем загрузку фреймов
    new MutationObserver(() => {
      document.querySelectorAll('iframe:not([us-processed]').forEach((iframe) => {
        if (isAccessibleFrame(iframe)) {
          // добавляем наш css
          addCss(css, iframe.contentWindow);
          
          // на случай если содержимое фрейма перепишут позднее
          iframe.addEventListener('load', () => addCss(css, iframe.contentWindow));
        }
        // помечаем что обработали этот фрем, чтоб не повторять
        iframe.setAttribute('us-processed', true);
      });
    }).observe(document, {childList: true, subtree: true});
    
    // проверяем что содержимое фрейма доступно 
    function isAccessibleFrame(iframe) {
      try {
        iframe.contentWindow.test
        return true
      } catch (e) {
        return false
      }
    }
    Ответ написан
  • Как правильно настроить swiper в react?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Компонент Swiper не ждёт свойства spaceBetween. Вы уверены, что оно хоть что-то делает?

    Если это баг типизации Swiper и на самом деле он такое свойство ждёт, то вам следует репортить этот баг автору компонента (предварительно обновившись до последней версии).

    В крайнем случае можно прибегнуть к declaration merging, но это вредный костыль:
    declare module 'путь до типов компонента Swiper' {
      interface SwiperProps {
        spaceBetween: number;
      }
    }
    Ответ написан
    Комментировать
  • Как правильно использовать в ant design GRID?

    Aetae
    @Aetae
    Тлен
    Судя по документации как-то так:
    <Row justify="space-around">
      <Col flex="none">
        ...
      </Col>
      <Col flex="none">
        ...
      </Col>
    </Row>

    Или, чтоб наверняка:
    <Row>
      <Col span={12}>
        <Row justify="center">
          <Col flex="none">
          ...
          </Col>
        </Row>
      </Col>
      <Col span={12}>
        <Row justify="center">
          <Col flex="none">
          ...
          </Col>
        </Row>
      </Col>
    </Row>


    Но, ИМХО, проще забить на эту устаревшую и ненужную надстройку и написать стили ручками: проще и гибче будет.
    Ответ написан
    Комментировать
  • Проблема с React children?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Делая так:
    const ThemeProvider: FC = ...;
    Ты говоришь ts, что у тебя ThemeProvider имеет тип FC, и пофиг что ты там дальше пишешь. Тип FC по умолчанию не имеет children.

    Пиши либо так:
    const ThemeProvider: FC<{children: ...}> = ...;

    Либо так:
    const ThemeProvider = ({ children }: ...) => ...;
    * Кстати обрати внимание на деструктуризацию, в react component всегда приходят props, children это поле props, а не верхний аргумент.

    Либо так:
    const ThemeProvider: FC<PropsWithChildren> = ...
    * PropsWithChildren - тип помощник, добавляющий children к объекту, например
    PropsWithChildren<{
     prop2: string; 
     prop3: number
    }>
    но без дженерика просто отдаёт тип вида
    {
        children?: ReactNode | undefined;
    }
    Ответ написан
  • Как удалить теги style?

    Aetae
    @Aetae
    Тлен
    Почему ты не можешь повлиять на бэкэнд? Парсишь небось?
    Причём тут реакт? Реакт рисует элементы и стили на лету, а не получает их с бэкэннда.

    Если таки с бэка приходит html строка, которая потом вставляется через dangerouslySetInnerHTML то предварительно её почистить можно так:
    function removeStyles(html) {
      const container = document.createElement('div');
      container.innerHTML = html;
      container.querySelectorAll('style').forEach(
        style => style.remove()
      );
      return container.innerHTML;
    }


    Если ты пуляешь напрямую чужой реакт код, то тут два варианта:
    1. Делать как указал Даниил , только при этом ещё и динамически, дожидаясь пока реакт их нарисует, для чего придётся использовать MutationObserver или банальный setTimeout. Однако в таком случае стили могут успеть отрисоваться до удаления, из-за чего может происходить мерцание.
    2. Лезть глубже в исходники и патчить: подменять react функции работы со стилями, или даже тупо document.createElement, отфильтровая ненужный style. Но всё это уже требует понимания.:)
    Ответ написан
    Комментировать
  • Как исправить ошибку Module not found с версией react-scripts 5?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    compilerOptions.path влияет только собсно на "красные подчёркивания", tsconfig никак не управляет настоящими путями.
    Тебе надо руками прописывать alias в конфиге webpack.
    Ответ написан
    6 комментариев
  • Почему файл недоступен после сборки next js?

    Aetae
    @Aetae
    Тлен
    Я с next не работаю, но вы же сами описали проблему, что у вас _next там где должен быть build. Возможно одна из переменных окружения у вас кривая, или .env файл. Если сходу не находится откуда взялся _next - можно минимально оформатировать в ide уже собранные файлы и поискать в них это _next, окружающий код скорее всего о чём-нить скажет вам.
    В общем обычный процесс дебага...

    А вообще вот что гугл выдаёт первой ссылкой по "next js _next".
    Т.е. путь /_next/static/chunks/ - это путь по умолчанию, если нужен иной - следует задать assetPrefix.
    Почему раньше работало? А хз, может оно и так лежало в папке _next, а вы её переименовали?
    Ответ написан
    Комментировать
  • Почему не могу импортировать docx файл в реакте typescript?

    Aetae
    @Aetae
    Тлен
    Во первых где ты хочешь его импортировать? В коде или в рантайме?
    Если в коде, то чтобы что-то импортировать твой сборщик должен уметь это импортировать, и, т.к. docx явно не входит в стандартный набор форматов для front-end тебе потребуется установить и настроить специальный loader\плагин\asset в зависимости от системы сборки.
    Возможно тебе на самом деле не надо импортировать этот файл(ты с ним нечего не делаешь), а надо просто дать пользователю его скачать? Тогда просто положи его в публичную папку и используй обычную ссылку.

    Если в рантайме, а на этапе сборки его ещё нет - импорт так не работает. Используй обычный fetch.

    Если ответ не помог - потребуется больше информации: какую систему сборки используешь, кусок кода где ты пытаешься работать с файлом и т.д.
    Ответ написан
    Комментировать
  • Нужно ли устанавливать на ПК node.js для разработки приложений на React и React Native?

    Aetae
    @Aetae
    Тлен
    React Native - нет, он без сборки не заведётся.
    React - да, но придётся выкинуть 90% уроков из сети на помойку, так как писать придётся не на jsx, а на прямом использовании api, т.е. React.cteateElement(Component, ...) вместо <Component ...>. Про 60% библиотек и вспомогательных утилит тоже можно будет забыть, с ещё 20% придётся хорошенько повозиться чтоб запустить.

    В целом же заниматься фронтом без ноды и обвеса в наше время - для сильных духом.:)
    Ответ написан
    Комментировать
  • Почему возникает такая ошибка NEXT JS 13?

    Aetae
    @Aetae
    Тлен
    Как ты используешь этот RegisterService?
    Чтоб он работал, как и написано в ошибке, он должен быть компонентом.
    Т.е. <RegisterService ...> или React.createElement(RegisterService, ...) .

    Второй вариант: он может быть не компонентом, а хуком. Тогда он должен вызываться внутри другого компонента, а также иметь префикс use - useRegisterService(отсутствие префикса не приведёт к ошибке, но это стандарт).

    Если ты просто вызываешь его где-то вне компонента как функцию - ничего работать не будет.
    Ответ написан
  • Как правильно использовать динамический импорт?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Приложение собирается сборщиком. Все импорты обрабатываются на стадии сборки, и на стадии сборки же включаются в бандл(основной js файл).
    Если вы указываете переменную в пути - это значит только то, что в бандл будут включены ВСЕ файлы находящиеся по такому пути.
    Никакие новые файлы(отсутствующие при сборке) уже собранное приложение грузить через import не будет.

    Нужна загрузка новых файлов по url? Придётся делать всё руками по-старинке.

    Нужна загрузка таки уже имеющихся? Уточняйте путь до минимального:
    import(`../Screen/About/${currentScreen.name}.jsx`);
    И помните, что в бандле будет ВСЁ по маске `../Screen/About/*.jsx`.
    Хоть какое-то уточнение стартового пути необходимо, потому что иначе сборщик бы собрал в бандл вообще все файлы на вашем компьютере, что, думаю, не желаемое поведение.

    Возможно что-то поменялось для сборки через vite(т.к. он пользуется модулями), но тут не подскажу.
    Ответ написан
    Комментировать
  • Как получить момент когда весь контент страницы по-настоящему загружен в React?

    Aetae
    @Aetae
    Тлен
    Почему такое происходит?
    Событие load отрабатывает когда всё что уже было на странице загружено.
    Проблема в том, что react-компоненты появляются динамически с помощью js, что выкидывает их из стандартной системы.

    Что делать?
    Вопрос не простой, ты никак не можешь отследить загрузку bg картинок напрямую.
    Способ который будет работать гарантировано, но костыльный и напряжный: взять все нужные картинки и загрузить их в фоне руками через new Image, когда они все будут загружены - можно отобразить.
    Иные варианты? Х.з.)
    Ответ написан
    2 комментария
  • Как типизировать функцию в vitest, что бы можно было вызвать у нее метод mockReturnValue?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    const useScreenResolution: Mock & ((<args type>) => <return type>) = (...) => {...}
    ?
    Ответ написан
  • Failed to execute 'observe' on 'IntersectionObserver': parameter 1 is not of type 'Element'?

    Aetae
    @Aetae
    Тлен
    observe.current.observe(lastElement.current);

    lastElement - не элемент, а реф на элемент, о чем тебе ошибка и пишет.
    Ответ написан
    Комментировать
  • На сколько важна длина атрибута key в компонентах?

    Aetae
    @Aetae
    Тлен
    Нет.
    Ответ написан
    Комментировать
  • Как вставлять текст со специальными символами?

    Aetae
    @Aetae
    Тлен
    dangerouslySetInnerHTML
    Как следует из названия - стоит дважды подумать, прежде чем использовать в продуктивном коде.
    Ответ написан
    Комментировать
  • Как исправить ошибку "Property *** does not exists on type ''IntrinsicAttributes" в React+TypeScript?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Тебе английским по белому написано: "Property todos does not exists", что тут непонятно?

    Твой компонент TodoList не ожидает пропа todos.
    Ответ написан
    Комментировать
  • Почему не работает локальная библеотека на сборке Vite?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    declare module "custom-editor"
    import Editor from 'custom-editor-lib/dist/index'

    Не замечаешь разницы?
    Ответ написан
    Комментировать
  • Как исправить ошибку сборки?

    Aetae
    @Aetae
    Тлен
    Вангую используется ?., а у пользователя старый фокс.
    Решение - настроить browserslist в своей сборке по ожидаемой клиентуре. Если нужна поддержка - добавить >N вместо last 1 который там наверняка по дефалту.
    Ответ написан
    Комментировать
  • Как импортировать переменные в react?

    Aetae
    @Aetae
    Тлен
    Ну в принципе можно как с любыми переменными - вынести за компонент, и даже будет работать, но так делать не надо.)

    Нормальное решение - использовать context всесто ref. Сверху где-то его Provider зафигачить, а где надо useContext.
    Ответ написан
    Комментировать