Задать вопрос
  • Каков наилучший способ v-bind для :hover :active и тд, и можно ли вообще так сделать?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Вопрос по большому счёту не относится к vue.

    Решения:
    1. Использовать класс-модификатор, который порасит как надо.
    <template>
      <input class="hover--red"/>
    </template>
    
    <style>
    .hover--red:hover {
      color: #f00
    }
    </style>

    2. Использовать css (не путать с scss) переменные.
    <script setup>
    // ...
    const hoverColor = '#f00'
    </script>
    
    <template>
      <input :style="{'--hover-color': hoverColor}"/>
    </template>
    
    <style>
    input:hover {
      color: var(--hover-color)
    }
    </style>


    ...upd: совсем забыл про такую фичу vue:
    3. Если стили лежат в sfc можно использовать переменные через v-bind в <style>:
    <script setup>
    // ...
    const hoverColor = '#f00'
    </script>
    
    <template>
      <input />
    </template>
    
    <style>
    input:hover {
      color: v-bind(hoverColor)
    }
    </style>

    А забыл я про неё потому, что категорически против такого смешения кода и стилей. Но я не могу вам запретить.:)
    Ответ написан
    1 комментарий
  • Как использовать withDefaults с вложенными обьектами (typescript)?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Значения по умолчанию для этого не предназначены.
    Сделай computed значение в которым смежри входящее с дефалтным как тебе нвдо.
    Ответ написан
    Комментировать
  • Как убрать "Property does not exist on type" в рекурсивном интерфейсе?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    На каждом уровне проверять, что значение не string и не number. Иначе никак, ты сам задал такой тип, и ts не даст тебе совершить ошибку.

    Если у тебя только 2 уровня, то не надо рекурсии:
    interface CSS {
        [k: string]: {
            [k: string]: string | number 
        }
    }


    Если ты хочешь сузить тип при создании констатны, можно сделать так:
    const css = {
        default: {
            color: '#676767',
            border: '1px solid',
            border_color: '#C4C4C4',
            border_radius: '110px',
    
            padding: '16px 21px',
        }
    } satisfies CSS;
    Ответ написан
    Комментировать
  • Как сделать так, чтобы input был по центру?

    Aetae
    @Aetae
    Тлен
    Еслиб буковка была не цветной - можно было бы какой-нить inputmask посоветовать. Оно бы из коробки всё работало.
    Подозреваю, что где-то на просторах есть библиотека и для цветной буковки, но в целом алгоритм такой:
    Делаешь input с text-align: center и text-indent: -<размер буковки/2>.
    Скриптом к нему абсолютно цепляешь div с pointer-events:none и копией стилей input, в котором прозрачный span с дублируемым введённым текстом(input.oninput) + span с раскрашенной буковкой.
    Также следишь, чтоб input всегда был шире текста.
    Ответ написан
    Комментировать
  • Как установить cpu-features?

    Aetae
    @Aetae
    Тлен
    Проблема со сбором бинарников(не-js) под твою ноду+систему. Есть два решения: простое и сложное.
    Простое: откатывайся на предыдущую lts версию ноды, пока оно не установится(под lts версии и типичные системы обычно есть готовые сборки - до той версии до которой у пакета была поддержка).
    Сложный: установить глобально windows-build-tools и надеяться что сборка сработает. Если нет - долго и мучительно гуглить темы по сборке под винду.
    ...upd: посмотрел сейчас - wbt deprecated, теперь считается, что достаточно тулз ставится с самой нодой, т.е. тебе надо переустановить node в процессе проставив галочку "Automatically install the necessary tools". А дальше всё также молиться что оно соберётся.
    Ответ написан
    Комментировать
  • Как исправить конфликт слияния?

    Aetae
    @Aetae
    Тлен
    Ну английским же языком написано, что пакет охренел и зачем-то хочет версию ноды >=20(не 18.20, а 20). Либо обновляйте ноду в пайплане, с риском что отвалится куча иного, либо делайте даунгрейд vue3-toastify, либо форк vue3-toastify, либо пропишите --ignore-engines (или типо того) параметр к install(с риском багов).

    Конкретно для работы vue3-toastify 20ая нода нафиг не нужна, просто автор хипстер, использующий pnpm последних версий.
    Ответ написан
  • Для чего refresh токен нужен?

    Aetae
    @Aetae
    Тлен
    Это настройка конкретного сервера. Обычно рефреш живёт дольше основного токена, но ничто не мешает ставить рандомные времена истечения.

    Почему вообще нужны два токена, а не один? [Много техического бла-бла-бла, которое сможешь сам нагуглить], подытоживая: потому что второй - костыль для первого и такая технология завоевала популярность.
    Ответ написан
  • Почему ответ post запроса в консоли браузера содержит больше информации?

    Aetae
    @Aetae
    Тлен
    Ответ очевиден. То что ты видишь через вкладку сеть и через пуфон - это то, что на самом деле отдаёт сервер.
    То что ты видишь в консоли - это обогащённые скриптом данные. Либо неявно - в самой функции, которая отвечает за запрос данных, либо где-то потом в коде самого приложения. Объекты которые ты логируешь в консоле хранятся как и во всём js - по ссылке, т.е. разворачивая объект ты видишь данные в нём а момент разворота, а не на момент логирования.
    Ответ написан
    Комментировать
  • Почему не отображается картинка в SVG на GitHub?

    Aetae
    @Aetae
    Тлен
    Оно подключается как <img>, а внутри img многие фишки svg не работают, в т.ч., видимо, и отдельно подгружаемая image. Если очень хочется - впихни картинку как data uri прям в svg.
    P.S. Анимации тоже работать не будут.
    Ответ написан
    2 комментария
  • Почему не работают алиасы?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    paths в tsconfig - это чисто справочная информация для подсветки, добавленная из расчёта, что вы уже используете какой-то сборщик который такие пути умеет.
    Сам по себе он влияет точно и исключительно на подсветку, нужны сторонние сборщики и\или модули.
    Это by design и wont fix.

    Предполагаемое разработчиками решение: взять какой-ниь vite или webpack и настроить там руками точно такие же алиасы.
    Популярный костыль, который сделает это за тебя для любых вариантов, в том числе и ts-node: tsconfig-paths
    Ответ написан
    Комментировать
  • Как с помощью JS организовать запись и чтение данных?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    GM_setValue GM_getValue - будут храниться в сторе самого расширения.

    Всякие куки, localStorage, indexedDb - всё может почитститься самом сайтом или случайно тобой.

    Надёжнее - только свой сервак завести и к нему запросами отправлять-получать.:)
    Ответ написан
    Комментировать
  • Как для возвращаемого типа функции задать типы входных параметров Function[]?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Как-то так, если по красоте:
    type Returns<T extends readonly Function[]> = {
      -readonly [K in keyof T]: T[K] extends (...args: any[]) => PromiseLike<infer R> ? R : never;
    };
    
    type Arguments<T extends readonly Function[]> = {
      [K in keyof T]?: T[K] extends (args: infer R, ...a: any[]) => any ? R : never;
    };
    
    function fetchAll<T extends readonly Function[]>(functions: readonly [...T], data?: Arguments<T>): Promise<Returns<T>> {
      return Promise.all(
        functions.map((func, index) => func(data?.[index]))
      ) as Promise<Returns<T>>;
    }
    
    const x = fetchAll([
      (a:66) => Promise.resolve(42),
      (f:string) => Promise.resolve('hello'),
      () => Promise.resolve(true),
    ], [66, '1ff']);


    Если надо отельный массив, то придётся его руками const:
    const arr = [
      (a:66) => Promise.resolve(42),
      (f:string) => Promise.resolve('hello'),
      () => Promise.resolve(true),
    ] as const;
    
    const x = fetchAll(arr, [66, '1ff']);
    Ответ написан
    4 комментария
  • Перед тем как изучить Vue 3, стоит ли изучать Vue 2?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Изучать vue 2 стоит только если проект на нём. К сожалёнию vue 3 его уже убил.

    Однако мне есть, что вам посоветовать, с чем встречаются все новички: в vue 3 есть composition api и есть options api. И они работают вместе. НО. Их не надо использовать вместе. Никогда. Если есть setup - не должно быть, например, methods и наоборот. Это вопрос чистоты кода и мышления в одной парадигме.
    Если у вас что-то не получается в одном варианте, что кажется можно легко решить в другом - это говорит только о том, что у вас проблемы с пониманием, и лучше будет задать вопрос тут, чем разводить говнокод.
    Ответ написан
    Комментировать
  • Почему не собирается проект из за PrismaAdapter?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Ошибка возникает не у тебя, а в стороннем коде модуля next-auth.
    Заигнорить это можно указав skipLibCheck в tsconfig.
    Однако лучше, по возможности, разобраться: причиной может быть что ты используешь слишком старую версию typecript, или старую версию модуля, или случайно подключаешь несколько версий модуля одновременно, или ещё много куда менее вероятных вариантов.
    Ответ написан
  • Как добиться видимости переменной JavaScript в событии тега button?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Именно в таком виде код в обычном html будет работать прекрасно. Ищи проблему в ином месте.
    // поставил true чтоб собственно вызов происходил.
    Ответ написан
    Комментировать
  • Почему не получается задать либо один тип либо другой в typescript?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    В action ты кладёшь функцию onClick с сигнатурой (item: LinkItem) => void, а требуется (data: MobileMegaMenuItem | LinkItem) => void, , т.е. функция которая умеет работать и с тем и с тем. Подразумевается что onClick как раз не умеет и может привести к ошибке, потому и не даёт.

    Используй дженерик чтобы вывести конкретный тип:
    export const useOpenMenuByHash = <Data extends MobileMegaMenuItem | LinkItem>(
        data: Data[],
        action: (data: Data) => void,
        actionRoom?: () => void
    ) => {
      //...
    };
    
    useOpenMenuByHash(data, onClick); // ok

    Ну или кастуй руками:
    useOpenMenuByHash(data, onClick as (d: LinkItem | MobileMegaMenuItem) => void);
    Ответ написан
    4 комментария
  • Почему возникает ошибка при использовании переменной окружения в конфиге webpack?

    Aetae
    @Aetae
    Тлен
    Потестил.
    1. Проблема с conslole.log у тебя в русской "c", о чём намекает даже подсветка тут.
    2. npm run съедает параметр --env, т.к. считает его своим, чтоб передавать аргументы в скрипт надо использовать разделитель --: npm run build -- --env mode=development.
    Ну или выкинуть убогий npm и использвать yarn\pnpm, где такой ереси нет.:)
    Ответ написан
  • Хочу сделать таблицу на vue3 которая не будет однофайловым компонентом, какой запрос вводить чтобы найти статью описывающую как это сделать?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Цитата из официальной документации:
    If you prefer a plain HTML setup without any build steps, you can use this JSFiddle as your starting point.


    Вот открывать тот филдл:
    код оттуда на всякий случай
    <script type="importmap">
      {
        "imports": {
          "vue": "https://unpkg.com/vue@3/dist/vue.esm-browser.js"
        }
      }
    </script>
    
    <div id="app">{{ message }}</div>
    
    <script type="module">
      import { createApp } from 'vue'
    
      createApp({
        data() {
          return {
            message: 'Hello Vue!'
          }
        }
      }).mount('#app')
    </script>

    И делаешь также у себя.
    А дальше все статьи для однофайловых компонентов подойдут и тебе. Ну и плюс немного знания js для импорта и использования библиотек.

    Единственное, что следует помнить, это то что ты пишешь в html, а потому если в статье кто-то использует компоненты так:
    <SomeComponent :someProp=""val"/>
    то тебе надо ручками сделать так:
    <some-component :some-prop=""val"></some-component>
    Почему? Птому что 1 - html регистронезависимый и SomeComponent читается как somecomponent, а vue такого не знает, 2 - список тэгов которые могут самозакрываться ограничен.
    Ответ написан
    Комментировать
  • Не могу адекватно интегрировать шрифты Nuxt3?

    Aetae
    @Aetae
    Тлен
    Шрифты всегда и везде мерцают если не в кэше. Единственный способ надёжно избежать этого - ничего не показывать пока шрифт не загрузится - т.е. отображать лоадер или ещё что. "Не надёжно" это можно сделать просто поигравшись со свойством font-display.
    Наверняка же дождаться загрузки помогут соответствующие библиотеки, например webfontloader или напрямую Font Loading API.

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

    К сожалению из-за cache partitioning в современных браузерах использование всяких cdn для шрифтов, делу никак не поможет, т.к. для каждого сайта всё равно своё кэш.
    Ответ написан
    Комментировать
  • Как красиво использовать динамически подгружаемый API?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Вот те простой хэлпер для ленивой загрузки одной функции:
    function lazyAsync(lib) {
      let promise;
      return async function (...args) {
        promise ??= lib();
    
        return (await promise).call(this, ...args);
      };
    }
    
    const doSomething = lazyAsync(async () => {
      // тут загружаем
      const doSomething = await loadLib('doSomething');
    
      // тут что-то делаем с загруженным
    
      // тут возвращаем конечную функцию
      return data => {
        // тут делаем с аргументами
        return doSomething.process(imgData);
      };
    });
    
    // если сразу загружается нужная функция - можно не усложнять
    const doSomething = lazyAsync(loadDoSomethingProcess);
    
    await doSomething(1);
    await doSomething(2);
    await doSomething(3);
    Ответ написан
    Комментировать