• Почему округление до целого числа получается с ошибкой js?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Ответ на вопрос: потому что используются числа с плавающей точкой.
    Если нужно округлённое число - округляйте непосредственно перед использованием\выводом. Любая математическая операция может добавить немного "мусора" при определённых условиях.
    Ответ написан
    1 комментарий
  • На что влияет запись стилей разными способами?

    Aetae
    @Aetae
    Тлен
    Категорически не согласен с ответом человека-обфускатора The Wizard of Oz.
    Запись в одну строку гораздо менее читаема, сложнее в изменении, и несёт в себе ненужные побочные эффекты(если нужно на самом деле только что-то одно).
    Наглядная полная запись любых свойств - гораздо проще как для восприятия, так и для изменения.

    А размер файла в современном вебе - это даже не смешно, без постпроцессинга с минификацией на выходе сейчас никто адекватный не работает.
    Ответ написан
    Комментировать
  • Какой тип указать для children.current у TS?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Возможно ак:
    const {current}: {current: HTMLUListElement} = children;

    или так:
    const current = children.current as HTMLUListElement;

    Вы же задаёте тип не current, а всего объекта.

    P.S. Про ts-ignore забудьте.
    Ответ написан
    Комментировать
  • Как переделать массив объектов?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Один проход, но в каждом узле будет children даже если пустой:
    function unFlatten(array) {
      const childrenMap = Object.create(null);
    	for(const item of array) {
        if(item.parent in childrenMap) 
          childrenMap[item.parent].push(item);
        else
          childrenMap[item.parent] = [item];  
        
        if(!childrenMap[item.id]) childrenMap[item.id] = []; 
        
        item.children = childrenMap[item.id];
      };
      return childrenMap[null]
    }

    Один-два прохода, как повезёт, но children только там где нужны.
    function unFlatten(array) {
      const childrenMap = Object.create(null);
      const secondPass = [];
    	for(const item of array) {
        if(item.parent in childrenMap) 
          childrenMap[item.parent].push(item);
        else
          childrenMap[item.parent] = [item];  
        
        if(item.id in childrenMap) 
          item.children = childrenMap[item.id];
        else
          secondPass.push(item)
      };	
      for(const item of secondPass) {
        if(item.id in childrenMap) 
          item.children = childrenMap[item.id];
      };
      return childrenMap[null]
    }

    Или от обратного:
    function unFlatten(array) {
      const map = Object.create(null);
      const secondPass = [];
      for(const item of array) {
        map[item.id] = item;
        if(item.parent in map) {
          if('children' in map[item.parent])
            map[item.parent].children.push(item)
          else
            map[item.parent].children = [item];
        } else {
          secondPass.push(item);
        }
      };
      for(const item of secondPass) {
        if(item.parent in map) {
          if('children' in map[item.parent])
            map[item.parent].children.push(item)
          else
            map[item.parent].children = [item];
        }
      };
      return secondPass
    }

    Любой вариант меняет исходные узлы(если надо - клонируйте), и не рассматривает случай когда цепочка родитель-потомок может быть сломана.
    Ответ написан
    Комментировать
  • Как из массивов получить объект?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Схема конечно кривая, но как-то так:
    function toObject(animals, titles, list) {
      animals = Object.fromEntries(animals);
      titles = Object.fromEntries(titles);
      return list.map(([animal, title, ...array], i) => ({
        id: i + 1, 
        title: titles[title], 
        animal: animals[animal], 
        array
      }));
    }
    
    toObject(arr1, arr2, arr3);
    Ответ написан
  • Продуктивно ли подобное обучение?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Возьми более базовые книги: по алгоритмам, паттернам, структурам, подходам итд. Не привязанные к конкретному языку. Это всегда будет полезно, и не потребует кодинга для практики.
    Эффективное же изучение конкретного языка - это наоборот чистая практика, чтение там должно идти только параллельно по мере необходимости.
    Ответ написан
    4 комментария
  • Как подключать разные файлы sass переменных для одного проекта на Vue?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Переменные удобнее всего подключать глобально через prependData.
    Соответственно и менять удобно в одном месте. По условию или ещё как.

    А вот как у вас три проекта в одном репозитории - вопрос отдельный.
    Ответ написан
    Комментировать
  • Как исправить ошибку Vue Js: "Error in nextTick: "NotFoundError: Failed to execute 'insertBefore' on 'Node'"?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Ну поищите где у вас по коду юзается insertBefore.
    Если не юзается, то теоретически это может быть из-за того, что как key в v-for попадаются дубликаты, но обычно это приводит к другим ошибкам.

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

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Babel по умолчанию просто преобразует новый код(es6) в старый код(es5). Как очевидно из названия, es6-модулей в es5 нет, потому импорты он тоже преобразует. Это собственно всё, что он должен делеть.
    Сборка кода в единый бандл, минификация, оптимизация, treeshaking и прочее - не в его компетенции.
    Для сборки в glup есть свои инструменты, также есть системы строящиеся изначально от идеи сборки: webpack, rollup и т.д.
    Ответ написан
    Комментировать
  • Получение асинхронных данных из одного модуля в другой?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    В getter - никак. В action - просто запускать action модуля А и await его. Чтоб не запускать action модуля A несколько раз - можно сделать дополнительно - проксируеще-кеширущий action-прокладку, который будет запускать нужный action один раз и пока не будет ответа - на все следующие запросы отдавать Promise текущего.
    Ответ написан
    Комментировать
  • Как решить эту проблему с if/else?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    В localStorage хранятся только строки. Если вы делаете так localStorage.setItem('token', false), то при localStorage.getItem('token') вы получаете не '', а результат приведения false к строке, т.е. 'false'.
    Впрочем false !== '' - тоже истина, потому что !== сравнение без приведения типов.
    Ответ написан
    Комментировать
  • Настроить PHPStorm для работы Vue?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Используй vue create для создания проекта, выбирай eslint+prettier и PHPStorm всё сам как надо подтянет.
    Разве что может потребоваться установить опцию vueIndentScriptAndStyle в .eslintrc.js.
    Ответ написан
    3 комментария
  • Почему ругается TypeScript?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Typescript работает только с кодом, он не знает что-там в Vue шаблоне, увы. Потому в $refs у него лежат голые компоненты Vue или Element'ы.
    Я лично вручную указываю через объединение интерфейсов - внизу добавляю перекрывающий:
    @Component
    export default class Login extends Vue { 
      // ...
    }
    export default interface Login {
      $refs: {
         loginForm: any; // на самом деле не any, а интерфейс компонента, поддерживающий нужные методы
      }
    }
    Ответ написан
    8 комментариев
  • Как избавиться от этого эффекта?

    Aetae
    @Aetae
    Тлен
    А зачем вам это делать скриптом? Просто добавьте <style> с нужными правилами.
    Если нужно какое-то условие, то с гарантией только примерно так:
    <script>
      if (true) {
        document.write(`<style>
          html, body {
            background-color:#232323 !important
          }
        </style>`);
      }
    </script>

    В обоих случаях это должно быть в head.
    Ответ написан
    1 комментарий
  • Как подключить ESLint к проекту?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Должно быть очевидно из сообщения об ошибке, нет? Выше в корне проекта у вас лежит ещё один файл .eslintrc, который как-то конфликтует с вашим.
    Ответ написан
    Комментировать
  • Можно ли реализовать кастомный typescript-декоратор для типизации пропсов по аналогии с @Input в Angular?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Я, увы, не до конца понял, что именно вам нужно, но одно могу сказать: IDE умеет работать напрямую только с самим typescript, т.е. если исходя из логики typescript там должен быть тайпчек или там может быть ограниченный набор для подстановки - это будет работать. Если нет - нет. Кастомные трансформы не учитываются.
    Также IDE может расширенно поддерживать популярные расширения и трансформы с помощью (встроенных) плагинов, но для своего уникального кейса, выходящего за стандартные рамки, вам придётся пилить свой плагин.
    Декораторы же - это не магия, это обычные функции + сахарный синтаксис.
    Ответ написан
    Комментировать
  • Почему через некоторое время fetch запрос начинает возвращать ошибку?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    5xx ошибки - ошибки сервера.
    Конкретно 503 - Service Temporarily Unavailable - сервис временно недоступен.
    Сервер шлёт тебя нахрен. Скорее всего там стоит защита от частых повторяющихся запросов. Либо сервер падает, но это маловероятно.
    Можешь попробовать рандомизировать частоту запроса и менять заголовки и юзерагент. Но не фает что поможет.
    Ответ написан
    Комментировать
  • Какие отличия cordova или react native?

    Aetae
    @Aetae
    Тлен
    С cordova ты пишешь обычные веб страницы, в которые прокинут внутренний api.
    С react (и проч.) native ты пишешь в строгих рамках системы и не можешь свободно применять весь набор возможностей современного web'a.
    В первом случае всё работает медленно - пишется быстро.
    Во втором случае пишется (по началу, по крайней мере) медленно - работает (в теории) быстро.

    Что выбирать - ваше дело.
    Ответ написан
    Комментировать
  • Почему websotrm не видит alias из webpack?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Возможно надо ему явно указать на конфиг:
    5ef9c87e6a094647920370.png
    Ответ написан
  • Насколько данный метод обновления сообщений правильный?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Если альтернатив со стороны сервера не предусмотрено(websocket или хотяб олдовый long polling), то только долбиться.
    Ответ написан
    Комментировать