vue 动态创建组件的两种方法
Vue动态创建组件实例并挂载到body
方式一
importVuefrom'vue'
/**
*@paramComponent组件实例的选项对象
*@paramprops组件实例中的prop
*/
exportfunctioncreate(Component,props){
constcomp=new(Vue.extend(Component))({propsData:props}).$mount()
document.body.appendChild(comp.$el)
comp.remove=()=>{
document.body.removeChild(comp.$el)
comp.$destroy()
}
returncomp
}
方式二
importVuefrom'vue'
exportfunctioncreate(Component,props){
//借鸡生蛋newVue({render(){}}),在render中把Component作为根组件
constvm=newVue({
//h是createElement函数,它可以返回虚拟dom
render(h){
console.log(h(Component,{props}));
//将Component作为根组件渲染出来
//h(标签名称或组件配置对象,传递属性、事件等,孩子元素)
returnh(Component,{props})
}
}).$mount()//挂载是为了把虚拟dom变成真实dom
//不挂载就没有真实dom
//手动追加至body
//挂载之后$el可以访问到真实dom
document.body.appendChild(vm.$el)
console.log(vm.$children);
//实例
constcomp=vm.$children[0]
//淘汰机制
comp.remove=()=>{
//删除dom
document.body.removeChild(vm.$el)
//销毁组件
vm.$destroy()
}
//返回Component组件实例
returncomp
}
使用
A组件(要动态创建的组件)
{{title}}
{{data}}
B组件(操作动态创建组件的地方)
