• Можно ли как-то проверить, все ли заполнены обязательные поля в react-hook-form?

    search
    @search
    мама говорит что я особенный
    Вам может помочь объект formState:

    const { isDirty, isValid } = formState;
    return <>{isDirty && isValid && <button />}</>
    Ответ написан
  • Как правильно сделать модульное окно в React?

    search
    @search
    мама говорит что я особенный
    Вот так:

    const [modalIsVisible, setModalIsVisible] = useState(false);
    
    return (
      <>
        <button onClick={() => setModalIsVisible(true)}>Show modal</button>
        { modalIsVisible && <Modal onClose={() => setModalIsVisible(false)} /> } 
      </>
    )
    Ответ написан
    1 комментарий
  • Как развернуть юнион в интерфейс?

    search
    @search
    мама говорит что я особенный
    Вы, наверное это имели ввиду:

    type union = 'a' | 'b' | 'c'
    type I = {
      someOtherField?: number;
    } & Record<union, any>;
    // result:
    interface I {
      someOtherField?: number;
      a: any
      b: any
      c: any
    }


    Если вам не нужны дополнительные поля в интерфейсе (типа someOtherField из примера), то можно обойтись просто Record<union, string>. Как-то так:

    type I = Record<union, any>;
    Ответ написан
    3 комментария
  • Как перенести подписку на стрим из метода, вызываемого юзером, в ngOnInit()?

    search
    @search
    мама говорит что я особенный
    Старайтесь свести работу с обзёрваблами к подписке на них через asyncPipe. В таком случае ангуляр будет менеджить подписки/отписки за вас.

    Как это корректно делать не подскажу, потому что сам пришел к этому слишком поздно к концу двухлетнего проекта и уже полтара года как не сталкивался с ангуляром. Но на вид это возможно. Имхо нужно сохранять голову на плечах и не пытаться вывернуться с RxJS во что бы то ни стало потому что через месяц самому будет непонятно как это работает.

    Хорошее правило работы с RxJS - стараться откладывать вызов subscribe на потом. Код будет гибче если ваши методы не вызвают subsctibe, а возвращают observable. А подписка на сам observable происходит где-то в другом месте (например в том же asyncPipe). Ну или в том месте, где уже просто никак без подписки :-) Многие начинающие ангулярщики боятся RxJS как огня и подписываются на обзёрвблы при первой возможности, а дальше менеджат код в привычном инперативном виде. Такой стиль кодирования обычно заканчивается жалобами на сам фреймворк (мол он ничего не умеет).
    Ответ написан
    Комментировать
  • Как добавить в аргумент функции обработчика значение инпута?

    search
    @search
    мама говорит что я особенный
    Вот так

    //...
    getChangeBonusTypeHandler = (event) => this.getChangeBonusType(event.target.value);
    //...
    render() {
      return <input onChange={this.getChangeBonusTypeHandler}/>
    }
    Ответ написан
  • Можно ли задать плавное появление директиве ngSwitch?

    search
    @search
    мама говорит что я особенный
    Да, это можно сделать при помощи ангуляровской системы анимации.

    Вот пример того как анимация реализована для ngFor https://stackblitz.com/edit/ng-animations?file=ani...
    Принцип не отличается от ngSwitch.

    Здесь можно почитать подробнее https://angular.io/guide/transition-and-triggers
    Ответ написан
    Комментировать
  • Как ищут участников в opensource-проекты?

    search
    @search
    мама говорит что я особенный
    Для того чтоб привлечь контрибуторв нужно для начала привлечь пользователей. Для этого:

    1. Дайте внятное описание того какую задачу решает проект. Пока по описанию проекта видно как он создан, но не что делает. Желательно уложить это описание в одно-два предложения, которые идут сразу после заголовка проекта
    2. Это UI проект? Где ссылка на демо?
    3. Вас в комментариях уже спросили, почему он называется my_...? Сейчас проект выглядет как поделка для личного использования
    4. Необходимы инструкции по установке. Желательно в виде npm install project_name, а не в виде нескольких абзацев текста
    5. Прогоните описание хотя бы через grammarly. Сейчас там слишком много "русского английского"

    Ответ написан
    4 комментария
  • Почему ругается на catch?

    search
    @search
    мама говорит что я особенный
    Сделаейте

    .catch(err => reject(err))

    а не

    .catch(err = reject(err))

    и перестанет ругаться.
    Ответ написан
    Комментировать
  • Как правильно делать настройку end-point?

    search
    @search
    мама говорит что я особенный
    В статье описан нормальный способ.

    Проблем с доккером не будет потому приложение в любом случае будет компилироваться отдельно для каждого из окружений перед тем как выкладываться на сервер.
    Ответ написан
    Комментировать
  • Как подключить SASS миксины для angular проекта?

    search
    @search
    мама говорит что я особенный
    Проблема в том что SASS файлы компонентов - это отдельные модули, не связанные с "глобальными" стилями. Для того чтоб переиспользовать миксины, переменные и прочее, создайте отдельный файл, например _utils.scss, где бы лежали эти самые миксины и переменные. И импортируйте _utils.scss в те компоненты, где они нужны.

    Несколько лет назад я попытался заморочиться и сделать так чтоб миксины подключались по умолчанию где-то из настроек, но с наскока у меня не получилось - это раз. А два - поразмыслив, я пришел к тому, что это не верно, потому что при глобализации миксинов программист теряет возможность чистого и прозрачного экспортирования компонент в сторонние модули. Такие дела.
    Ответ написан
    1 комментарий
  • Как реализовать слайдер (Swiper.js) как react-компонент?

    search
    @search
    мама говорит что я особенный
    Свайпер предоставляет компонент для Реакта. Вот он https://swiperjs.com/react/

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

    search
    @search
    мама говорит что я особенный
    Потому что роут "/" срабатывает раньше чем "/task/:id". Поменяйте их местами и проблема исчезнет. Реактовский роутер жадно выбирает все роуты, которые подходят по маске. Роут "/" наименее специфичный, поэтому будет срабатывать всегда.

    Для того чтоб подобной проблемы не возникало, необходимо расставлять роуты от более специфичным к менее, например "/a/b" -> "/a" -> "/".

    Так же можно добавлять роутам атрибут "exact". Тогда роутер будет выбирать точное совпадение, а не вхождение.
    Ответ написан
  • Почему метод некорректно работает с добавлением уникальных ключей?

    search
    @search
    мама говорит что я особенный
    Потому что key должен быть уникальным значением, а у вас используется одно и тоже значние для кадого элемента списка. Самый простой и примитивный способ заткнуть реакт чтоб он не ругался на отцуствие ключа, это сделать как-то так:

    taskList.map(function(item, idx) {
      return (
        <p className="task" key={idx} >{item}</p>
      )
    })


    Но способ лучше - это организовать структуру состояния таким образом, чтоб уникальный ключ хранился в каждом элементе списка. Типа того:

    taskList = [
      {id: 1, objective: 'Buy milk'},
      {id: 2, objective: 'Learn React'},
    ]
    
    taskList.map(task => (<div key={task.id}>{task.objective}</div>))
    Ответ написан
  • Оцените код Angular?

    search
    @search
    мама говорит что я особенный
    Когда меня просят оценить код на Ангуляре, то всегда вангую непонимание Rx. Это одновременно самая сильная и самая слабая сторона Ангуляра. Сильная в том плане что это невероятно мощный инструмент. А слабая в том что порог вхождения в Rx крайне высок. Невозможно просто так взять, начать проект с RxJS, разобраться походу и в итоге сделать хорошо. Нужно заранее знать с чем имеешь дело. Я не знаю как объяснить эти принципы в двух словах, или дать какую-то формулу успеха.

    Вот лекция, которая в своё время мне помогла:

    https://www.youtube.com/watch?v=3LKMwkuK0ZE

    Она по RxJS 5, но принципиально ничего не поменялось.

    Это из того что сразу бросается в глаза почти на любом проекте, не только на вашем.

    Из плюсов:

    - понимание что такое компоненты
    - плоская структура проекта

    Из минусов (не считая Rx):
    - отсутствие модулей

    Я бы еще поставил под сомнение необходимость папок services и shared, но это скорее всего вкусовщина. Кстати, если у кого-то сейчас бомбануло от предыдущего предложения, можете плиз направить меня куда-то где бы это по-человечески объяснялось? А то я реально не понимаю зачем нужны эти папки, и зачем провайдеры, работающие с Http называть сервисами. Я так подозреваю что народ копирует эту идею друг у друга. Но могу быть с удовольствием неправ.
    Ответ написан
    1 комментарий
  • Как добавить before для компонента react в css?

    search
    @search
    мама говорит что я особенный
    Можно картинку поместить в ту же папку где и CSS файл. Тогда в CSSнике можно будет сделать url('./image.jpg'), а вебпак это дело разрулит во время компиляции и поместит картинку куда надо.

    Если вы пришли в Реакт и модульные бандлеры (ака Вебпак) со старого доброго Галпа или вообще без него обходились раньше, то такой подход немного ломает стереотип. Мы привыкли хранить картинки в папке public/images, а стили в папке public/styles. Но в мире вебпака совершенно нормально хранить стили и статитику рядом с кодом. Собственно, вебпак и нужен для того чтоб это подключать и распределять как нужно.

    В последнее время стал популярен подход так называемого Модульного ЦСС (CSSModules): это когда стили и статические файлы относящиеся к компоненту хранятся в папке компонента. Сам Вебпак позаботится о том чтоб во время компиляции положить стили и статику куда нужно. За это мы его и любим.
    Ответ написан
    6 комментариев
  • Рекурсия в JavaScript?

    search
    @search
    мама говорит что я особенный
    Это не нормальное решение прежде всего потому что функции знают о:
    1. существовании друг друга
    2. существовании некоего правила последовательности их вызова

    Такой код называется высокосвязным. Высокосвязный код дорого поддерживать потому что приходится учитывать множество деталей его реализации. Учебники рекомендуют создавать как можно более обособленные функци: так называемые "чистые функции".

    Сделать функции чище можно, например, так:

    const delay = timeout =>
        Promise(resolve => setTimeout(() => resolve(), timeout));
    
    async function delayedQueue() {
        first();
        await delay(1000);
        second();
        await delay(1000);
        third();
    }
    
    delayedQueue();


    Как видите, теперь функции, которые необходимо вызвать с задержкой, не подозревают о существовании друг друга, а само правило последовательности их вызова инкапсулировано в отдельной функции delayedQueue.
    Ответ написан
    Комментировать
  • Как отслеживать обновление в firebase?

    search
    @search
    мама говорит что я особенный
    https://firebase.google.com/docs/database/web/read...

    Вот этот запрос в гугле привёл меня к решению https://www.google.com/search?newwindow=1&sxsrf=AL...

    Как говорится, "inglish - velikaya sila"
    Ответ написан
  • Как перенести React проект на другой пк?

    search
    @search
    мама говорит что я особенный
    Удалите папку node_modules и после этого выполните команду npm install.
    Ответ написан
    1 комментарий
  • Какой использовать GULP плагин для изменения файлов?

    search
    @search
    мама говорит что я особенный
    Добавить текст в любой файл можно при помощи https://www.npmjs.com/package/gulp-header

    В конец https://www.npmjs.com/package/gulp-footer

    В любое место https://www.npmjs.com/package/map-stream

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

    search
    @search
    мама говорит что я особенный
    Я бы на вашем месте делал это без ифа, потому что внутри ифа сложно будет сказать к какому именно блоку относится `.thumbnail-container-images`.

    Можно сделать так:

    $(".thumbnail-container:not(.with_thumb) .thumbnail-container-images").css("width","77%")


    Что означает: присвоить всем .thumbnail-container-images, которые находятся внутри .thumbnail-container:not(.with_thumb) ширину 77%.
    Ответ написан