• Почему очищается поле ввода текста?

    @twolegs
    const onDrop = useCallback(async (acceptedFiles) => {
        const newImage = acceptedFiles[0];
        let hasError;
    
        if (newImage.size > allowedMaximumFileSize) {
          hasError = true;
    
          alert("Размер файла не допустим");
        }
    
        if (!allowedMimeTypes.includes(newImage.type)) {
          hasError = true;
    
          alert("Тип файла не допустим");
        }
    
        if (!hasError) {
          const previewBASE64 = await fileReader(newImage);
    
          onImageChange(name, { file: newImage, preview: previewBASE64 });
        }
      }, []);


    Вот тут у вас в массиве зависимостей нет onImageChange. Соответственно, всегда выполняется onImageChange с изначальным значением (то есть пустыми полями).

    P.S. Если добавить в зависимости onImageChange, то мемоизация будет бесполезна, потому выше вы создаете эту функцию каждый рендер.
    Ответ написан
    3 комментария
  • Почему все кабели на 60 гц?

    @twolegs
    Для 144Hz@1080p должно быть достаточно кабеля HDMI 1.4. Для разрешений выше нужен HDMI 2.0+ или DisplayPort 1.2+
    Ответ написан
    Комментировать
  • Зачем указывать url-loader лимит?

    @twolegs
    base64 контент будет загружаться вместе с вашими скриптами, а файлы по необходимости.
    По сути, url-loader нужен для сокращения времени загрузки мелких файлов, но если заинлайненного в url() контента будет слишком много, ваш бандл станет слишком тяжелым.
    Ответ написан
    Комментировать
  • Как добавить класс к корню компонента?

    @twolegs
    Необходимо прокидывать названия класса пропсом и уже в самом компоненте делать так, что бы этот пропс добавлялся в класс?

    Именно так.
    Ответ написан
    Комментировать
  • Как подключить header.html?

    @twolegs
    {
        test: /\.html$/,
        use: [{ loader: 'html-loader', options: { interpolate: true } }],
      },

    И в шаблоне:
    <body>
      ...
      ${require('./../includes/header.html')}
      ...
    </body>
    Ответ написан
  • Как собрать react приложение для ios?

    @twolegs
    Можно попробовать с Cordova, либо распространять приложение как PWA.
    Ответ написан
    Комментировать
  • Как обернуть компонент в HOC при помощи compose?

    @twolegs
    HOC должен возвращать компонент, а не элемент для рендера.
    В вашем случае будет как-то так:
    const withTheme = Component => ({ userPalette, ...props }) => (
      <ThemeProvider theme={defaultMaterialTheme(userPalette)}>
        <Component {...props} />
      </ThemeProvider>
    );
    
    export default compose(
      hot,
      connect(mapStateToProps),
      withTheme,
    )(Routes);
    Ответ написан
    Комментировать
  • Как правильно возвращать получившийся state в редьюсере?

    @twolegs
    Редьюсер должен быть чистой функцией, то есть не содержать в себе сайд-эффектов. В нем не должно быть ничего асинхронного. Для асинхронных операций в redux есть middleware, например redux-thunk.
    Ответ написан
    3 комментария
  • Как организовать сложные вычисления в NodeJS?

    @twolegs
    SSR не такая уж сложная задача. Если он выполняется очень долго - тут уже вопросы к оптимизации вашего приложения.
    Вообще, в первую очередь вам нужно ответить на два вопроса:
    1. На какую нагрузку вы рассчитываете? Сколько rps ожидается?
    2. Проводили ли вы уже какое-то нагрузочное тестирование? Вы уверены, что сейчас вам не хватит одного инстанса ноды?
    Если количество запросов велико и один инстанс не справляется - я бы использовал поднял пару инстансов ноды с помощью, например, pm2, который выступит в роли балансировщика.
    Вообще, в случае веб разработки на node, не так часто в основном потоке выполняются какие-то действительно сложные вычисления, наибольшие задержки приходятся на IO/операции с БД и другие асинхронные штуки. Остальные ваши сложные вычисления действительно сильно забивают основной поток? В этом случае да, лучше использовать workers, они в отдельном потоке запускаются.
    Ответ написан
    2 комментария
  • Применимо ли к React структура приложений из JS?

    @twolegs
    React - это только View-слой приложения, поэтому остальную логику вы можете организовать так, как вам хочется. То, что react+redux - это самый популярный стек, не означает, что это единственно правильная архитектура.
    Вполне можно реализовать классическое MVC-приложение с использованием React на фронтенде. Но тут, опять же, следует исходить из самого приложения. Если оно достаточно простое, лишние абстракции могут быть ни к чему.
    Ответ написан
    Комментировать
  • Рекурсия внутри цикла в js, ЧТО здесь вообще происходит?

    @twolegs
    Расставил отступы, чтобы было видно что на каком уровне вложенности выполняется.
    start 3
        start 2
            start 1
                start 0
            end
            start 0
        end
        start 1
            start 0
        end
    end
    start 2
        start 1
            start 0
        end
        start 0
    end


    Возможные причины выноса мозга:
    1. end не выводится после 0. Т.е. вероятно, вы для себя неправильно расставили все соответствия при выводе.
    2. Цикл всегда ограничен двумя итерациями.
    Ответ написан
    Комментировать
  • Как правильно отправить асинхронный запрос в useEffect?

    @twolegs
    В вашем случае нужно избежать апдейта стейта если компонент был размонтирован. Самое верное, на мой взгляд, решение - это отмена запроса при размонтировании. Пример с fetch, т.к. не знаю, есть ли возможность отменить запрос в axios.
    useEffect(() => {
        const abortController = new AbortController();
        const fetchData = async () => {
          await fetch(url, { abortController }).then((data: any) => {
            setImg(data);
            setPreloader(!preloader);
          });
        };
        fetchData();
    
        return () => {
          abortController.abort(); 
        }
      }, [url]);


    Если рассмотреть пример выше, теоретически должно сработать такое:
    useEffect(() => {
      let isMounted = true; 
      const fetchData = async () => {
       ...
        if (isMounted) {
          setImg(data);
          setPreloader(!preloader);
        }
       ...
      }
      ...
      return () => { isMounted = false; };
    }, [])
    Ответ написан
    Комментировать
  • Как импортировать правильно запрос graphql на node js?

    @twolegs
    Для gql можно не тащить весь Apollo, достаточно подключить пакет graphql-tag.
    Чтобы привести это все к строке можно сделать так:
    import { print } from 'graphql/language/printer'
    
    console.log(print(query))
    Ответ написан
    Комментировать
  • Как обновить react компонент после изменения в объекте?

    @twolegs
    Во-первых, у вас каждый рендер будет создаваться новый экземпляр объекта FactorModel(). Т.е. каждую итерацию рендера у вас заново инициализированный объект.
    Чтобы этого избежать, надо либо мемоизировать этот инстанс (хук useMemo), либо инстанцировать объект вне компонента (если это возможно).
    Во-вторых, эффект также вызывается каждый рендер, и на событие каждый раз подписывается новая функция (память течет). Чтобы этого избежать, нужно указать второй параметр в useEffect: useEffect(..., []) - такой эффект выполнится только при монтировании компонента.
    Ответ написан
    Комментировать
  • Какой тип нужно выбрать?

    @twolegs
    Использовать generic для MouseEventHandler:
    deleteItem: React.MouseEventHandler<T>
    Где T - нужный вам тип, включающий dataset
    Ответ написан
  • Как оптимальнее сделать сетку на svg?

    @twolegs
    Все зависит от задачи, которую решаете. Думаю, правильнее всего будет реализовать варианты и провести их тест, сравнив производительность в ваших задачах.
    Как 5-й вариант могу предложить fill паттерном: tutorials.jenkov.com/svg/fill-patterns.html
    Ответ написан
    1 комментарий
  • Как красиво обойти AST и получить нужные данные?

    @twolegs
    Если вас смущает только количество кода, то это решается банальным форматированием.
    Например, если использовать одну вспомогательную переменную, то код уже становится чище.
    walk(obj, () => {}, (obj) => {
      const nodeValue = obj.children[0].value;
      if (nodeValue.value == 'placeholder' || nodeValue.value == 'button') {
        arr.push({
          [nodeValue.value]: {
            index: nodeValue.loc.start.line,
            loc: obj.loc
          }
        });
      }

    Также часть кода можно обернуть в отдельные функции, тогда он станет компактнее.
    Большое количество одинаковых условий можно заменить на более простое
    ['placeholder', 'button', ...].includes(node.value);
    Ответ написан
    Комментировать
  • Почему сафари игнорирует этот код?

    @twolegs
    Рекомендую почитать про области видимости и всплытие переменных в js.
    Блоки if-else не ограничивают область видимости, соотвественно, второе определение фукнции внутри else всегда перекрывает первое. То есть какой бы ни был результат сравнения внутри if всегда будет выполняться второй вариант функции.
    Определите функцию один раз и перенесите условие внутрь функции. Все должно заработать.
    Ответ написан
  • Почему не инициализируется переменная JS?

    @twolegs
    Скорее всего скрипт выполняется до инициализации элементов на странице.
    Проверьте порядок элементов на странице, скрипт должен быть в конце.
    Ответ написан
    Комментировать