1.前言

  • 本节讲述组件和2.x版本和3.x版本的注册方式

2.全局注册

  • 2.x版本直接调用Vue.component()方法进行全局注册,所有Vue实例都能使用,包括其组件
//组件代码省略
var someComponent = {}
Vue.component('some-component',someComponent)
  • 3.x版本全局注册从语法调用层面就可以看出,只能针对当前Vue实例以及其组件,这里与2.x是有区别的
var some_component = {
'template':"<h3>我是组件</h3>",
} var app = Vue.createApp({
data() {
return {
msg: "实例1",
}
},
})
//全局注册? 只能用于当前实例和其组件
app.component('some-component', some_component)
app.mount('#app') //这个实例不能直接调用上面的 some_component 组件
var app2 = Vue.createApp({
data() {
return {
msg: "实例2",
}
},
})

3.局部注册

  • 2.x和3.x都是通过配置component字段进行注册,只能在当前实例中使用,其子组件中不得使用
//组件
var some_component = {
'template':"<h3>子组件</h3>",
}
new Vue({
el:"#app",
data(){
return { }
},
components:{
'some-component':some_component,
}
})
var some_component = {
'template':"<h3>我是组件</h3>",
} var app = Vue.createApp({
data() {
return {
msg: "实例1",
}
},
components:{
'some-component':some_component,
}
}) app.mount('#app')

4.动态组件

  • 通过component标签的中使用 is 属性 来切换不同的组件,is属性值对应组件注册是的组件名称(string)
//核心代码
<component :is="currentTabComponent"></component>
<body>
<div id="app" v-cloak>
<div>
<button @click="toggleComponent">切换组件</button>
</div>
<div>
<component :is="active_component"></component>
</div>
</div>
</body>
<script>
//组件1
var some_component = {
'template':"<h3>子组件</h3>",
} //组件2
var some_component2 = {
'template':"<h3>子组件2</h3>",
} new Vue({
el:"#app",
data(){
return {
//默认是 组件1
active_component: some_component,
component_index:0
}
},
components:{
'some-component':some_component,
'some-component2':some_component2
},
methods:{
toggleComponent(){
if(this.component_index == 0){
this.active_component = 'some-component2'
this.component_index = 1
}else{
this.active_component = 'some-component'
this.component_index = 0
}
}
}
})
</script>
  • 组件缓存:组件在切换时,默认会丢失缓存数据,可以使用keep-alive标签将其包裹起来,使其状态和数据得以缓存
<!-- 失活的组件将会被缓存!-->
<keep-alive>
<component :is="active_component"></component>
</keep-alive>
//组件1
var some_component = {
'template':"<input type='text'></input>",
} //组件2
var some_component2 = {
'template':"<input type='text'></input>",
}

5.异步组件基础

  • 组件从数据类型来说其实就是一个对象,其注册的步骤一般为:先下载组件资源(组件的相关代码文件js),再执行Vue.use()进行组件注册
  • 异步组件就是先进行组件注册,等需要渲染这个组件时,再下载对应的组件资源,这样的做法是为了节省资源,即需要渲染哪个组件时再去下载组件资源
  • 同步组件和异步组件的注册方法是一致的,作为区分的是:同步组件的值其实是一个对象,而异步组件是一个函数,这个函数在2.x和3.x中有些区别
  • 2.x的异步组件:把组件的值设置成一个function,等第一次渲染这个组件时(后续切换不会重复执行),这个方法就会执行,在这个方法中通过ajax获取组件代码后执行resolve()方法
 Vue.component('async-example', function (resolve, reject) {
//组件第一次渲染会执行这里的代码 //使用定时器模拟ajax请求
setTimeout(function () {
//模拟后台返回的组件代码
var component_code = {
template: '<div>I am async!</div>'
}
//执行resolve 传入组件代码
resolve(component_code)
}, 1000)
})
  • 3.x使用专用的方法Vue.defineAsyncComponent()来定义一个异步组件,此方法接受一个返回 Promise 的工厂函数,在这个工厂函数中通过ajax获取组件代码后执行resolve()方法
const async_example = Vue.defineAsyncComponent(
//接收一个函数,这个函数返回一个promise
() => {
return new Promise((resolve, reject) => {
//组件渲染后执行这里的代码
console.log('模拟ajax请求') //使用定时器模拟ajax请求
setTimeout(function () {
//模拟后台返回的组件代码
var component_code = {
template: '<div>I am async!</div>'
}
//执行resolve 传入组件代码
resolve(component_code)
}, 1000)
})
}
) var app = Vue.createApp({
data() {
return {
msg: "实例1",
//默认是 组件1
flag: false,
}
},
components: {
"async-example": async_example
},
methods: {
toggleComponent() {
this.flag = !this.flag
}
}
}) app.mount('#app')

6.异步组件应用

  • 在非脚手架项目中,异步组件意义不大,因为自定义的组件都是按单文件组件 (SFC) 规范来编写的,通过ajax获取其代码后还要经过编译,这个编译需要专门的插件来完成(httpVueLoader),上面的例子只为了解底层的运作原理,需要用到异步组件时,基本上都是脚手架模式
  • 脚手架模式中,如果组件被定义成异步组件,会将其打包成一个js文件,激活此组件时,页面会加载这个js文件
  • 2.x脚手架项目异步组件使用方法:在箭头函数中使用import引入组件文件
components: {
"async-example": () => import('@/components/async-example.vue')
},
  • 3.x脚手架项目异步组件使用方法:引入并调用defineAsyncComponent()方法,传入箭头函数,使用import引入组件文件
import { defineAsyncComponent } from 'vue'
components: {
"async-example": defineAsyncComponent(()=> import('@/components/async-example.vue'))
},

Vue.js 组件注册的更多相关文章

  1. vue.js组件化开发实践

    前言 公司目前制作一个H5活动,特别是有一定统一结构的活动,都要码一个重复的轮子.后来接到一个基于模板的活动设计系统的需求,便有了下面的内容.借油开车. 组件化 需求一到,接就是怎么实现,技术选型自然 ...

  2. VUE.JS组件化

    VUE.JS组件化 前言 公司目前制作一个H5活动,特别是有一定统一结构的活动,都要码一个重复的轮子.后来接到一个基于模板的活动设计系统的需求,便有了下面的内容.借油开车. 组件化 需求一到,接就是怎 ...

  3. 浅尝Vue.js组件(一)

    本篇目录: 组件名 组件注册 全局注册 基础组件的自动化全局注册 局部注册 在模块系统中局部注册 Prop 单向数据流 Prop验证 类型检查 非Prop特性 替换/合并已有的特性 禁用特性继承 自定 ...

  4. Vue.js 组件的三个 API:prop、event、slot

    组件的构成 一个再复杂的组件,都是由三部分组成的:prop.event.slot,它们构成了 Vue.js 组件的 API.如果你开发的是一个通用组件,那一定要事先设计好这三部分,因为组件一旦发布,后 ...

  5. 如何理解vue.js组件的作用域是独立的

    vue.js组件的作用域是独立,可以从以下三个方面理解: 1.父组件模板在父组件作用域内编译,父组件模板的数据用父组件内data数据:2.子组件模板在子组件作用域内编译,子组件模板的数据用子组件内da ...

  6. Vue.js 组件编码规范

    本规范提供了一种统一的编码规范来编写 Vue.js 代码.这使得代码具有如下的特性: 其它开发者或是团队成员更容易阅读和理解. IDEs 更容易理解代码,从而提供高亮.格式化等辅助功能 更容易使用现有 ...

  7. Vue.js组件的重要选项

    Vue.js组件的重要选项 实例化Vue对象一些很重要的选项,Vue的所有数据都是放在data里面的,Vue的参数是个对象,对象里面的字段叫做data,data里面也是对象,data也可以写作是thi ...

  8. Vue.js组件学习

    组件可以扩展HTML元素,封装可重用的HTML代码,我们可以将组件看作自定义的HTML元素.组件系统提供了一种抽象,让我们可以使用独立可复用的小组件来构建大型应用. 一个简单组件例子(全局注册) &l ...

  9. Vue.js组件示例

    一 外部引入文件:(全局注册) //建模版 var mycomponent=Vue.extend( {template:"<div><a href='#'>我爱Jav ...

  10. Vue.js组件之同级之间的通信

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

随机推荐

  1. 城市时空预测的统一数据管理和综合性能评估 [实验、分析和基准]《Unified Data Management and Comprehensive Performance Evaluation for Urban Spatial-Temporal Prediction [Experiment, Analysis & Benchmark]》

    2023年11月1日,还有两个月,2023年就要结束了,希望在结束之前我能有所收获和进步,冲呀,老咸鱼. 论文:Unified Data Management and Comprehensive Pe ...

  2. Angular 18+ 高级教程 – Component 组件 の Attribute Directives 属性型指令

    介绍 指令就是没有模板的组件.除了模板其它的都有,比如 selector.inject.@Input.lifecycle 等等. 那既然都有完整的组件了,为什么还搞一个少掉模板的指令呢? 很简单啊,因 ...

  3. Asp.net core 学习笔记之异常处理

    自己写代码自己维护, 你爱怎样写都可以, 确保一致性就可以了. 不要自己写,自己看不懂 /.\ 但是如果有一天你要别人也看得懂...那就不单单是一致性的问题了,最好是用大众的 style. refer ...

  4. .NET 7+Angular 4 轻量级新零售进销存系统

    前言 给大家推荐一个专为新零售快消行业打造了一套高效的进销存管理系统. 系统不仅具备强大的库存管理功能,还集成了高性能的轻量级 POS 解决方案,确保页面加载速度极快,提供良好的用户体验. 项目介绍 ...

  5. Sketch Measure切图插件无法导出标注 (换插件绕过解决)

    环境 MacOS 10.15+ sketch版本 69.2 插件版本 2.8.1 遇到的问题 导出标注卡死 更新版本无解,到插件的github issue中找到解决方法 使用MeaXure插件,git ...

  6. 【赵渝强老师】Kubernetes平台中日志收集方案

    一.K8s整体日志收集方案 整体的日志收集方案,如下图所示: Filebeat是本地文件的日志数据采集器,可监控日志目录或特定日志文件(tail file),并将它们转发给Elasticsearch或 ...

  7. 搜广推算法校招面试:BOSS直聘 推荐搜索系统工程师

      本文介绍2024届秋招中,BOSS直聘的推荐/搜索系统工程师岗位一面的面试基本情况.提问问题等.   2023年12月,赶在秋招的末尾,投递了BOSS直聘的推荐/搜索系统工程师岗位,并不清楚所在的 ...

  8. linux内核空间进程为什么无论如何切换,内核地址空间转换到物理地址的关系是永远不变的?

    在Linux内核中,无论如何切换进程,内核地址空间转换到物理地址的关系是永远不变的,主要原因是内核地址空间在所有进程中是共享的.这种设计有几个关键点: 1. 内核地址空间共享 在Linux操作系统中, ...

  9. 使用hexo进行github博客搭建

    1.你必须建一个存储库,这个存储库要和你的github名称一致(不然就会404),如下图: 2.如果是window配置,需要安装git和node.js 3.下载hexo npm config set ...

  10. PRT预计算辐射传输方法

    PRT(Precomputed Radiance Transfer)技术是一种用于实时渲染全局光照的方法.它通过预计算光照传输来节省时间,并能够实时重现面积光源下3D模型的全局光照效果. 由于PRT方 ...