那我们是否可以通过这种方式来达到我们的需求呢?
还不够!
为什么???
因为 Vue.component 返回的结果是一个 function!它返回的并不是 组件实例,而是一个构造函数。
那到这里其实我们就清楚了。 对于 Vue.component 声明的组件,我们先通过 Vue.component 获取它的构造函数,再 new 出一个组件实例,最后 通过 $mount 挂载到 html 上。
// 定义一个名为 button-counter 全局注册的组件
Vue.component("button-counter", {
template: '<button v-on:click="count++">You clicked me {{ count }} times.</button>',
data() {
return {
count: 0
}
}
});
new Vue({
template: `
<div id="app">
<h1>App Component</h1>
<button @click="insert">click to insert button-counter comonent</button>
<div id="insert-container"></div>
</div>
`,
methods: {
insert() {
const ButtonCounter = Vue.component("button-counter"); // 只能查找到全局注册到组件
const instance = new ButtonCounter();
instance.$mount("#insert-container");
}
}
}).$mount("#app");
上述代码中,Vue.component 先获取到组件的构造函数,然后构造实例,通过实例的一些方法来处理数据和挂载节点。
但是我们发现 Vue.component 只负责全局注册或查找。
如果想要针对局部注册的组件使用动态创建并添加我们需要使用 Vue.extend 基础Vue构造器创建"子类"达到目的。
其实 Vue.component 方法传入的选项是一个对象时,Vue自动调用 Vue.extend。
完整代码示例:
const ButtonCounterComponent = {
template: '<button v-on:click="count++">You clicked me {{ count }} times.</button>',
data() {
return {
count: 0
}
}
};
new Vue({
template: `
<div id="app">
<h1>App Component</h1>
<button @click="insert">click to insert button-counter comonent</button>
<div id="insert-container"></div>
</div>
`,
methods: {
insert() {
const ButtonCounter = Vue.extend(ButtonCounterComponent);
const instance = new ButtonCounter();
instance.$mount("#insert-container");
}
}
}).$mount("#app");
单文件应用
在实际使用场景里,大部分都是用脚手架构建到项目,使用 *.vue 这种单文件方式注册组件。
<template></template>
<script>
export default {
data() {
return {
msg: "hello"
}
},
created() {},
mounted() {},
destroy() {}
};
</script>
<style scoped></style>
import *.vue 返回的就是模版中 script 中 export 部分。
总结
至此,我们知道了,全局组件动态注册 和 局部组件动态注册 的使用方法和注意事项,我们可以结合实际情况去选择不同方案进行搭配即可。
好了,
Copyright © 2019- cepb.cn 版权所有 湘ICP备2022005869号-7
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务