Я предполагаю, что все, что производит parseComponent()
, не то, что <component>
ищет
Я бы сказал, что да, так как кажется, что это не компилируется в любые render
функции.
Как указано в docs , vue-template-compiler
предназначен для компиляции во время выполнения. И в большинстве случаев вы должны использовать его с vue-loader
.
Как я могу это сделать?
Возможно, вы захотите использовать Vue.compile
, поскольку он позволяет вам скомпилировать строку шаблона в функцию render
; который затем можно привязать к объекту для компонента asyn c или Dynami c.
Обратите внимание, однако, что это доступно только в полной сборке , т.е. примерно на 30% тяжелее, чем аналоги сборки только во время выполнения. Подробнее о Runtime + Compiler vs. Runtime-only .
Имея это в виду, так как вы не упомянули в вопросе, какой пакет вы используете, я собираюсь предположим, что Webpack с Vue -CLI, и вот как вы настроили бы псевдоним vue
(в качестве ориентира при импорте).
Проверка вашего набора Vue "псевдоним"
В консоли (из root проекта) запустите:
vue inspect resolve.alias.vue$
Если это приведет к чему-то вроде "vue / dist / vue .runtime.esm. js" (it должно быть по умолчанию), тогда ясно, что нам нужно изменить эту часть.
Настройка
Теперь, поскольку внутренняя конфигурация веб-пакета поддерживается с использованием webpack-chain
, мы бы настроили / сбросили псевдоним следующим образом:
module.exports = {
chainWebpack: config => {
config.resolve.alias
.set('vue$', 'vue/dist/vue.esm.js')
}
}
Ознакомьтесь с описанием различных сборок .
Использование
И на этом этапе все, что вам нужно сделать, это передать шаблон "Dynami c" функции compile
, исключая, однако, тег <template>
.
import Vue from 'vue';
export default {
mounted() {
// fetch code from some external source here
let code = '<div>hello</div>';
let comp = Vue.compile(code);
this.pluginComponent = comp;
}
}
<template>
<div>
The component goes here:
<component :is="pluginComponent"></component>
</div>
</template>