То, что вы описываете, делается на этапе предварительной компиляции через Webpack и Vue Loader .Компилятор Vue фактически не анализирует Single File Components .Компилятор Vue может анализировать - это шаблоны, предоставляемые в объекте параметров компонента.Поэтому, если вы предоставите опцию template
в вашем componentConfig
объекте, ваш пример будет работать.В противном случае вам придется пройти этап предварительной компиляции с Webpack и Vue Loader, чтобы проанализировать шаблон компонента Single File.Для этого вам нужно будет соответствовать структуре SFC , определенной в спецификации .Вот выдержка ..
Шаблон
- Каждый файл
*.vue
может содержать не более одного блока <template>
за раз. - Содержимое будет извлечено и передано в
vue-template-compiler
, предварительно скомпилировано в функции рендеринга JavaScript и, наконец, введено в экспортируемый компонент в разделе <script>
.
Сценарий
- Каждый файл
*.vue
может содержать не более одного блока за раз. - Сценарий выполняется как модуль ES.
- экспорт по умолчанию должен быть объектом опций компонента Vue.js .Также поддерживается экспорт расширенного конструктора, созданного с помощью
Vue.extend()
, но предпочтительным является простой объект. - Любые правила веб-пакета, соответствующие файлам
.js
(или расширению, указанному атрибутом lang
) также будет применено к содержимому в блоке <script>
.
Чтобы ваш конкретный пример работал, вы можете переписать файл main.js
, как этот ..
const MyComponent = require("./MyComponent.vue");
const el = ".container";
const data = {
name: "Jess"
};
MyComponent.create(el, data);
И ваш файл MyComponent.vue
(Это может быть файл js
, как и @Ferrybig, упомянутый ниже) ..
<script>
const Vue = require('vue');
function create(el, data) {
const componentConfig = {
el,
name: "my-component",
data,
template: `<div>Hello {{ name }}!</div>`
};
const vm = new Vue(componentConfig);
return vm;
}
module.exports = { create };
</script>
См. Этот CodeSandbox
Или, если вы предпочитаете функции рендеринга, ваша MyComponent.vue
будет выглядеть следующим образом ..
<script>
const Vue = require('vue');
function create(el, data) {
const componentConfig = {
el,
name: "my-component",
data,
render(h) { return h('div', 'Hello ' + data.name) }
};
const vm = new Vue(componentConfig);
return vm;
}
module.exports = { create };
</script>
CodeSandbox
Последнее, что нужно иметь в виду: В любом компоненте вы можете использовать либо шаблон, либо функцию рендеринга, , но не оба , как вы делали в своем примере.Это потому, что один из них переопределит другой.Например, посмотрите шаблон JSFiddle Vue и обратите внимание, как при добавлении функции рендеринга шаблон переопределяется.Это объясняет ту ошибку, которую вы получаете.Функция рендеринга имела преимущество, но вы передали ей объект параметров компонента, который не предоставляет никакого шаблона для рендеринга.
PS: Я заинтригован целью этого упражнения.Это определенно не рекомендуемый способ ведения дел в Vue.