• Как правильно изменить скрипт?

    @twoone
    document.addEventListener('DOMContentLoaded', function() {
      let numbers = [
        '+38 (095) 123 45 67',
        '+38 (096) 123 45 67',
        '+38 (097) 123 45 67',
        '+38 (098) 123 45 67',
        '+38 (099) 123 45 67',
      ];
      
      function getNumber(numbers){
        numbers.push(numbers.shift());
        
        return numbers[0];
      }
      
      function setNumber(number){
        let link = document.getElementById('phone');
        link.innerText = number;
        link.setAttribute('href', 'tel:' + number);
      }
      
      function update(){
        setNumber(getNumber(numbers));
      }
      
      update();
      
      setInterval(update, 2000);
    });
    Ответ написан
    Комментировать
  • PIXI js как оптимизировать фильтры (motion blur filter)?

    @twoone
    В реальных играх фильтры не используют, все делается на png. В качестве варианта решения вашей проблемы можно попробовать сделать предварительные рендер фильтров. То есть нарисовать шейп, применить к нему фильтр, а затем отрисовать шейп с фильтром в спрайт. Таким образом создаете множество спрайтов и уже их в мувиклипе объединяете и при необходимости рендерите его как анимацию.

    Но прежде нужно посмотреть доки, вдруг там галачка есть кеширования фильтров. Просто я фильтры никогда не использовал и поэтому не знаю.
    Ответ написан
    6 комментариев
  • Как избавиться от дублей запросов к серверу на react + php и server-side rendering?

    @twoone
    Для это необходимо сетевую логику вынести на отдельный слой с которым и будут работать реакт-компоненты. Простыми словами, определение загрузки должно выполняться не в комопнентах, а в отдельных сервисах. На сервере эти сервисы всегда выполняют запросы, а на клиенте только в случаях, если данные уже не были в них кешированы. То есть, на сервере вы сделали запрос и эти данные вместе с первоначальным рендереом отправили на клиент. Клиент эти данные использует при инициализации тех же сервисов и проэтому они запросы не делают. Нужно лишь подловить момент и не забыть удалить эти данные.
    Ответ написан
    Комментировать
  • Написал функцию рекурсивного сравнения значений 2 массивов, а она при любых значениях выдаёт undefined. Где ошибка?

    @twoone
    reduce не подходит так как в отличии от every будет выполнятся для всего массива даже если в встретит несоответствие в самом начале. Для проверки на принадлежность к массиву есть Array.isArray и ещё сразу проверять идентичность длины и её наличие.

    const f = (a, b) => Array.isArray(a) && Array.isArray(b) && a.length === b.length && a.length > 0 ? 
          a.every((item, index) => f(item, b[index])) :
          a === b;
    
    console.log(f([0, 1, [3]], [0, 1, [3]]))
    Ответ написан
    Комментировать
  • Использовать ли hoc если в трех местах используются одинаковый state?

    @twoone
    Вот смотрите. Класс, это шаблон по которому создаются объекты. Состояние класса, то есть его поля, уникальны для каждого экземпляра. Независимо от количества экземпляров класса, его методы всегда будут работать именно с его состоянием, так как они связанны контекстом. Другими словами логика находящаяся в методах связанна с объектом класса.

    Так вот хуки это попытка реализовать поведение методов в функциях. То есть определяя хук вы привязываете его к жизненному циклу функционального компонента и его состоянию. Проще говоря для каждой копии функционального компонента создается отдельная копия хука.

    Из этого следует что обращатся за данными на сервер в хуке нельзя, поскольку каждый компонент использующий ваш хук будет выполнять отдельный запрос к БД. Хук это не сервис. Хук это попытка реализации поведения методов в функциональных компонентах.

    Когда разные компоненты нуждаются в одних и тех же данных их получение и хранение выносят на отдельный соответствующий слой(слои). Для реакта это redux/mobx.
    Ответ написан
    1 комментарий
  • Как сделать условие основанное на результате поиска в текущем URL?

    @twoone
    let params = new URLSearchParams(location.search);
    
    if(params.has(`lang__ee`)){
        document.querySelector(`selector`).textContent = `Some Text`.
    }else{
        document.querySelector(`selector`).textContent = `Other Text`.
    }


    selector заменить на валидный селектор существующего элемента в который требуется вывести сообщение.
    Ответ написан
    Комментировать
  • Как определиться с профессией?

    @twoone
    Я никогда не встречал счастливых людей которые спрашивают советов как имеено им жить. Читайте, много читайте информации на интересующие вас темы и все сами поймете. Если вы не можете вычлинить правильную информацию спообную сделать вас счастливым, то уже ни один совет вас не спасет. К тому же советовать любят все, поэтому вы также огребете весь спектор возможных вариантов.
    Ответ написан
    3 комментария
  • Как лучше типизировать параметры у функции?

    @twoone
    Если опустить тот факт что параметры функции сложения обязанны быть определенны как обязательные, то конкретно тип undefined можно заменить опционалыным модификатором ? .

    function а (a?: number, b?: number) {}

    В остальном параметры функции декларации описать невозможно. Другое дело функциональное выражение которое можно описать с помощью типа.

    Для псевдонима
    type Sum = (a?: number, b?: number) => number;

    Для интерфейса
    interface ISum { (a?: number, b?: number): number; }


    И использование
    const sum: Sum = (a, b) => a + b;
    Ответ написан
    Комментировать
  • Какой подход к реализации более правилен?

    @twoone
    Лично мне кажется что в spa приложении передавать значения с помощью query стоит только в случаи публичной ссылки. К примеру кастомная сборка компа которой я хочу поделится на тематическом форуме. В остальных случаях лучше создавать модель корзины (store/localeStorage).
    Ответ написан
    Комментировать
  • Почему это не работает?

    @twoone
    У вас возвращаемое из функции значение принадлежит к чистому типу T у которого отсутствуют признаки типа ITest, о чем и говорит ошибка. Это вы думаете что с помощью аргументов типа конкретизировали возвращаемое функцией значение. То есть вы смотрите как-бы из вне. Но компилятору необходимо сопоставить типы внутри самой функции. Выполняя это он и обнаруживает несоответствие типа { testField: number } типу T.

    Советовать что-либо сложно, поскольку в таком контексте не понятно что вы хотите добится.
    Ответ написан
    Комментировать
  • Есть ли какой-то критерий, по которому можно отличить дизайнера ui/ux? Junior/Middle/Senior?

    @twoone
    Чтобы с полслова разглядеть в человеке кого-то, нужно быть этим кем-то умноженным на два. В остальных случаях даже джун может выставить себя праповедником. Ну а в остальном можно тупо спросить сколько часов человек занимается тем или иным делом, разделив его на полтора или даже два, если человек не чувствует себя уверенным при разговоре на профессиональные темы.
    Ответ написан
    4 комментария
  • Техническая документация, как и что писать?

    @twoone
    Во первых существует множество регламентов предназначенных для различных видов ПО в различных странах. Во вторых описание должно включать текстовое описание (цели\проблемы\решения), uml\bpmn2 диаграммы описывающие архитектуру\дизайн\сценарии. В третьих создать техническое описание продукта намного сложнее создания самого продукта поскольку это тоже самое только на других языках и более детально. Это сопоставимо с книгой, порой на тысячи страниц.

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

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

    @twoone
    Можно вот так -
    interface StateProps {
        a: number;
        b: string;
        c: boolean;
    }
    
    interface Action<P> {
        payload: Partial<P>;
    }
    
    const f = <P>(state: P, { payload }: Action<P>): P => ({
        ...state,
        ...payload,
    });
    
    let nextState = f(
        { a: 0, b: '', c: true },
        { payload: { c: false } }
    );


    Единственное нужно помнить что универсальные функциональные функции являются не допустимыми конструкциями в файлах с расширением .tsx.
    Ответ написан
    1 комментарий
  • Можно ли размещать в портфолио проекты с пройденных курсов по React и JS?

    @twoone
    Возможно я развею чары наивности, но работы выполненные на курсах только отпугивают адекватных искателей, поскольку к реальности они ничего общего не имеют. По ним нельзя оценить не уровень ни вложенное время. Первое сомнение возникает по причине рефакторинга со стороны менторов, второе вообще не поддается оценке, так как работа может выполнятся бесконечно долгое время.

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

    Поэтому ещё раз повторюсь - лучше не стоит. Создайте несколько страничек самостоятельно и засеките реальное время ушедшее на черновую работу и финальную работу с цучетом рефакторинга. Предоставьте действительно полезную информацию.
    Ответ написан
    Комментировать
  • Как настроить сборку проекта?

    @twoone
    Да, все верно, в данном случае webpack будет лучшим решением. Почитайте о механизме мулти-конфигурации, которая позволяет запускать одновременно несколько конфигураций (в вашем случае это клиент и сервер конфигурации). К тому же стоит напомнить о необходимости в nodemon чтобы перезапускать сервер при изменении его файлов.

    ts-node будет в самый раз для dev разработки исключительно одного сервера.
    Ответ написан
    Комментировать
  • Как отдать на клиент страницу с данными из бд [2020 React SSR with Hook]?

    @twoone
    ssr должен отдавать законченную разметку содержащую всю необходимую информацию. Иначе в нем попросту нет смысла. Запросы к БД это асинхронные операции, а рендер реакта нет. Вызов рендера сравним с вызовом обычной функции, которая вернет результат по выполнению. Она конечно запустит асинхронные обращения к БД, но дожидатся их окончания не будет. Поэтому хуки, которые не являются сервисами, а предназначены для иметации тела класса, не способны разрешить вашу проблему. Хуки созданы для разделения логики работы непосредственно с шаблоном между компонентами. Вы должны строить приложение таким образом чтобы рендер был выполнен со всеми необходимыми данными. Простыми словами работа с данными должа быть вынесена на сервисный слой, который по завершению инициализации используется реактом для получения необходимых данных.
    Ответ написан
    Комментировать
  • Стоит ли новичку брать курсы от GeekBrains или Скиллбокс?

    @twoone
    Львиная доля курсов\видеоуроков никакой пользы не принесет. Кроме того, на личном опыте осознал что чем именнитей продавцы, тем бесполезней программа и её подача. Скорее всего дело в том что крутые бренды видят в процессе обучения лишь бизнес, а те кто создает программы, те с кем они сотрудничают выбираются лишь по критериям принадлежности к какому-либо известному бренду. Простыми словами чувак работал в крутой компании и занимал там какую-то дорлжность, значит он теперь стал крутым учителем. Вот к примеру если спросить может ли крутой прогер быть крутым менеджером, то все скажут что далеко не факт и даже наоборот это редкость. Но почему-то не могут понят что прогер не зависимо от уровня точно также не может стать учителем. Преподование, создание собственных программ, это очень тяжкий и времязатратный труд. На создание толковой программы уйдет от полугода до года и больше.

    Задайтесь вопросами.. Сколько по вашему должен зарабатывать чувак который круче чем любой синьор за год с тем расчетом что он нер затрачивает в разы больше? Сколько должен стоить курс? А сколько этот курс будет оставатся актуальным? Сколько теперь должен стоить курс? А раз они такие дешевые то какого качества?

    Поэтому на собственном опыте убедился что самые крутые курсы это те которые делают простые люди лля того чтобы повысить свой статус и технические навыки. В большинстве такие курсы бесплатные.

    Что касается от нуля до про и трудоустройство.. А чито они врут? Вот что врет школа когда говорит что вас научат с нуля до поступления в универ? Это школа виновата что 98% не в состоянии её осилить на уровне необходимым ддля поступления в универ? Никакие курсы не смогут гаратнтироватьч то все те кто не смог школьную программу осилить смог осилить их программу на том уровне на котором можно говорить о трудоустройстве.

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

    @twoone
    Причина описана в тексте ошибки. Вам необходимо использовать кортеж.

    class Flintstone {
        say() {
            console.log(` Yabba-Dabba Do`);
        }
    }
    let fred = new Flintstone();
    let list =['say'] as const;
    fred[list[0]];


    Тоже самое можно сделать с помощью enum или const enum

    class Flintstone {
        say() {
            console.log(` Yabba-Dabba Do`);
        }
        go() {
            
        }
    }
    let fred = new Flintstone();
    
    const enum FlintstoneMethod {
        Say = `say`
    }
    
    let keys: FlintstoneMethod[] = [FlintstoneMethod.Say];
    fred[keys[0]]();


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

    @twoone
    function increaseSalary() {
      return new Promise((resolve, reject) => {
        let minSalaryEmployee = Promise.resolve().then((employeeData) => {
          return { };
        });
        minSalaryEmployee
          .then((data) => {
            let newSalary = Promise.reject();
            newSalary
              .then((newData) => {
                resolve(`Ok`);
              })
              .catch((e) => {
                reject(`Error`)
              });
          })
          .catch(reject);
      });
    }
    
    increaseSalary()
      .then(console.log)
      .catch(console.error);
    Ответ написан
    2 комментария
  • Как рекурсивно отрендерить вложенные массивы?

    @twoone
    Лучше рекурсию прямо на компонентах реализовать -

    https://codesandbox.io/s/silly-ramanujan-3giij?fil...

    import React from "react";
    import "./styles.css";
    
    const data = [{
            "id": "market-executive-summary",
            "title": "Executive Summary",
            "interactivity": false,
            "priceFactor": 2,
            "children": [{
                "id": "market-executive-summary-overview",
                "title": "Overview",
                "interactivity": false,
                "priceFactor": 0,
                "children": []
            }, {
                "id": "market-executive-summary-key-findings",
                "title": "Key Findings",
                "interactivity": false,
                "priceFactor": 0,
                "children": []
            }, {
                "id": "market-executive-summary-conclusions-implications",
                "title": "Conclusions & Implications",
                "interactivity": false,
                "priceFactor": 0,
                "children": []
            }]
        },
        {
            "id": "market-definitions-segmentation",
            "title": "Definitions & Segmentation",
            "interactivity": false,
            "priceFactor": 2,
            "children": [{
                "id": "market-definitions-segmentation-definitions",
                "title": "Definitions",
                "interactivity": false,
                "priceFactor": 0,
                "children": []
            }]
        }
    ]
    
    const List = ({data}) => {
      let children = data.map(data => <Item {...data}/>)
      
      return (
        <ul id>
          {children}
        </ul>
      );
    }
    const Item = ({id, title, children}) => {
      let list = children.length ? <List data={children}/> : null;
      
      return (
        <li>
          <span>{title}</span>
          {list}
        </li>
      );
    }
    
    export default function App() {
      return (
        <List data={data}/>
      );
    }
    Ответ написан
    Комментировать