Ответы пользователя по тегу Vue.js
  • Как передать $ref из дочернего компонента в родительский?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Правильный ответ: не надо этого делать. Каждый компонент - чёрный ящик. Ты не знаешь что там внутри и какие там рефы наблюдая из родителя. В этом суть компонентного подхода - в любой момент можно без проблем кардинально менять содержимое компонента, не меня его свойства.

    Плохой ответ: самым очевидным образом: получить ref на ребёнка и в свою очередь забрать ref у него: this.$refs.child.$refs.childOfChild.
    Возможно придётся также дождаться загрузки ребёнка, если он лежит в scoped слоте.
    Ответ написан
  • Сборка проекта под разные сайты?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Если разные версии одних и тех же компонентов(различающихся только внутри но имеющих идентичный интерфейс), то можно просто использовать алиасы, типа:
    alias: { 
      '@component-1': {
        'site1': path.resolve(__dirname, './site1/component-1.vue'),
        'site2': path.resolve(__dirname, './site2/component-1.vue'),
      }[process.env.TARGET]
    }
    import Component1 from '@component-1';
    Это если не билдить лишнего. А так, если размер не критичен, можно просто использовать конфиг-файл и <component :is="var"/>.
    Ответ написан
    2 комментария
  • Как в миксине создать функцию под вид класса?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Михаил всё правильно сказал. Чтоб вызывать функции из MixinName через точку, MixinName, очевидно, должен быть объектом. А объекты у нас кладутся в data, а не в methods.
    Ответ написан
    Комментировать
  • Можно ли привязать блоки/компоненты к массиву/объекту?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    list2 никак не связан с item в отличие от testList. В list2 у вас должны лежать не цифры а объекты с данными, по которым будет строиться соответствующий item, сами же item'ы должны быть перечислены через v-for, чтобы когда list2 менялся - менялся и их порядок.
    То что вы хотите сделать - возможно,через render-функцию и $children, но эта библиотека так не умеет. Да и не нужно это на самом деле.
    Ответ написан
  • Ошибка "Cannot read property 'getContext' of undefined". Что это может быть?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    У вас в вотчере стоит immediate: true, и, так как он задан на самом компоненте, вызван он будет сразу перед хуком created, когда vue-компонент уже создан но ещё не примонтирован. Соответственен никакого canvas на странице в этот момент нет.
    Самое простое решение - добавлять вотчер не сразу, а в хуке mounted через this.$watch.
    Ответ написан
    Комментировать
  • Как строго валидировать параметры во vue роутинге?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Во-первых: вообще непонятно как по вашему должна выглядеть "строгая" валидация. Крашить приложение?
    Во-вторых: эта валидация в компоненте, а не в роутинге.
    В-третьих: любой входной параметр маршрута - по определению строка, т.к. является частью строки - url.

    В итоге: props в свойствах маршрута может быть функцией. В эту функцию вы можете добавить как свой валидатор, так и приведение типов.
    Ответ написан
    Комментировать
  • Как сделать отдельный js файл на томже уровне что и dist?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Если юзается vue-cli - то в проекте есть папочка public, кладите туда.
    Если чистый webpack - то нужен copy webpack plugin.
    Ответ написан
    Комментировать
  • Можно ли внутри шаблона увеличить переменную в data?

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

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Ответ написан
    Комментировать
  • Как использовать снипетты в vue.js?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Чувак, это называется циклы.
    Ответ написан
    Комментировать
  • Как получить корректный результат при рендеринге компонента?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Ну, всё нормально, компонент никого не ждёт и монтируется себе синхронно. Когда запрос отработает тогда значение и будет. Поскольку это геттер - то vue всё обновит когда надо. Просто показывайте какой-нить спиннер пока currentTourGetter пуст.
    Ответ написан
    Комментировать
  • Как получить елемент внутри v-bind?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Начнём с того, что вы не должны лезть внутрь компонента-ребёнка из компонента-родителя. Никогда. Компонент-ребёнок - это чёрный ящик. Вы не знаете есть ли в нём вообще firstChild и что там у него со scrollHeight. Не знаете, говорю, даже если сами тот компонент написали. Это основа компонентного подхода: содержимое любого компонента может быть полностью переписано без влияния на зависимые от него родительские компоненты. Любое управление осуществляется через props, события (и, в особых случаях, докуметированные публичные методы и свойства, получаемые через ref).

    В данном случае вам нужно для ребёнка сделать компонент-обёртку(или поправить его самого), либо добавив свойство вроде set-height-by-child, которое и будет управлять данным поведением, либо, если нужна работа с этой высотой снаружи, посылать из него событие вроде @emit('scroll-height-changed', scrollHeight) при mounted, при изменении размера экрана и прочих возможных случаях.
    Ответ написан
    Комментировать
  • Как вставить в DOM динамический компонент Vue, находящийся в полученном по xhr html?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Правильный ответ: не грузить html с сервера. Серьёзно, это противоречит самой идее SPA. С сервера должны пилетать данные, хотя-бы как-то так:
    { 
      infoBlock: [{
        type: 'text',
        value: '...'
      },{
        type: 'component',
        value: 'review'
      },{
        type: 'text',
        value: '...'
      }]
    }
    а уже SPA разложит это всё на готовую разметку.

    Вредный ответ: Vue.compile().
    Ответ написан
    Комментировать
  • Как создать v-on: события?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Что вы пристали к этим директивам. Директивы - нишевая фича, нужная в специфических общих случаях. Если вы пишите директиву для одного компонента - вы делаете что-то не так(99%).

    Так вот @transitionend="mymethod" должно работать само по себе, без лишних телодвижений. В крайнем случае @transitionend.native="mymethod" если цель - другой компонент.
    Ответ написан
    2 комментария
  • Дата выводиться на ios NaN, а на остальных девайсах корректно. Почему и как справить?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    В this.getCurrentDateRange.start лежит дата в формате непонятном IOS. Задавате конкретный формат явно:
    currentDate() {
      return moment(this.getCurrentDateRange.start, "YYYYMMDD(или какой там формат)").format('YYYY-MM-DD')
    },


    P.S. Да, даты на разных платформах И в разных браузерах работают по разному. Работать с ними надо исключительно явно, никогда не полагаясь на автоматическую угадайку. Даже если сейчас вдруг работает везде, не факт что внезапно не сломают.
    Ответ написан
    5 комментариев
  • Vue.js как работать с изображениями в assets?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Предполагается что html особо не динамичен. По сути вся фишка в обаботки динамических импортов файлов зависит от соответствующих webpack loader'ов. SCSS loader для каждого url вида ~@path вызывает(условно) require(path) и делает соответствующую магию(обычно это для мелких файлов: url-loader, который инлайнит файл как data: URI, для крупных: file-loader, который копирует файлы в соответствующую расширению папочку и добавляет к имени хэш). HTMLWebpackLoader не трогает подключаемые ресурсы, в т.ч. картинки. Просто юзайте картинки в том же scss, а внутри html назначайте соответствующее классы. Или кладите нужны для html картинки сразу в public, да.
    Ответ написан
    Комментировать
  • Как решить этот warning в render()?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    5 комментариев
  • Как исправить пустую страницу в npm run build?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    // vue.config.js
    module.exports = {
      publicPath: './'
    }
    Ответ написан
    Комментировать
  • Как использовать компоненты в data?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    v-html - только для обычного html. И то использовать надо только когда без него совсем никак.
    Vue работает с данными, а не разметкой, разметка строится сама на основе данных.
    В твоём случае в самом шаблоне должно быть:
    ...
    <component :is="value">{{name}}</component>
    ...

    А в data, соотвтественно:
    ...
    {
      id: 2,
      name: this.$t("Email"),
      value: `LinkElement`
    }
    ...
    Ответ написан
    Комментировать
  • Как рендерить vue-компонент?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    И всё же правильный ответ - передавать данные, рисовать на их основе. Передача разметки - это очень плохо.
    Но если очень хочется: Vue.compile().
    Ответ написан
    Комментировать