Задать вопрос
Ответы пользователя по тегу Vue.js
  • Vue.js возможно ли без костылей переопределить файл компонента из node_modules?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Если нужда адекватная - дописываете код, делаете PR автору и в следующей версии наслаждетесь.
    Если нужда особая своя - делаете форк и либо публикуете в npm(никаких ограничений на это нет) в своём неймспейсе, либо просто кладёте в проект и линкуете свою локальную версию через link:./path или file:./path.

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

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

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    По mousedown - setTimeout, по mouseup и mouseleave - clearTimeout.
    Какие проблемы?
    Ответ написан
  • Как менять класс 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>
    Ответ написан
    Комментировать
  • Как использовать пропсы внутри script в vuejs?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Т.к. mapGetters отрабатывает на этапе создания компонента, очевидно что без mapGetters, просто ручками.
    computed: {
      getterResult() {
        return this.$store.getters[this.getter]
      }
    }
    Ответ написан
  • Почему не отображается фон в 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/.

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

    Если у вас используется ограниченный набор иконок, то вам придётся в любом случае прописать импорт каждой вручную. Это можно оптимизировать написав собственный генератор, который на этапе сборки(или перед ним) пройдётся по файлам и соберёт использованные иконки и выплюнет их в файл с соответствующими импортами. Но проще импортировать что надо, там где надо.
    Ответ написан
    Комментировать
  • Присвоить класс актив родителю 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>
    Ответ написан
    Комментировать
  • Как сравнивать в v-bind:class?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    :class="{ text: login === item.liked }"
    Ответ написан
  • Возможно ли во .vue компоненте получить name компонента или имя файла компонента в качестве переменной в sass?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Имя файла в принципе можно получить как-то так:
    vue.config.js:
    module.exports = {
      css: {
        loaderOptions: {
          sass: {
            prependData({resourcePath}) {
              const vueFileName = resourcePath.match(/([^\\\/]+).vue$/i);
              if(vueFileName)
                return `$vue-file-name: "${vueFileName[1]}"`
            }
          }
        }
      }
    }
    В каждом Vue компоненте в sass у вас будет теперь переменная $vue-file-name с именем файла.
    Но зачем?
    Ответ написан
    Комментировать
  • Как отследить событие клика по элементу динамически добавленному в DOM?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Ну, во первых, так делать не надо.
    А так два варианта:
    1. Делать так как без всякого Vue - querySelector там, addEventListener... Вы сами отказались от удобства Vue использовав innerHTML.
    2. Повесить @click на playField и смотреть на event.target.
    Ответ написан
    3 комментария
  • Можно ли сделать такой способ импорта компонентов?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Если юзаешь webpack то можно использовать require context.
    Но тут уж никакого treeshaking'a или подсказок IDE.
    Проще написать скрипт который будет тебе эти индексные файлы на лету генерить.
    Ответ написан
    Комментировать
  • Как при изменении зума пересчитывать размеры блока, чтобы он вмещался во viewport устройства?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Мб вам нужна просто meta viewport, а не извращаться?
    Ответ написан
    Комментировать
  • Почему возникает ошибка "Failed to resolve filters" Vue.js?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    А нечего отступы вручную расставлять.
    Вот ваш код в нормальном виде:
    var app = new Vue({
      el: '#vue-app-one',
      data: {
        sitename: 'The Shop',
        string: 'Hello',
        product: {
          id: 1001,
          title: 'Phone',
          description: 'The best one <em>phone</em> ever',
          price: 1000000,
          image: 'This is an image',
        },
        filters: {
          formatPrice: function(price){
            if (!parseInt(price)) {return "";}
            if (price > 9999){
              var priceString = (price /100).toFixed(2);
              var priceArray = priceString.split("").reverse();
              var index = 3;
              while (priceArray.length > index +3){
                priceArray.splice(index+3, 0, ',');
                index +=4;
              }
              return '$' + priceArray.reverse().join('');
            } else{
              return '$' + (price/100).toFixed(2);
            }
          }
        }
      },
    });
    Ничего не замечаете?

    Разгадка
    Фильтры не должны лежать в data, они не данные.
    Ответ написан
    1 комментарий
  • Почему происходит вызов функции много раз при клике?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Наверное потому то на любое изменение состояния компонента обновляются соответствующие этому изменению значения в шаблоне. А если используются функции - они вызваться заново. По возможности не используйте функции внутри шаблонов. Используйте computed свойства.
    Ответ написан
    Комментировать
  • Как в динамической таблице по Enter передавать фокус следующему Input?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Если решение нужно универсальное, то правильным будет следовать той же логике что tab.
    Например использоват tabbable(или любую иную подобную либу) на корневой form, и отталкиваясь от позиции элемента фокусировать следующий.
    Потому что визуально элементы не обязательно следуют в том же порядке, что и в dom, и также не обязательно, что следующим в фокусе должен быть именно следующий по порядку. Для всего этого и придуман tabindex.
    Ответ написан
    Комментировать
  • Почему при обновлении страницы роутер показывает не ту страницу?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Можно предположить, что загрузка контента у вас связанна не с title, который есть в url, а с id, который передаётся скрыто и, само собой, при обновлении страницы ни откуда не появится магическим образом. Обновление страницы - это, по сути, просто новый переход по тому url, который лежит в адресной строке. Если адресная строка не даёт вашим компонентам достаточно информации для понимания, что именно отображать - как они вам отобразят то, что вы хотите?
    У вас где-то должна храниться связь title и id, или запросы вовсе должны идти на сервер по title.
    Вы конечно можете запоминать в куках или каком ещё хранилище конкретную связку title и id для конкретного пользователя, но это сделает ссылки бессмысленными и невозможными к передаче другим.
    Ответ написан
    2 комментария
  • Ionic 4 + capacitor. Как открыть файл?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    А что должно происходить? Файл вы в память загрузили, но ничего больше с ним не делаете.
    Ответ написан
  • Как привязать @click к router-link?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Чисто для информации: @click.native="doSomething".
    Модификатор .native вешает клик на корневой элемент компонента, а не на сам компонент.
    Но с router-link так делать не стоит.
    Ответ написан
    1 комментарий
  • Декодирование pdf base64 для нативной загрузки файла?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Просто читайте документацию.
    Вам нужно убрать параметр encoding и просто передавать не раскодированную base64 строку на вход.
    Ответ написан
    2 комментария