Vue.js Vue组件已注册,但Vue仍为未知自定义元素

Vue.js Vue组件已注册,但Vue仍为未知自定义元素,vue.js,vue-component,single-page-application,vue-dynamic-components,Vue.js,Vue Component,Single Page Application,Vue Dynamic Components,我有一个小型Vue应用程序,可以动态加载组件 首先,我编写了一个名为SPA的func,这个func负责创建主应用程序并处理加载组件 /* *param{object}params:{ *{CSS selector/HTMLElement}el:必需,要在其上装载Vue的现有DOM元素 *{CSS selector}componentEl:必需,Vue组件的“el”中的占位符元素 *{CSS选择器/HTML字符串}initComponentTemplate:可选,初始化应用程序时默认的Vue组件模


我有一个小型Vue应用程序,可以动态加载组件
首先,我编写了一个名为SPA的func,这个func负责创建主应用程序并处理加载组件

/*
*param{object}params:{
*{CSS selector/HTMLElement}el:必需,要在其上装载Vue的现有DOM元素
*{CSS selector}componentEl:必需,Vue组件的“el”中的占位符元素
*{CSS选择器/HTML字符串}initComponentTemplate:可选,初始化应用程序时默认的Vue组件模板
*{object}数据:可选,Vue实例的数据
*{object}方法:可选,用于Vue实例的方法
* }
*返回{SPA}
*创建新SPA对象的示例
window.exampleSPA=新建SPA({
el:#应用程序视图“,
componentEl:#应用程序视图组件
});
*/
var SPA=函数(参数){
var-app=这个;
/*
*为Vue实例构造参数
*/
var vmConstruct={
el:空,
数据:函数(){
var fullData={
/*
*电流分量
*显示当前子组件的currentView
在这种情况下,技术支柱用于在组件周围传递数据,
https://vuejs.org/v2/guide/components.html#Props
currentItem将包含从父组件传递到子组件的数据,反之亦然
每当有组件呈现到此组件中时,Vue将currentItem中的数据发送到子组件。
在组件中,我们通过道具“passingMessage”从父级接收数据。
Vue还将侦听“通过”事件以从子组件获取数据,然后设置为currentItem,
“传递”事件由子组件发出,目的是将数据传递回父组件。
*/
当前视图:“初始化”,
//传递到组件的当前数据
当前项:{}
};
//从SPA初始化添加属性
如果(!params.hasOwnProperty(“数据”)){
返回完整数据;
}
for(参数数据中的var prop){
if(fullData.hasOwnProperty(prop)){
继续;
}
fullData[prop]=参数数据[prop];
}
返回完整数据;
},
计算:{},
已创建:函数(){},
挂载:函数(){
此.$nextTick(函数(){
//仅在渲染整个视图后运行的代码
});
},
方法:{
/*
*为currentItem设置数据,
*通常,从子组件获取的数据将绑定到currentItem
*param{object}params
*/
setCurrentItem:函数(参数){
this.currentItem=参数;
}
}
};
如果(params.el===‘未定义’){
抛出新错误(“缺少参数”);
}
vmConstruct.el=params.el;//假设params.el是HTMLElement
如果(params.el.charAt(0)==“#”){//params.el是CSS选择器
vmConstruct.el=document.querySelector(params.el);
}
//检查组件元素是否存在,
//用固定模板替换它
if(params.componentEl===‘未定义’){
抛出新错误(“缺少参数组件”);
}
var componentTemplate='';
if(参数组件字符(0)!=“#”){
抛出新错误(“Param componentEl无效,必须是CSS选择器”);
}
var componentEl=vmConstruct.el.querySelector(params.componentEl);
if(componentEl==null){
抛出新错误(“未找到Vue组件的“el”中的占位符元素”);
}
componentEl.innerHTML=组件模板;
//创建“默认”组件
var initComponentTemplate='';
if(typeof params.initComponentTemplate==“string”){
initComponentTemplate=params.initComponentTemplate;
}
Vue.component(“init”{
模板:initComponentTemplate
});
if(params.hasOwnProperty(“方法”)){
for(参数方法中的变量属性){
if(vmConstruct.hasOwnProperty(prop)){
继续;
}
vmConstruct.methods[prop]=params.methods[prop];
}
}
/*
*创建视图模型
*/
this.vm=新的Vue(vmConstruct);
//需要lib public/libs/base/js/script.js
this.assets=new Admin.assets();
};
/*
*将页面更改为目标组件
*param{object}params:{
*{string}标记名
* }
*/
SPA.prototype.setCurrentView=函数(参数){
//然后将页面更改为该组件
this.vm.currentView=params.tagName;
};
/*
*动态组件加载
*param{object}params:{
*{锚定DOM对象}锚定
*{string}操作
* }
*/
SPA.prototype.getComponent=函数(参数){
var-app=这个;
var xmlhttp=new XMLHttpRequest();
xmlhttp.onreadystatechange=函数(){
if(xmlhttp.readyState==4&&xmlhttp.status==200){
//在其中加载新模板和脚本
var templateContainer=app.getTemplateContainer();
templateContainer.innerHTML=xmlhttp.responseText;
var responsePage=templateContainer.querySelector('title');