Задать вопрос
  • Могут ли контейнеры содержать классы и разметку?

    Robur
    @Robur
    Роман Якимчук, ну, если интересно мой личный опыт - я давно забросил разделение на dumb/smart компоненты.
    Есть отдельно супер-примитивные UI компоненты, типа кнопок, таблиц, списков и так далее,
    остальные компоненты с логикой и представлением вместе.
    данные грузятся прямо в компоненте хуками, либо из стейта, либо из стора, либо из apollo, дальше с ними делается что надо и тут же рендерится что надо.

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

    Из моего опыта так и удобнее намного и поддерживать приятнее.

    Использую apollo+mobx+хуки, это все позволяет не сильно думать о нюансах работы с данными, они просто используются тогда когда нужны и там где нужны.

    Каши нет. Как впрочем и идеала
  • Удалили акк Upwork с деньгами, что делать?

    Robur
    @Robur
    Поделитесь альтернаивами которые вы теперь используете и результатом?
  • Import vs redux and react context?

    Robur
    @Robur
    mobx, но если у вас graphql то в простых и средних приложениях большая часть данных лежит в кеше клиента аполло и на долю стейта приложения остается уже совсем мало чего.
  • Безопасная аутентификая пользователей без сессий?

    Robur
    @Robur
    Александр, Если у вас подразумевается что у клиента можно данные просто "украсть и все тут" - то никак.
    Только аутентификация по видеозвонку менеджеру и то это не 100%.

    Ну, можно придумать аппаратную защиту какую-нибудь со скремблингом пакетов, но если бы у вас такие задачи стояли, вы бы не писали о них на тостере.
  • Import vs redux and react context?

    Robur
    @Robur
    Quintis, Я его уже совсем не использую последние два года :)
  • Почему незя присвоить значения через for in в typescript?

    Robur
    @Robur
    Был не прав, ошибка не такая простая, как мне показалось. до версии 3.5 оно работало. в 3.5.1 уже нет - почему, надо смотреть,
    можно починить вот так:
    constructor(recipeDetails: Details = { title: "", description: "", ingredients: [] }) {
        for (let key in recipeDetails) {
          (this[key as keyof Details] as Details[keyof Details]) = recipeDetails[key as keyof Details];
        }
      }
    
     interface Details { title?: string, description?: string, ingredients?: RecipeIngredient[]}


    Но это уже прямо на грани.
  • Почему незя присвоить значения через for in в typescript?

    Robur
    @Robur
    хотя покажите ка код целиком. со свойством класса
  • Почему незя присвоить значения через for in в typescript?

    Robur
    @Robur
    Wasya UK,
    'string | RecipeIngredient[] | undefined' нельзя присвоить в 'string & RecipeIngredient[]'
    Это самая базовая ошибка типов в тайпскрипте - таких у вас будет миллион.
    С такими ошибками надо научиться разбираться, иначе вы через каждые две строки будете мучаться и искать где спросить.

    Я вам дам только одну подсказку - массив не при чем.
  • Почему незя присвоить значения через for in в typescript?

    Robur
    @Robur
    Максим Зайцев, одна из многих вещей которые я планирую добавить в забытые на ненадобностью по мере развития языка :)
  • Почему незя присвоить значения через for in в typescript?

    Robur
    @Robur
    Wasya UK, нет такой ошибки "не работает". Есть конкретные сообщения компилятора, которые поддаются копированию.
  • С чего начать стоит начать, чтобы уйти на фриланс?

    Robur
    @Robur
    Рональд Макдональд, без проблем, поздравляю с победой в сложной и напряженной борьбе - теперь ваш день прожит не зря. Видите, вы не такой уж и неудачник.
  • Почему незя присвоить значения через for in в typescript?

    Robur
    @Robur
    class X {
        title?: string
        description?: string
        constructor(recipeDetails: {title?: string, description?: string } = { title: "", description: "" }) {
    
            for (let key in recipeDetails) {
                this[key as keyof typeof recipeDetails] = recipeDetails[key as keyof typeof recipeDetails];
            }
        }
    }
  • С чего начать стоит начать, чтобы уйти на фриланс?

    Robur
    @Robur
    Рональд Макдональд, да, я игнорирую ваши вопросы, и не вижу причин рассказывать о себе и своих доходах какому-то анонимусу в интернете.

    Но если вы действительно хотите ответов (в чем я лично сомневаюсь но я могу и ошибаться) и подробную и обстоятельную карьерную консультацию - без проблем, но скидки на инвалодность не будет - общий прайс. Контакты мои найти не проблема, пишите, вносите предоплату и все узнаете.
  • С чего начать стоит начать, чтобы уйти на фриланс?

    Robur
    @Robur
    kk95, Лайфхак вообще простой - надо напрячь мозги и попахать. Но не всем под силу - это ж надо что-то делать. А многим хотелось-то чтобы просто так денег дали и много.
    Проще сказать что вам-все-врут/у-меня-то-не-вышло-и-у-вас-не-выйдет/наверняка-все-поблату/есть-секреты-но-нам-не-скажут и так далее-кому на что фантазии хватит.
  • С чего начать стоит начать, чтобы уйти на фриланс?

    Robur
    @Robur
    Рональд Макдональд, про ваш "уровень" аргументации и осведомленности лишний раз напоминать не надо - все в курсе.
  • Как уехать за границу?

    Robur
    @Robur
    Процесс миграции долгий и сложный, готовиться к нему надо загодя и основательно.


    От страны зависит и собственной способности взять и переехать. Я в свое время где-то дня за три собрался, через две или три недели (надо было доработать и машину продать) после офера был уже там.
  • Как отправить сообщение об ошибке с apollo-server?

    Robur
    @Robur
    вот тут все подробно, с примерами кода, ответами и прочим: https://www.apollographql.com/docs/apollo-server/d...
  • Объекты первого класса с использование синтаксиса стрелочных функции?

    Robur
    @Robur
    по тому же принципу - надо понимать как компилятор разбирает код и что у него получается.
    тут он понимает что "надо взять значение которое лежит в identity (там функция v=>v) вызывать её передав в качестве параметра результат выражения v=>v (что тоже функция), потом взять возвращенное значение - и вызывать его снова как функцию передав ему в качестве параметра 'run'"

    Потом начинает это выполнять:
    взять значение identity (v=>v)
    вызвать её передав как параметр (v=>v) выглядит так же но это другая функция

    первая v=>v возвращает то что ей передали без изменений. Так как ей передали v=>v она её и вернет
    дальше движок берет это значение и вызывает его с параметром 'run'.

    Вообще прочитайте про синтаксический разбор и построение AST что-нибудь популярное, если хотите в глубоких деталях понимать что там происходит.

    В реальной жизни всяких подобных конструкций стараются избегать, делая код максимально простым. И если нужно что-то подобное и хочется функциональщины, то заворачивают в "синтаксический сахар" именно с целью сделать это все более просто выглядящим для человеческого мозга.
    Потому что даже если вы это все понимаете, все равно чем меньше мозг напрягаете на такие вещи, тем больше его остается на решение настоящих задач.
  • Объекты первого класса с использование синтаксиса стрелочных функции?

    Robur
    @Robur
    Согласен! Давайте подставим значение 10:
    function (10) { return 10; } вернёт 10.


    нет. так и будет function (v) { return v}.
    которую вы потом вызываете с параметром 10.

    (v=>v)(10) то же самое что и

    const x = v=>v
    x(10)

    после первой строчки x содержит ссылку на функцию.
    во второй строчке эта ссылка используется чтобы вызвать эту функцию и передать туда 10

    в (10 =>10)(10) это никогда не превращается.

    Отдельно есть две стадии - первая - это когда компилятор парсит программу и пытается понять что вы ему написали.

    На этой стадии строятся все эти ссылки, объекты, функции и понимания что куда передать.
    здесь строка "(v=>v)(10)" превращается в инструкцию "взять выражение v=>v, которое возвращает нам функцию и затем вызвать результат этого выражения(эту самую функцию) передав ей 10 в качестве параметра" эта инструкция выражена совсем в другом виде чем ваш текст программы и дальше текст программы уже выкидывается и не используется.

    вторая - это когда он ее запускает и начинает по этой инструкции работать.
    буквально берет функцию v=>v и вызывает её с параметром 10.

    нигде в этих этапах нет 10=>10.
  • Нужно ли помещать в стор все состояния компонента?

    Robur
    @Robur
    Роман Якимчук,можно все вообще положить в компоненты - даже стор не нужен, кода меньше, и дальше по вашему тексту.
    Да, эти описанные кейсы пропадут и не будут мучать. Только вот придется начать отслеживать другие кейсы и уже для них городить огород.

    Правильное решение как всегда - в грамотном разделении в конкретном приложении в зависимости от задач, структуры, сценариев использования и так далее.