Jes*_*ess 9 javascript vue.js vuejs2
有没有办法让.vue文件负责在单个文件组件模式中创建自己的Vue实例?
这是Vue文件.
// MyComponent.vue
<template><div>Hello {{ name }}!</div></template>
<script>
const Vue = require('vue');
// what would usually be exports default
const componentConfig = {
name: "my-component",
props: {
name: String,
},
};
function create(el, props) {
const vm = new Vue({
el,
render(h) {
return h(componentConfig, { props });
});
vm.$mount();
return vm;
}
module.exports = { create };
</script>
Run Code Online (Sandbox Code Playgroud)
然后在一些JS文件中使用:
// index.js
const MyComponent = require('./MyComponent.vue');
const el = '.container';
const props = {
name: 'Jess',
};
MyComponent.create(el, props);
</script>
Run Code Online (Sandbox Code Playgroud)
当我执行上述操作时,我收到有关无法找到模板的错误.
[Vue warn]: Failed to mount component: template or render function not defined.
found in
---> <MyComponent>
<Root>
Run Code Online (Sandbox Code Playgroud)
就像我本能地说,我不明白Vue编译器如何能够神奇地推断(从脚本标签内)我想引用上面声明的模板......所以..是的.有没有解释为什么我不能这样做,或者想我怎么能让它工作?
您所描述的内容是通过 Webpack 和Vue Loader在预编译步骤中完成的。Vue 编译器实际上并不解析Single File Components。Vue 编译器可以解析的是 component\xe2\x80\x99s options 对象中提供的模板。因此,如果您在对象中提供一个template选项,componentConfig您的示例就会起作用。否则,您将必须使用 Webpack 和 Vue Loader 完成预编译步骤来解析单个文件组件的模板。为此,您必须符合规范中定义的SFC 结构SFC 结构。这是摘录..
\n\n模板
\n
\n\n\n
\n- 每个
\n*.vue文件一次最多可以包含一个<template>块。\n- 内容将被提取并传递到
\nvue-template-compiler并预编译到 JavaScript 渲染函数中,最后注入到该<script>部分中的导出组件中。
\n\n脚本
\n
\n\n\n
\n- 每个
\n*.vue文件一次最多可以包含一个块。- 该脚本作为 ES 模块执行。
\n- 默认导出应该是 Vue.js组件选项对象。\n还支持导出由 创建的扩展构造函数
\nVue.extend(),但首选普通对象。- \n
.js任何与文件(或属性指定的扩展名)匹配的 webpack 规则也lang将应用于块中的内容<script>。
main.js为了使您的特定示例正常工作,您可以像这样重写文件..
const MyComponent = require("./MyComponent.vue");\n\nconst el = ".container";\nconst data = {\n name: "Jess"\n};\n\nMyComponent.create(el, data);\nRun Code Online (Sandbox Code Playgroud)\n还有你的MyComponent.vue文件(这也可以是js下面提到的@Ferrybig 的文件)..
<script>\nconst Vue = require(\'vue\');\n\nfunction create(el, data) {\n const componentConfig = {\n el,\n name: "my-component",\n data,\n template: `<div>Hello {{ name }}!</div>`\n };\n const vm = new Vue(componentConfig);\n return vm;\n}\n\nmodule.exports = { create };\n</script>\nRun Code Online (Sandbox Code Playgroud)\n请参阅此代码沙盒
\n或者,如果您更喜欢渲染函数,您MyComponent.vue将看起来像这样..
<script>\nconst Vue = require(\'vue\');\n\nfunction create(el, data) {\n const componentConfig = {\n el,\n name: "my-component",\n data,\n render(h) { return h(\'div\', \'Hello \' + data.name) } \n };\n const vm = new Vue(componentConfig);\n return vm;\n}\n\nmodule.exports = { create };\n</script>\nRun Code Online (Sandbox Code Playgroud)\n\n最后要记住的一件事是:在任何组件中,您都可以使用模板或渲染函数,但不能像示例中那样同时使用两者。这是因为其中一个会覆盖另一个。例如,请参阅JSFiddle Vue 样板并注意添加渲染函数时的情况模板如何被覆盖。这可以解释您遇到的错误。渲染函数优先,但您向它提供了一个组件的选项对象,该对象不提供要渲染的模板。
\n| 归档时间: |
|
| 查看次数: |
965 次 |
| 最近记录: |