• Забрать данные из дочернего компонента при вызове родительского метода?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Ну во-первых по-хорошему такого быть не должно.
    Компоненты общаются через пропсы и события: сверху пропсы, снизу события.
    Изменились данные в компоненте 1? Он послал событие update, а родитель его поймал и что-то сделал.

    Если же это какая-то многокомпонентная структура, где дочерние компоненты всегда должны быть в родительском, то родительский делает provide, дети делают inject и таким образом держат общий набор данных\методов.

    Ну и через ref тоже можно, но тут следует продумать архитектуру с публичными и внутренними методами, чтоб поддержка не превратилась в ад.
    Ответ написан
    Комментировать
  • Почему на сервер приходят не корректные(устаревшие) данные?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Вы думали написали слово async и оно само внезапно стало асинхронным? Ничего подобного. У вас всё разлетается на кучу параллельно исполняемых функций, и никто никого не ждёт. Изучайте асинхронность в javascript или используйте синхронные функции(с постфиксом Sync).
    Ответ написан
    Комментировать
  • Как следить за изменением значения PHPSESSID (Vue, axios)?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Ну можно поставить параметр withCredentials: true и читать cookie заголовок. Но это сделает каждый запрос более жирным. По-хорошему сессия не должна протухать пока идут запросы.
    Ответ написан
    Комментировать
  • Почему не происходит перендеринг?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Включи предупреждения в консоли. Ты пытаешься изменять массив напрямую в store, чего делать нельзя.
    const arr = this.$store.getters.templatesList.slice(0);

    Ну и для сортировки есть встроенный метод sort:
    arr.sort(({created_at:a}, {created_at:b}) => a < b ? -1 : a > b ? 1 : 0);
    Ответ написан
    1 комментарий
  • Как не пропускать css клас в комит?

    Aetae
    @Aetae
    Тлен
    Дёшево и сердито: пре-коммит хук, который простым grep-ом ищет это имя класса и не даёт коммитить если находит.)
    Ответ написан
    Комментировать
  • Как в Vue.js запустить скрипт, после загрузки изображения или видео?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Также как и без Vue - дождаться загрузки: <img @load="doSomething" />
    Ответ написан
    Комментировать
  • Реален ли такой дженерик в TypeScript?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Вот так с указанием на аргументы:
    function wrapper<T extends { start(...args: unknown[]): unknown }>(target: { new(): T }, ...args: Parameters<T['start']>): T {
      let instance = new target();
      instance.start(...args);
      return instance;
    }
    
    
    class RandomClass {
      start(arg1: string, arg2: number) { /* ... */ }
    }
    let instance = wrapper(RandomClass, 'Hello, world!', 777); /// все ок
    let instance2 = wrapper(RandomClass, 777); /// ошибка
    Ответ написан
    Комментировать
  • TSlinter ругается на символ?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Если не знаете английского языка - выкиньте линтер. Какая вам польза от того, что он вам пишет "какие-то" сообщения, которые вы не способны прочитать?
    Ответ написан
    Комментировать
  • Как заставить MutationObserver адекватно срабатывать?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Именно из-за таких как ты отказались от удобного слушателя событий изменения элементов, и придумали наблюдатель.
    Разница? Наблюдатель наблюдает и изредка, когда это не повлияет на скорость работы страницы, сбрасывает весь список изменений. В отличии от слушателя, который слушает каждое событие изменения.

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

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Потому что объекты в javascript присваиваются по ссылке. Это основы основ.
    Делай так:
    Employee.prototype = Object.create(User.prototype);
    Ответ написан
    2 комментария
  • Почему глючит копирование в буфер обмена?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Вот так работает:
    Почему не работал до этого, без очистки? А хз, какие-то внутренние особенности хрома.
    Ответ написан
    2 комментария
  • Как использовать macbook в качестве монитора?

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

    Советую воспользоваться софтом для шаринга/стриминга экрана: Nvidia Experience/ShadowPlay или чго по-проще.
    Ответ написан
    Комментировать
  • Как отследить изменение input.value, если его меняет другая функция?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Правильный ответ: писать код предусматривающий подобные вещи через абстракции. Тебе не надо триггерить события, ты должен при установке значения напрямую вызывать нужные функции. Ты сам знаешь что у тебя в коде происходит и какие функции привязаны к событиям, тебе не нужно ждать событий от браузера.
    Полезный ответ: использовать любую библиотеку умеющую в data binding, которая будет заботится о таких вещах за тебя. Мне лично нравится Vue, но есть и множество решений по-проще и по-традиционней.
    Плохой ответ: ты можешь добиться этого примерно таким извращением, подменив стандартный сеттер на value:
    const valueDescriptor = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value');
    Object.defineProperty(two, 'value', {
      ...valueDescriptor, 
      set(value) {
        valueDescriptor.set.call(this, value);  
        this.dispatchEvent(new Event('input', {
          bubbles: true,
          cancelable: true,
        }));
      } 
    })
    Ответ написан
    Комментировать
  • Как делать комментарии в коде только для себя?

    Aetae
    @Aetae
    Тлен
    Если впоследствии тебе самому эти комменты не нужны, то просто заводишь свой git hook (написанный тобой же на удобном тебе языке), который перед отправкой будет затирать в файлах твои особые комменты(напр по какой-то метке).
    Если нужны, то вроде были плагины для разных ide позволяющие писать комменты к файлу(не в коде), погугли для своей.
    Удалять комменты перед отправкой и вставлять обратно в код - не вариант, знатный геморрой возникнет с мержами и разрешением конфликтов.

    P.S. Вообще просто пиши комменты аккуратно и заливай их вместе с кодом. Документирующие комменты вовсе не лишние.)
    Ответ написан
  • Почему BeautifulSoup неправильно парсит страницу?

    Aetae
    @Aetae
    Тлен
    Проблема, очевидно, в лишнем </span> и, соответственно, невалидном html.
    Почему ему так плохеет от банальной, вроде бы, ошибки - другой вопрос. Скорее всего ты используешь слишком строгий парсер. Смени на более толерантный(но учти, что он будет тем медленнее чем толерантнее).
    Ответ написан
    Комментировать
  • Почему при копировании в буфер обмена берутся лишние отступы?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Во-первых: такая хрень происходит только в хроме, достали со своей монополией.
    Происходит это потому, что умный хром считает, что после параграфа должен быть отступ, даже если параграф всего один.
    Решение - заменить p на span или выбирать не сам тег, а его содержимое: selectNode -> selectNodeContents.
    Ответ написан
    1 комментарий
  • Как типизировать массив ключей интерфейса?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Тут есть несколько решений.
    Например:
    type TupleUnion<U extends string, R extends string[] = []> = {
    	[S in U]: Exclude<U, S> extends never ? [...R, S] : TupleUnion<Exclude<U, S>, [...R, S]>;
    }[U] & string[];
    
    interface Interface {
      foo: boolean;
      bar: string;
      baz: object
    }
    
    type Keys = TupleUnion<keyof Interface>; 
    
    let keys: Keys;
    
    keys = ['foo', 'bar', 'baz']; // OK все ключи указаны
    keys = ['foo']; // NOT OK указаны не все ключи
    keys = ['foo', 'bar', 'another bar']; // NOT OK один из ключей не совпадает

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

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Если это реализовано именно так, то и работать оно должно как вам хочется.
    Ответ написан
  • Как бы не рендерить слот, пока он не нужен?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    <foldet-block
      v-bind:anchor="'показать'"
    v-bind:anchor_show="'скрыть'"
      ><template v-slot><p>{{text}}</p></template></foldet-block>

    Суть трюка в том что v-slot превращает слот в scoped, а scoped слот ждёт для ренедера входных данных от родителя.
    P.S. В случае если в слот идёт только один компонент(и это компонент, а не нативный тег) можно опустить template и ставить v-slot прям на сам компонент.
    Ответ написан
  • Какие преимущества отдельного фронтенд от серверного рендеринга страниц?

    Aetae
    @Aetae
    Тлен
    Скорость и интерактивность, очевидно.
    А вынос фронта отдельно - прямое следствие усложнения интерфейсов. Даже если ты пишешь на серверном шаблонизаторе и плюёшь в юзера голым html тебе всё равно придётся отделять слой бизнес логики от слоя отображения.
    Ответ написан
    Комментировать