Задать вопрос

Несколько шаблонов для одного компонента Vue.js, реализация?

Есть компоненты, который принимает в себя несколько объектов пропсом. Есть HTML файлы (30+ штук), которые содержат различную компоновку для данных.
При такой реализации дает ошибку
Cannot find module './undefined.html'
- переменной не существует при инициализации шаблона
export default {
  props: {
    id: Number,
    tmplLink: String
  },
  template: require(`./${this.tmplLink}.html`)
};


Есть ли возможность передать в этот компонент имя шаблона так, чтобы при инициализации переменная существовала.

Также, найдена была статья по сабжу, листинг кода статьи ниже. Задача поднимается аналогичная, но автор использует VUE файлы. При попытке выполнить его код, получаю ошибку, что loader не функция.
<template>
    <component :is="component" :data="data" v-if="component" />
</template>
<script>
export default {
    name: 'dynamic-link',
    props: ['data', 'type'],
    data() {
        return {
            component: null,
        }
    },
    computed: {
        loader() {
            if (!this.type) {
                return null
            }
            return () => import(`templates/${this.type}`)
        },
    },
    mounted() {
        this.loader()
            .then(() => {
                this.component = () => this.loader()
            })
            .catch(() => {
                this.component = () => import('templates/default')
            })
    },
}
</script>


UPD#1

loader() был сразу изменен на
loader() {
      return () => import(`./templates/${this.tmplLink}`);
    }

Ошибку получал следующую:
Failed to resolve async component: function () {
return __webpack_require__.e(/*! import() */ 0).then(__webpack_require__.bind(null, /*! ./templates/default */ "./resources/js/makets/templates/default/index.vue"));
}
Reason: TypeError: Cannot read property 'call' of undefined


Решение из статьи меня не очень прельщает, т.к. есть необходимость в разных шаблонах, а не во всем компоненте со своей логикой.

Быть может есть варианты решения по этим двум проблемам?
  • Вопрос задан
  • 1113 просмотров
Подписаться 2 Средний 11 комментариев
Пригласить эксперта
Ответы на вопрос 3
kulakoff
@kulakoff Куратор тега Vue.js
Vue.js developing
Ошибку получаете скорее всего из-за этого условия:
if (!this.type) {
  return null
}

Т.е. при вызове this.loader у вас null там.
Ответ написан
evgensenin
@evgensenin
Yii2 || Laravel, vue & nuxt
Для этого случая используйте рендер-функции, просто идеально подходит.
Ответ написан
Можно попробовать вот так (см код ниже). По сути это решение Philipp Kühn, но для вашего случая, когда в файлах хранятся шаблоны, а не компоненты. Чтобы заработало, нужно настроить загрузчик для html файлов (raw-loader отлично подойдёт) и включить компилятор в сборку (вариант "полный").

В теории это можно оптимизировать до функционального компонента, но на практике почему-то не работает. Может быть, у меня руки кривые)

export default {
  props: {
    name: {
      type: String,
      default: 'default'
    }
  },
  computed: {
    component () {
      // Не сокращать до одной строки, иначе свойство не будет реактивным.
      const name = this.name
      return () => this.load(name)
    }
  },
  methods: {
    async load (name) {
      // В import() должен быть статический элемент (как './templates/'), иначе не заработает.
      const { default: template } = await import(`./templates/${name}.html`)
      return { template }
    }
  },
  render (h) {
    return h(this.component)
  }
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы