第十七节:带你梳理Vue2: Vue组件的认识,创建和使用

ops/2025/2/16 1:39:14/

1. 认识Vue组件

组件系统是 Vue 的另一个重要概念,它是一种抽象的概念,类似于积木中的一块块小积木,通过这些小积木拼接成一个大的模型.

组件系统就是将页面一块小的区域处理为一个组件,我们使用这些小型、独立和可复用的组件构建大型应用。

仔细想想,几乎任意类型的应用界面都可以抽象为一个组件树:

组件树.png


1.1 组件是什么

组件就是一段独立的,能代表页面某一个部分的代码片段, 拥有自己独立的数据,JavaScript脚本,以及样式的标签.


1.2 组件的好处:

  1. 提高开发效率
  2. 方便重复使用
  3. 便于协同开发
  4. 更容易被管理和维护

1.3 组件创建的基本步骤

Vue.js的组件的使用有3个步骤:创建组件构造器、注册组件和使用组件

组件的创建过程.png


1.4 示例

通过一个示例来了解组件的使用

使用Vue的component方法注册全局组件

<div id="app-one"><!-- 3.在实例中使用组件 --><greeting></greeting>
</div><script>javascript">// 1. 组件构造器let MyComponent= Vue.extend({// 配置对象// 因为组件没有挂在点,所以使用模板,只有一个根节点template: `<div><p>大家好,我叫{{name}}</p><button @click="changeName">点击换名字</button></div>`,data: function(){return {name:"渣渣辉"}},methods:{changeName(){this.name = "古天乐"}}})// 2. 通过Component方法,将构造器扩展的构造函数创建组件实例Vue.component("Greeting",MyComponent)// Vue 实例const vm = new Vue({el:"#app-one",})</script>

显示结果:

通过构造器创建组件.png


1.5 理解组件的创建和注册

  1. Vue.extend()是Vue构造器扩展,调用Vue.extend()创建的是一个组件构造器,而不是具体的组件实例。
  2. Vue.extend()构造器有一个选项对象,选项对象的template属性用于定义组件要渲染的HTML模板。
  3. 使用Vue.component()注册组件时,需要提供2个参数,第1个参数是组件的名,第2个参数是组件构造器。
  4. Vue.component()方法内部会调用组件构造器,创建一个组件实例。
  5. 组件应该挂载到某个Vue实例下,否则它不会生效。

1.6 Vue构造器扩展直接创建Vue实例

Vue.extend 方法相当于是对于原有的Vue 构造函数进行了扩展

本质上核心还是Vue的构造函数,所以我们可以直接通过扩展的构造函数创建Vue实例

<div id="app"></div>
<script>javascript"> // 1. 通过组件构造器扩展构造函数let MyComponent= Vue.extend({// 配置对象// 因为组件没有挂在点,所以使用模板,只有一个根节点template: `<div><p>大家好,我叫{{name}}</p><button @click="changeName">点击换名字</button></div>`,data: function(){return {name:"渣渣辉"}},methods:{changeName(){this.name = "古天乐"}}})// 2. 通过扩展的构造函数创建Vue实例new MyComponent({el:'#app'})
</script>

示例说明:

  1. Vue组件其实也是Vue实例,只不过没有挂载点, 通过template处理需要渲染的DOM
  2. 但是组件实例必须有一个名字, 通过这个名字在Vue实例中使用, 通过自定义标签方式使用组件

在vue中,一个自定义标签 vue就会把它看成一个组件,vue可以给这些标签赋予一定的意义


1.7 直接通过选项对象创建组件

其实所有的Vue的组件同时也都是Vue的实例.
所有组件可接受的相同选项对象.

因此我们在创建组件的过程中也就没有必要每次都通过构造器扩展Vue构造函数

直接把构造器的选项对象作为第二个参数传递给Vue.component就可以

示例如下:

// 创建组件
Vue.component("Greeting",{template: `<div><p>大家好,我叫{{name}}</p><button @click="changeName">点击换名字</button></div>`,data: function(){return {name:"渣渣辉"}},methods:{changeName(){this.name = "古天乐"}}
})

使用组件

<div id="app-one"><greeting></greeting>
</div>

推荐使用这种方式创建组件.

注意事项:

  1. 组件名称不能起和HTML合法标签相同的名字,如p,
  2. 如果组件名跟HTML合法标签同名, 会默认解析为合法的标签,
  3. 因此会将p识别为普通的标签,而不是自定义标签,因此就不会被当成组件处理, 同时还会报错

1.8 组件的分类

  1. 全局组件 : 可以声明一次在任何地方使用(一般写插件的时候全局使用的多一点)
  2. 局部组件: 必须告诉这个组件属于谁(一般用局部比较好)

那么接下来就让我们好好理解一些全局组件和局部组件的使用


2. 全局组件

通过刚才的实例,对于全局组件相信你们已经有了一定的了解

调用Vue.component()注册组件时,组件的注册是全局的,这意味着该组件可以在任意Vue实例下使用。

通过示例了解全局组件的使用


2.1 创建全局组件

通过Vue.component 方法注册全局组件, 组件名称建议使用大驼峰命名

//  在js中定义组件名时使用大驼峰式命名,
// 但是在标签html中里使用时尽量用连字符-
Vue.component('MyCom', {   template: `<div>这是全局组件的内容</div>`
})

2.2 创建多个Vue实例

// 实例一
new Vue({el:"#app-one",
})// 实例二
new Vue({el:"#app-two",
})

2.3 在多个Vue实例中使用全局组件

<div id="app-one"><!-- 是使用组件的时候要把大驼峰转为连字符的方式使用 --><my-com></my-com><!-- 如果使用了如下的方式就会报错,--><!-- <MyCom></MyCom> --></div>
<div id="app-two"><!-- 如果自定义标签里面没有嵌套内容可以写成单标签的形式 --><my-com />
</div>

2.4 注意事项

相信你们看到了我们注册组件的时候使用的组件名是一个驼峰写法的方式,此时使用组件时的自定义标签中不能使用驼峰写法会报错的,

因为HTML不能识别大小写, 会将你写的<MyCom>识别为<mycom>这样就找不到组件了,因此会在控制台报错

但是我们可以在定义组件的使用使用连字符的方式定义组件名

示例代码如下:

<div id="app-two"><!-- 使用组件 --><my-com />
</div><script>javascript">//  使用连字符定义组件名Vue.component('my-com', {   template: `<div>这是全局组件的内容</div>`})// Vue实例化new Vue({el:"#app",})
</script>

通过示例,我们了解了定义组件是使用连字符和驼峰命名都可以,但是在HTML标签里使用组件的使用一定只能写成连字符的方式.


关于组件名说明:

  1. 虽然在定义组件时我们可以使用连字符命名,但是不推荐,
  2. 推荐的使用方式是,定义组件使用驼峰方式, 使用组件使用连字符方法.

至于为什么, 您接着往下看.


3. 局部组件

有的时候我们并不希望组件在所有的实例中都能使用, 那么我们就可以将组件定义为局部组件

3.1 局部组件使用三步曲

  1. 创建局部配置,
  2. 注册局部组件
  3. 使用局部组件

3.2 使用构造器创建并使用局部组件

我们可以使用构造器创建局部组件,

示例代码如下:

<div id="app-one"><!-- 3. 在注册了局部组件的实例中使用局部组件 --><my-component></my-component></div>
<div id="app-two"><!-- 当前的这个实例并没有注册局部组件,所以会报错 --><my-component></my-component>
</div><script>javascript">// 1. 使用构造器创建组件配置let MyComponent = Vue.extend({template: `<div><h2>我想被创建为局部组件</h2></div>`,})// 注册局部组件的实例const vm = new Vue({el:"#app-one",// 2. 注册为只能在当前实例中使用的局部组件components: {"my-component": MyComponent}})// 没有注册局部组件的实例new Vue({el:"#app-two",})
</script>

示例说明:

  1. 通过extend方法创建Vue构造器
  2. 在Vue选项对象中,通过components选项将构造器创建为局部组件,
  3. components选项值是一个对象,对象的属性是组件的名称,值是将要被创建为组件的构造器或选项对象
  4. 没有注册局部组件的实例对象是不能使用其它实例中的局部组件,

因此示例的实例中app-two中是不能使用组件my-component的,会报错


3.3 直接通过选项对象来创建组件

前一小节有讲过我们可以直接将选项对象注册为全局组件,

同样的我们也可以直接将选项对象注册为局部组件,Vue内部会将选项对象进行处理

示例代码如下:

<div id="app-one"><!-- 3. 在注册了局部组件的实例中使用局部组件 --><my-component></my-component>
</div><script>javascript">// 1. 创建局部组件的选项对象let MyComponent = {template: `<div><h2>我想被创建为局部组件</h2></div>`,}const vm = new Vue({el:"#app-one",// 2. 将选项对象注册为局部组件components: {"my-component": MyComponent}})</script>

通过对比我们就会发现直接将选项对象注册为局部组件要来的简单一点,所以推荐使用选项对象创建组件的方式,无论是全局组件还是局部组件

这种使用选项对象直接注册为组件的方式被称作为组件注册语法糖


http://www.ppmy.cn/ops/45556.html

相关文章

基于Pytorch框架的深度学习EfficientNetV2神经网络中草药识别分类系统源码

第一步&#xff1a;准备数据 5种中草药数据&#xff1a;self.class_indict ["百合", "党参", "山魈", "枸杞", "槐花", "金银花"] &#xff0c;总共有900张图片&#xff0c;每个文件夹单独放一种数据 第二步&a…

Mac连接虚拟机(Linux系统)

1.确定虚拟机的IP地址 ifconfig //终端命令&#xff0c;查询ip地址 sudo apt install net-tools 安装完成后再次执行 ifconfig&#xff1a; 2.安装SSH&#xff08;加密远程登录协议&#xff09; (1).安装OpenSSH服务器软件包&#xff1a; sudo apt-get install openssh-ser…

软件架构设计属性之四:性能属性浅析

文章目录 引言一、性能属性的内涵与重要性1.1 性能属性的内涵1.2 性能属性的重要性1.3 性能属性的实践应用 二、性能属性的关键影响因素2.1 系统结构2.2 数据处理2.3 并发处理2.4 硬件和资源2.5 软件和框架2.6 监控和优化 三、性能属性的优化策略与实践3.1 优先级队列与资源调度…

AI+算力:科技新时代的创新引擎

随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;“AI算力”的结合应用已成为科技行业的热点话题&#xff0c;甚至诞生出“AI算力最强龙头“的网络热门等式。这个组合不仅可以提高计算效率&#xff0c;还可以为各行各业带来更强大的数据处理和分析能力&#…

四川汇聚荣聚荣科技有限公司在市场评价好吗?

随着科技行业的迅猛发展&#xff0c;越来越多的科技公司如雨后春笋般涌现&#xff0c;其中不乏一些优秀的企业。四川汇聚荣聚荣科技有限公司便是其中的一员。那么&#xff0c;这家公司在市场上的评价如何呢?接下来&#xff0c;我们将从四个方面进行详细的阐述。 一、公司概况四…

代码随想录算法训练营day34 | 455.分发饼干、376. 摆动序列、53. 最大子序和

理论基础 贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优。 刷题或者面试的时候&#xff0c;手动模拟一下感觉可以局部最优推出整体最优&#xff0c;而且想不到反例&#xff0c;那么就试一试贪心。 455.分发饼干 result和j变化一致&#xff0c;可以去除一…

JS的基本内容

JS中的六中数据类型字符型&#xff0c;数值型&#xff0c;布尔型&#xff0c;Null&#xff0c;undefined和对象Object&#xff1a;符合数据类型&#xff0c;对象是属性和方法的集合甚至是另一种类型的对象。 基本数据类型&#xff1a;数值、字符串、null、undefined、布尔&…

代码随想录算法训练营第四十四天|km46. 携带研究材料、 416. 分割等和子集

代码随想录算法训练营第四十四天 km46. 携带研究材料 题目链接&#xff1a;km46. 携带研究材料 确定dp数组以及下标的含义&#xff1a;i的含义是物品编号从0到i&#xff0c;j的含义是当前背包的最大容量&#xff0c;dp[i][j]背包内物品的总价值确定递推公式&#xff1a;背包…