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

    @Viarll
    Случайный массив генерируется так часто из-за того, что генерация происходит каждый раз при обращении к ranomdArr, т.к. это функция, а не переменная/константна. Т.е. в функции score, которая вызывается как раз кликом:
    это происходит часто(8 генерация за клик)

    function score() {
      console.log(ranomdArr()); //<b>Генерация нового массива</b>
      let iter = '0';
      for(let i=0; i<refCopy.current.children.length; i++) {
        if(refCopy.current.children[i].innerText === ranomdArr()[i]) { //<b>Генерация нового массива в цикле</b>
          iter++;
        }
      }


    Первое же, что приходит в голову вынести переменную и отдельно функцию генерации ее значения из компоненты Block. Как быстрое решение можно разместить просто над компонентой:
    Как может выглядеть код

    ....
    import { View, Text, Button } from "react-native";
    
    const generateRandomArray = function () {
      let array = ["faith", "hope", "love", "gratitude", "patience", "mercy"];
      var currentIndex = array.length, temporaryValue, randomIndex;
    
      while (0 !== currentIndex) {
        randomIndex = Math.floor(Math.random() * currentIndex);
        currentIndex -= 1;
    
        temporaryValue = array[currentIndex];
        array[currentIndex] = array[randomIndex];
        array[randomIndex] = temporaryValue;
      }
      return array;
    };
    
    let ranomdArr = generateRandomArray();
    
    function Block() {
      const [fetus, setFetus] = useState(["0", "1", "2", "3", "4", "5"]);
      let refCopy = React.createRef();
      let refOut = React.createRef();.
    .....

    Функция генерации и сама переменная доступны в компоненте. Массив сгенерируется единожды при запуске приложения и загрузке этой компоненты. Если нам необходимо, то мы можем сгенерировать новый случайный массив и изменить значение ranomdArr.

    Так мы решим проблему с частой генерацией - генерировать мы сможем когда нам удобно.
    НО такое решение считается анти паттерном и нарушает основную идею функциональных компонент - делать их "чистыми", предсказуемыми, когда результат выполнения функции выводящей компоненту зависит только от входных параметров, а не от переменных снаружи нее.
    Обобщить логику кода и тем самым вынести его из кода компоненты
    1. Функция генерирующая случайный массив могла получать любой массив в качестве параметра - таким образом мы сделаем "чистой" и сможем вынести в отдельный файл
    2. Массив на основе которого мы генерируем новый случайный массив никогда не меняется - значит он константа в контексте приложения(ничто его не изменит), но он нужен только в этой компоненте. В таких случаях допустимо размещать инициализацию константы снаружи компоненты. Примером таких констант еще могу выступить столбцы для компоненты таблицы.
    3. Сгенерированный случайный массив можно хранить в компоненте, но надо чтобы он был неизменяемый при ререндере. Для этого используем хук useRef. При каждом рендере нам будет возвращаться то значение, которое было до него. Получать/изменять значение можем через current - "toggled.current = !toggled.current".

    Так у нас будет возможность сгенерировать новый случайный массив в любое необходимое нам время. Кода в файле компонента станет меньше, что приближает к "чистому" коду.
    Ответ написан
    Комментировать
  • Не записывается значение react-datepicker в модальном окне react-modal в safari, не работает?

    @Viarll
    Есть issue (1, 2) с подобной проблемой на Safari у react-date-picker. Но решения официального вроде как и нет(хотя был PR).
    • Есть неофициальное решение для 3.5.0, для этого придется поправить код пакета.
    • Либо отказаться от модалки и реализовать по другому. Попробовать свой вариант.
    • Либо выбрать другой date picker.
    • Либо, если не к спеху, самому починить и оформить PR для пакета.


    Также
    formatBirthday ошибочно конвертирует дату из input'а

    Имея такой код
    const change = (e) => {
        console.log("e = ", e);
        console.log("formatBirthday(e) = ", formatBirthday(e));
        console.log("new Date(formatBirthday(e)) = ", new Date(formatBirthday(e)));
        console.log("new Date(e) = ", new Date(e));
        onChange(new Date(formatBirthday(e)));
      };

    Выбираем дату, где день больше 12 и получаем Error на странице, а в консоли:

    e = Tue Aug 30 2022 00:00:00 GMT+0700 (GMT+07:00)
    formatBirthday(e) = 30.08.2022
    new Date(formatBirthday(e)) = Invalid Date
    new Date(e) = Tue Aug 30 2022 00:00:00 GMT+0700 (GMT+07:00)
    The above error occurred in the component:
    Could not consume error:
    Error: Something is *really* wrong.


    Ответ написан
    Комментировать
  • Какой WYSIWYG редактор лучше подойдет на React?

    @Viarll
    TinyMCE
    Имеет интеграцию с React и поддержка typescript. Множество плагинов и простая реализация своих.
    Ответ написан
    Комментировать
  • Насколько глубоких знаний в react требуется для устройства на react junior разработчика?

    @Viarll
    Есть нерегулярно обновляемая roadmap для full-stack разработчиков(фронт React, бэк Haskell - в основном фронт описан). Хорошо описаны вопросы, которые следовало бы изучить для продвижения и есть ссылки на необходимые для этого ресурсы. Дает четкое направаление для начала, когда не знаешь за что взяться.

    По React - если с английским все ок, то есть отличный сконцентрированный видео-курс, все кратко и по существу. Если же надо, чтобы разжевывали все и заучивали то есть путь самурая от позитивного IT-Камасутра. Оба курса, конечно отстают от реалий, но не сильно.

    А так в целом как уже здесь написали "Компания компании рознь" - в каждой по началу придется подстраиваться под необходимые задачи.
    Ответ написан
    Комментировать
  • Проблема с запуском хоста на github pages. Как исправить проблему с cannot spawn sh?

    @Viarll
    Из-за чего может возникать ошибка

    Скорее всего возникает при git clone. Если npm run deploy выполняется локально, то может проблема связана с доступом. Надо проверить, что папка, в которой выполняется команда, является репой и подключена корректно к GitHub - есть скрытая папка .git и после выполнения git remote -v есть remote с пометкой origin.

    Другой вариант использовать параметр -repo:
    gh-pages -d build -r <repo_url>

    Также remote origin можно сбросить на всякий случай выполнив эти команды в папке репы:
    $ git remote remove origin
    $ git remote add origin https://github.com/Roman214-go/Coincap.git
    $ git push -u origin master


    А если кратко, то если все делать по этой инструкция от create-react-app - все должно заработать.

    Что сейчас надо поправить и проверить на GitHub согласно инструкции

    • Надо выбрать одну из веток (master или main) для изменений. Или смержить их и избавиться от одной(лучше от main). При мерже надо быть внимательным - в main ветке в packages.json продублированы команды predeploy и deploy
    • gh-pages надо устанавливать через npm install --save gh-pages, т.е. не как devDependencies. Можно перенести из devDependencies в dependencies в packages.json и выполнить npm install
    • в скриптах изменить "deploy": "gh-pages -d build", - убрать " -b main", таким образом будет результат выполнения скрипта будет в ветке gh-pages
    • Выполнить npm run deploy и проверить, что ветка появилась на GitHub
    • В настройках проекта установить GitHub Pages на ветку gh-pages и в качестве папка в которую build сложился



    Допы:
    Как найти настройки проекта GitHub Pages для настр...
    Ответ написан
    Комментировать