Задать вопрос
  • Как создать простейший пакет npm на typescript для проекта на cordova (ionic)?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Суть какбэ в том, что в npm должен быть javascript. От ts там остаются только декларации. Потому сборка.
    Физически ты можешь сбацать чисто ts пакет (где module и\или main указывают на .ts файл), но проблема тут в том, что у каждого своя версия ts, а также настройки ts-транспилятора и линтера свои, из-за чего у рандомного юзера нихрена не соберёся.
    Если ты делаешь чисто для себя, то такой проблемы не будет. Поначалу. А потом зоопарк обязательно разрастётся и ты всё проклянешь.
    Но в целом, прямо сейчас, тебе ничего не мешает просто сообрать ts файлики в папочку, добавить соответствующий package.json и получить нужный пакет без лишних телодвижений.)

    Простейшая же сборка: tsc -d --outDir ./dist и package.json, смотрящий на результат.
    Ответ написан
    2 комментария
  • Почему пишут const когда можно написать let?

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

    Aetae
    @Aetae
    Тлен
    Печальный вариант: псевдоэлементами рисовать границы или сделать псевдоэлементом белый квадатик в правом верхнем углу каждого блока, а границы как обычно.
    Извращённый вариант: заюзать border-image.
    Ответ написан
    Комментировать
  • Как разбить большой файл angular на много файлов, при этом оставаясь в одном классе?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Для чего-то подобного можно юзать миксины, с помощью какуй-нить либы или напрямую.
    Это не совсем то и костыли, но ничего лучше нет.
    Ответ написан
    Комментировать
  • Как в NUXT на сервере брать данные прямо из базы данных (в противоположность запросу на другой эндпоинт)?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Очевидно что вся суть SSR в том что он работает и на сервере и на клиенте. В принципе можно конкретно для серверной стороны прокинуть туда все серверные же модули, но как ты собрался лезть в ту же базу на клиенте?
    SPA какбэ работает динамически на клиенте, подгружая по ajax только данные, серверная же часть при SSR отрабатывает только при обращении по прямой ссылке.
    Т.е. либо тебе придётся посылать всё гавно из базы для для всех компонентов сразу на клиент при загрузке, либо таки внутри каждого компонента делать дополнительные запросы на сервер за данными, а значит всё равно нужно ajax api к базе.
    Ответ написан
  • Какой ответ хочет получить скрипт?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Он хочет получить ответ со статусом 200 - т.е. любой самый обычный ответ по умолчанию.
    Возможно никакого запроса у вас вообще не происходит, потому что в самом конце нет sr.send( /*some-data*/ )?
    Ответ написан
  • Как на vue реализовать зажатие по элементу?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    По mousedown - setTimeout, по mouseup и mouseleave - clearTimeout.
    Какие проблемы?
    Ответ написан
  • Можно ли форсировать вывод типа для части дженерика?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Нельзя, увы. На github'е много просьб это запилить, но пока(v3.8) надежды не много.
    Если походить там по перекрёстным ссылкам, можно найти разные (некрасивые) workaround для конкретных случаев, но вот прямо как вы хотите - не получится.
    Ответ написан
  • Как менять класс slot внутри компонента?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Можно нагородить кастомный компонент с render-функцией, который будет пересоздавать компоненты лежащие в слоте с нужным классом. Но это весьма некрасиво и опасно.
    Примерно так
    Написано на коленке как PoC и не проверено, наверняка на чём-нить сломается.)
    Vue.component('style-slot', {
      functional: true,
      render(h, {scopedSlots, data}) {
        if (!scopedSlots.default) return;
        const map = ['class','staticClass','style','staticStyle'];
        const elements = scopedSlots.default();
        return elements.map(vNode => {
          if (!vNode.tag) return vNode;
    
          let vData;
          if (vNode.data) {
            vData = Object.assign({}, vNode.data);
            map.forEach((key, i) => {
              const dataKey = map[i - i % 2];
              if(key in data) {
                if(dataKey in vNode.data) {
                  vData[dataKey] = Array.isArray(vData[dataKey])
                    ? vData[dataKey].concat(data[key]) 
                  : [vData[dataKey], data[key]];
                }
                else
                  vData[dataKey] = data[key];
              }
            });
          } else {
            vData = map.reduce((obj, key, i) => {
              if(key in data)
                obj[key] = data[key];
              return obj
            }, {});
          }
          return h(vNode.tag, vData, vNode.children || vNode.text)
        })
      }
    })

    <template>
      <div>
        <style-slot class="sl-sl" style="border:2px">
          <slot/>
        </style-slot>
      </div>
    </template>


    Проще и правильней просто шарить нужный класс как свойство scoped слота и применять вручную:
    <template>
      <div>
        <slot className="slot-class"/>
      </div>
    </template>
    <template>
      <component-a v-slot="{className}">
        <p :class="['p-class', className]">text</p>
      </component-a>
    </template>
    Ответ написан
    Комментировать
  • Хочу создать свою function confirm, это правельно?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Обращаться то будут к твоей, но если ты не запихнёшь внутрь настоящий confirm(или там alert\prompt), то останавливать исполнение, как оригинал, она не будет. И повторить такое поведения не меняя способа вызова - принципиально невозможно. А значит если где-то что-то зависит от ожидания ответа - всё сломается.
    Ответ написан
    Комментировать
  • Как использовать пропсы внутри script в vuejs?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Т.к. mapGetters отрабатывает на этапе создания компонента, очевидно что без mapGetters, просто ручками.
    computed: {
      getterResult() {
        return this.$store.getters[this.getter]
      }
    }
    Ответ написан
  • Как типизировать этот объект?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Как есть, так и типизируй.

    Как минимум:
    state.books.filter((book: { id: string }) => book.id !== id)
    А лучше:
    interface Book {
      id: string;
      // ...
    }
    state.books.filter((book: Book) => book.id !== id)
    А ещё лучше:
    interface Book {
      id: string;
      // ...
    }
    interface State {
      books: Book[];
      // ...
    }
    const state: State = ...
    
    state.books.filter(book => book.id !== id)
    Ответ написан
    Комментировать
  • Почему не отображается фон в VUE вставленный через Style в сам код?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Потому что на этапе исполнения пути @/assets/images/image.jpeg не существует. Это не волшебство. На этапе компиляции vue-compiler проходится по известному списку атрибутов, а postcss по стилям и заменяют такие пути на результаты loader'a(по умолчанию: data-uri для мелких файлов и внутренние пути относительно spa для остальных). Простые произвольные строки(которой и является `url(@/assets/images/image.jpeg) no-repeat center`) само собой анализу и замене не подвергаются.
    Надо явно получить результат loader'a(через require('путь')) и использовать его где нужно.

    Условно так:
    :style="`background: url(${require('@/assets/images/image.jpeg')}) no-repeat center`"
    Ответ написан
    1 комментарий
  • Динамический импорт подключает все файлы из папки?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Т.к. webpack при сборке никак не может знать, что у вас окажется в this.name, а проект должен работать в любых условиях, то для работы import(`mdi-vue/${this.name}`) собирается вообще всё, что лежит в папке mdi-vue/.

    Вы не может создать компонент "который будет подключать иконки за вас", потому чтобы иконка была подключена, она должна иметься в наличии. Чтобы она имелась в наличии на этапе исполнения, она должна быть собрана на этапе компиляции. Учитывая что заранее (из кода) неизвестно какая именно иконка вам понадобится на этапе исполнения, собраны на этапе компиляции вынуждены быть все иконки что есть.

    Если у вас используется ограниченный набор иконок, то вам придётся в любом случае прописать импорт каждой вручную. Это можно оптимизировать написав собственный генератор, который на этапе сборки(или перед ним) пройдётся по файлам и соберёт использованные иконки и выплюнет их в файл с соответствующими импортами. Но проще импортировать что надо, там где надо.
    Ответ написан
    Комментировать
  • Как вывести на страницу объект из localStorage, не зная key?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    C localStorage можно работать как с обычным объектом.
    for(let [key, value] of Object.entries(localStorage)) {
      console.log(key, value)
    }
    Ответ написан
    Комментировать
  • Как задать переменные в scss?

    Aetae
    @Aetae
    Тлен
    Не путайте тёплое с мягким. Переменные --some и, соотетветственно, var(--some) - это пременные css, sass тут не при чём. Они работают в рантайме и в рамках css модели.
    Переменные sass начинаются на $ и работают на этапе компиляции. В итоговом css вместо них просто подставляются их значения.
    В css поменять значение переменных для элемента с атрибутом data-theme="dark" и всех его детей в рамках dom можно так:
    [data-theme="dark"] {
      --some: some;
    }

    В sass поменять значение переменных для элемента с атрибутом data-theme="dark" и всех его детей в рамках конкретной sass-иерархии в конкретном файле можно так:
    [data-theme="dark"]
      $some: some
    Ответ написан
  • Присвоить класс актив родителю router link vue.js?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Или просто сделать так:
    <ul class="nav flex-column nav-pills side-nav" id="v-pills-tab" role="tablist" aria-orientation="vertical">
      <router-link tag="li" class="list-group-item" active-class="activ" to="/nutrition/foodmenu">Перспективное меню</router-link>
      <router-link tag="li" class="list-group-item" active-class="activ" to="/nutrition/journal">Журнал питания</router-link>
      <router-link tag="li" class="list-group-item" active-class="activ" to="/nutrition/ambarbook">Амбарная книга</router-link>
    </ul>
    Ответ написан
    Комментировать
  • Как перестать загрязнять код импортом интерфейсов?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Можно просто положить где-то(во включённой в tsconfig.json) директории какой-нить global.d.ts и просто накидать туда часто используемых интерфейсов. )
    Но, конечно, если интерфейсы связанны с какими-то модулями, правильно и хранить их в соответствующих модулях. Всё равно же используя модуль, вы оный импортируете, добавка к импорту ещё и интерфейса погоды не делает.
    Ответ написан
    Комментировать
  • Как сравнивать в v-bind:class?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    :class="{ text: login === item.liked }"
    Ответ написан