第15集丨Vue 江湖 —— 组件
目录
- 一、为什么需要组件
- 1.1 传统方式编写应用
- 1.2 使用组件方式编写应用
- 1.3 Vue的组件管理
- 二、Vue中的组件
- 1.1 基本概念
- 1.1.1 组件分类
- 1.1.2 Vue中使用组件的三大步骤:
- 1.1.3 如何定义一个组件
- 1.1.4 如何注册组件
- 1.1.5 如何使用组件
- 1.2 注意点
- 1.2.1 关于组件名
- 1.2.2 关于组件标签
- 1.2.3 一个简写方式
- 三、非单文件组件
- 四、组件的嵌套
- 4.1 案例一
- 4.2 案例二
- 五、VueComponent()构造函数
- 5.1 案例分析
- 5.2 为什么每次调用Vue.extend,返回的是一个全新的VueComponent?
- 5.3 vm管理vc
- 5.4 vm和vc
- 六、一个重要的内置关系
- 6.1 显示/隐式原型属性、原型对象
- 6.2 内置关系
- 6.3 关系分析图
- 七、单文件组件
- 7.1 安装Vetur插件
- 7.2 案例
- 7.2.1 School.vue
- 7.2.2 Student.vue
- 7.2.3 App.vue
- 7.2.4 main.js
- 7.2.5 index.html
一、为什么需要组件
组件(Component)
:用来实现局部(特定)功能效果的代码
和资源
的集合。
- 代码:
html/css/js
- 资源:
mp3/mp4/tff/zip...
1.1 传统方式编写应用
传统方式编写应用存在的问题:
- 依赖关系混乱,引入的先后顺序,不好维护
- 代码复用率不高。
1.2 使用组件方式编写应用
使用组件方式
编写应用,可以很好解决传统方式
编写应用存在的问题。
1.3 Vue的组件管理
组件(Component
)是 Vue.js
最强大的功能之一。组件可以扩展 HTML
元素,封装可重用的代码。
组件系统让我们可以用独立可复用的小组件
来构建大型应用,几乎任意类型的应用的界面都可以抽象为一个组件树。
二、Vue中的组件
组件是可复用的 Vue
实例,因为组件是可复用的 Vue
实例,所以它们与 new Vue
接收相同的选项,例如 data
、computed
、watch
、methods
以及生命周期钩子等。仅有的例外是像 el
这样根实例
特有的选项。
1.1 基本概念
1.1.1 组件分类
Vue
中组件分为:非单文件组件、单文件组件
- 非单文件组件:一个文件中包含有
n
个组件。a.html
- 单文件组件:一个文件中只包含有
1
个组件。a.vue
1.1.2 Vue中使用组件的三大步骤:
- 定义组件(创建组件)
- 注册组件
- 使用组件(写组件标签)
1.1.3 如何定义一个组件
使用Vue.extend(options)
创建,其中options
和new Vue(options)
时传入的那个options
几乎一样但也有点区别。区别如下:
el
不要写,为什么?—最终所有的组件都要经过一个vm
的管理,由vm
中的el
决定服务哪个容器。data
必须写成函数,为什么?——避兔组件被复用时,数据存在引用关系(因为如果直接写一个对象,组件复用的时候共用一个对象,容易引起问题)。
备注:使用template
可以配置组件结构。
1.1.4 如何注册组件
- 局部注册:靠
new Vue
的时候传入components
选项 - 局注册:靠
Vue.component('组件名',组件)
1.1.5 如何使用组件
编写组件标签,例如:<school></school>
1.2 注意点
1.2.1 关于组件名
一个单词组成:
- 第一种写法(首字母小写):
school
- 第二种写法(首字母大写):
School
多个单词组成:
- 第一种写法(
kebab-case
命名):my-school
- 第二种写法(
CamelCase
大驼峰命名):MySchool
(需要Vue脚手架支持
)
备注:
- 组件名尽可能回避
HTML
中已有的元素名称,例如:h2
、H2
都不行。 - 可以使用
name
配置项指定组件在开发者工具
中呈现的名字。
推荐使用的命令:School
和MySchool
1.2.2 关于组件标签
- 第一种写法:
<school>< /school>
- 第二种写法:
<school/>
备注:不用使用脚手架时,写第一个<school/>
渲染不会有问题,写超过一个<school/>
的时候,会导致后续的<school/>
组件不能渲染。
1.2.3 一个简写方式
const school = Vue.extend(options)
可简写为:const school = options
。
简写的形式,其底层还是会自动调用Vue.extend()
函数 。
三、非单文件组件
下面案例中,定义了三个组件:hello
、school
、student
,其中hello
为全局组件,而school
、student
为局部组件。
在定义组件的时候注意点:
- 不能使用
el
配置项 data
必须使用函数式,不能使用对象式
<div id="root"><h2>{{msg}}</h2><!-- 编写组件标签 --><school></school><hr><student></student><student></student></div>
<div id="root2"><hello></hello>
</div>
<script>// 创建全局hello组件const hello = Vue.extend({template:`<div><h2>我是全局{{name}}组件!</h2></div>`,data() {return {name:'Hello'}},})// 全局注册组件Vue.component('hello',hello)// 创建School组件const school = Vue.extend({// el:'root', //不能写el配置项template:`<div><h2>学校名称:{{schoolName}}</h2><h2>学校地址:{{address}}</h2> <button @click="showName">点我显示学校名</button></div>`,data() {return {schoolName: '南京大学',address: '江苏省南京市鼓楼区汉口路22号',}},methods: {showName(){alert(this.schoolName)}},})// 创建Student组件const student = Vue.extend({template:`<div><h2>学生姓名:{{studentName}}</h2><h2>学生年龄:{{age}}</h2></div>`,data() {return {studentName: '令狐冲',age: 20}},})new Vue({data:{msg:'非单文件组件使用'},el: '#root',components: {school, //相当于school: schoolstudent}})new Vue({el:'#root2'})
</script>
四、组件的嵌套
4.1 案例一
<div id="root"><!-- 编写组件标签 --><school></school><hello></hello>
</div><script>// 创建Student组件const student = Vue.extend({template:`<div><h2>学生姓名:{{studentName}}</h2><h2>学生年龄:{{age}}</h2></div>`,data() {return {studentName: '令狐冲',age: 20}},})// 创建School组件const school = Vue.extend({template:`<div><h2>学校名称:{{schoolName}}</h2><h2>学校地址:{{address}}</h2> <student></student></div>`,data() {return {schoolName: '南京大学',address: '江苏省南京市鼓楼区汉口路22号',}},components:{student}})// 创建hello组件const hello = Vue.extend({template:`<div><h2>我是{{name}}组件!</h2></div>`,data() {return {name:'hello'}},})// 创建vmnew Vue({el: '#root',// 局部注册组件components: {school, hello}})</script>
4.2 案例二
<div id="root"><!-- <app></app> -->
</div><script>// 创建Student组件const student = Vue.extend({template:`<div><h2>学生姓名:{{studentName}}</h2><h2>学生年龄:{{age}}</h2></div>`,data() {return {studentName: '令狐冲',age: 20}},})// 创建School组件const school = Vue.extend({template:`<div><h2>学校名称:{{schoolName}}</h2><h2>学校地址:{{address}}</h2> <student></student></div>`,data() {return {schoolName: '南京大学',address: '江苏省南京市鼓楼区汉口路22号',}},components:{student}})// 创建hello组件const hello = Vue.extend({template:`<div><h2>我是{{name}}组件!</h2></div>`,data() {return {name:'hello'}},})// 创建app组件const app = Vue.extend({template:`<div><school></school><hello></hello></div>`,components:{school,hello}})// 创建vmnew Vue({template:`<app></app>`,el: '#root',// 局部注册组件components: {app}})</script>
五、VueComponent()构造函数
5.1 案例分析
下面案例中打印了school
组件。
-
school
组件本质是一个名VueComponent
的构造函数,且不是程序员定义的,是Vue.extend
生成的。 -
我们只需要写
<school/>
或<school></school>
,Vue
解析时会帮我们创建school
组件的实例对象,即Vue
帮我们执行的:new VueComponent(options)
。 -
特别注意:每次调用
Vue.extend
,返回的都是一个全新的VueComponent
-
关于this指向:
- 组件配置中:
data
函数、methods
中的函数、watch
中的函数、computed
中的函数它们的this
均是【VueComponent实例对象
】 new Vue()
配置中:data
函数、methods
中的函数、watch
中的函数、computed
中的函数它们的this
均是【Vue实例对象
】。
- 组件配置中:
-
VueComponent
的实例对象,以后简称vc
(也可称之为:组件实例对象
)
vue
的实例对象,以后简称vm
。
// 创建School组件
const school = Vue.extend({template:`<div><h2>学校名称:{{schoolName}}</h2><h2>学校地址:{{address}}</h2> </div>`,data() {return {schoolName: '南京大学',address: '江苏省南京市鼓楼区汉口路22号',}},
})
console.log(school)
5.2 为什么每次调用Vue.extend,返回的是一个全新的VueComponent?
打开源码,查看Vue.extend()
函数定义,可以发现其最终返回的sub
,由此可见每次调用返回的都是一个全新的VueComponent()
函数
5.3 vm管理vc
打开控制台,输出vm,可以发现在vc存储在$children
属性上。
5.4 vm和vc
vm
和vc
不一样.
- 创建
vc
的时候,不能写el
,vm
可以 vc
的data
必须写成函数式,vm可以是对象式
六、一个重要的内置关系
6.1 显示/隐式原型属性、原型对象
显示原型属性
、隐式原型属性
指向同一个对象:原型对象
function Person(name) {this.name = name
}
const person = new Person('张三');// 显示原型属性
console.log(Person.prototype);// 隐式原型属性
console.log(person.__proto__);// 显示原型属性、隐式原型属性指向同一个对象:原型对象
console.log(Person.prototype === person.__proto__); //truePerson.prototype.age = 25;
console.log(person.age); //25
6.2 内置关系
一个重要的内置关系:VueComponent.prototype._proto_=== Vue.prototype
为什么要有这个关系?是为了让组件实例对象(vc)
可以访问到Vue原型
上的属性、方法。
下面案例中,证明了这个重要的内置关系。即:school.prototype.__proto__ == Vue.prototype
<div id="root"><!-- 编写组件标签 --><school></school>
</div><script>// 创建School组件const school = Vue.extend({template:`<div><h2>学校名称:{{schoolName}}</h2><h2>学校地址:{{address}}</h2> </div>`,data() {return {schoolName: '南京大学',address: '江苏省南京市鼓楼区汉口路22号',}},})// trueconsole.log(school.prototype.__proto__ == Vue.prototype)// 创建vmnew Vue({el: '#root',// 局部注册组件components: {school, }})</script>
6.3 关系分析图
Vue
和VueComponent
的关系分析图如下:
七、单文件组件
7.1 安装Vetur插件
在VSCode
中安装Vetur
插件.
安装完成后,输入<v
回车就会自动生成相关代码
7.2 案例
下面案例最终的目录结构如下:
7.2.1 School.vue
<template><div class="demo"><h2>学校名称:{{ schoolName }}</h2><h2>学校地址:{{ address }}</h2><button @click="showName">点我显示学校名</button></div>
</template><script>
export default {name: 'School',data() {return {schoolName: "南京大学",address: "江苏省南京市鼓楼区汉口路22号",};},methods: {showName() {alert(this.schoolName);},},
};
</script><style>
.demo {background-color: orange;
}
</style>
7.2.2 Student.vue
<template><div><h2>学生姓名:{{name}}</h2><h2>学生年龄:{{age}}</h2></div>
</template><script>
export default {name: 'Student',data() {return {name: "令狐冲",age: 20,};}};
</script>
7.2.3 App.vue
<template><div><School></School><Student></Student></div>
</template><script>
// 引入组件
import School from './School'
import Student from './Student'export default {name: 'App',components:{School,Student}
};
</script>
7.2.4 main.js
import App from './App'new Vue({el:'#root',template:`<App></App>`,comments:{App}
})
7.2.5 index.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div id="root"><!-- <App></App> --></div><script src="../../lib/vue.js"></script><script src="./main.js"></script>
</body>
</html>
相关文章:

第15集丨Vue 江湖 —— 组件
目录 一、为什么需要组件1.1 传统方式编写应用1.2 使用组件方式编写应用1.3 Vue的组件管理 二、Vue中的组件1.1 基本概念1.1.1 组件分类1.1.2 Vue中使用组件的三大步骤:1.1.3 如何定义一个组件1.1.4 如何注册组件1.1.5 如何使用组件 1.2 注意点1.2.1 关于组件名1.2.2 关于组件标…...

【JVM】CPU飙高排查方案与思路
文章目录 CPU飙高排查方案与思路 CPU飙高排查方案与思路 1.使用top命令查看占用cpu的情况 2.通过top命令查看后,可以查看是哪一个进程占用cpu较高,上图所示的进程为:40940 3.查看进程中的线程信息 4.可以根据进程 id 找到有问题的线程&a…...

使用公网访问内网IIS网站服务器【无需公网IP】
使用公网访问内网IIS网站服务器【无需公网IP】 文章目录 使用公网访问内网IIS网站服务器【无需公网IP】前言1. 注册并安装cpolar2. 创建隧道映射3. 获取公网地址 前言 这里介绍通过内网穿透,实现公网访问内网IIS网站服务器。 都知道,现在基本不会被分配…...

Vim学习(二)—— 编译C程序
打开终端,这里以MobaXterm为例, 邮件创建新的空文件并命名, 然后cd到对应路径下,用 vim hello.cvim打开创建的文件,进入编辑模式,编辑完程序后按Esc退出编辑模式,输入 :wq保存并退出…...
【maven】常见命令
文章目录 1. 打包编译时跳过测试2.显示maven依赖树3. 显示maven依赖列表4. 下载依赖包的源码5. 安装本地jar到本地仓库 1. 打包编译时跳过测试 mvn clean install -DskipTests mvn clean install -Dmaven.test.skiptrueDskipTests,不执行测试用例,但编译…...
vue单项数据传输流式回复功能,post传值可关闭请求(@microsoft/fetch-event-source)
需求:实现一个类似于文心一言ai回复功能,一个字一个字往外蹦,不使用websocket还有什么其他方案呢?经过查询有一个 microsoft/fetch-event-source单向传输协议(服务端传输客户端)。废话不多说,上…...
“深入探究JVM内部机制:理解Java虚拟机的工作原理“
标题:深入探究JVM内部机制:理解Java虚拟机的工作原理 摘要:本文将深入分析Java虚拟机(JVM)的工作原理,包括类加载、内存管理、垃圾回收和即时编译等方面。通过详细解释这些概念,并给出示例代码…...

ubuntu18.04下配置muduoC++11环境
1.安装muduo依赖的编译工具及库 Cmake sudo apt-get install cmakeBoost sudo apt-get install libboost-dev libboost-test-devcurl、c-ares DNS、google protobuf sudo apt-get install libcurl4-openssl-dev libc-ares-dev sudo apt-get install protobuf-compiler libp…...

leetcode 力扣刷题 数组交集(数组、set、map都可实现哈希表)
数组交集 349. 两个数组的交集排序+双指针数组实现哈希表unordered_setunordered_map 350. 两个数组的交集Ⅱ排序 双指针数组实现哈希表unordered_map 349. 两个数组的交集 题目链接:349. 两个数组的交集 题目内容如下,理解题意:…...

JVM元空间溢出的排除思路
背景: java的应用我们为了防止元空间的无限扩展,一般都会设置MaxMetaSpace参数,一般来说只要这个值是512M或者1G左右就足够了,不过今天遇到一个meta空间溢出问题,简单记录下排除的思路 meta元空间溢出 最开始的现象…...
vue+java实现在线播放mp4视频
java: 读取本地视频文件的流然后给response的输出流 File file new File("/Users/zhangqingtian/Documents/水库/Floodforecast/static/" videoName);BufferedInputStream inputStream new BufferedInputStream(new FileInputStream(file));response.setContentT…...
手机两个卡槽的正确使用方法,您用对了吗?
手机上有两个卡槽,该如何搭配才能使话费降到最低?你又是怎么搭配的? 这篇文章小编就来告诉你,如何在不换号的情况下,将自己的话费降到最低。 首先卡槽一我们就用8元保号套餐。 卡槽二,我们就可以办理一张…...

PyTorch翻译官网教程-NLP FROM SCRATCH: CLASSIFYING NAMES WITH A CHARACTER-LEVEL RNN
官网链接 NLP From Scratch: Classifying Names with a Character-Level RNN — PyTorch Tutorials 2.0.1cu117 documentation 使用CHARACTER-LEVEL RNN 对名字分类 我们将建立和训练一个基本的字符级递归神经网络(RNN)来分类单词。本教程以及另外两个“from scratch”的自然…...

基于注意力神经网络的深度强化学习探索方法:ARiADNE
ARiADNE:A Reinforcement learning approach using Attention-based Deep Networks for Exploration 文章目录 ARiADNE:A Reinforcement learning approach using Attention-based Deep Networks for Exploration机器人自主探索(ARE)ARE的传统边界法非短视路径深度强化学习的方…...

Martin_DHCP_V3.0 (DHCP自动化泛洪攻击GUI)
Github>https://github.com/MartinxMax/Martin_DHCP_V3.0 首页 Martin_DHCP_V3.0 自动化DHCP洪泛攻击 Martin_DHCP_V3.0 使用方法 安装三方库 #python3 1.RunMe_Install_Packet.py 攻击路由器 #python3 Martin_DHCP_Attack.py 填写网卡 填写攻击次数 开始运行...

vscode vue3+vite 配置eslint
vue2webpackeslint配置 目前主流项目都在使用vue3vite,因此针对eslint的配置做了一下总结。 引入ESlint、pritter 安装插件,执行以下命令 // eslint // prettier // eslint-plugin-vue // eslint-config-prettier // eslint-plugin-prettier yarn ad…...

【C++学习手札】一文带你初识运算符重载
食用指南:本文在有C基础的情况下食用更佳 🍀本文前置知识: C类 ♈️今日夜电波:クリームソーダとシャンデリア—Edo_Ame江户糖 1:20 ━━━━━━️💟──────── 3:40 …...

javaScript:数组检测
目录 一.前言 二.数组检测方法 1.every() 2.some() 3.filter() 一.前言 数组检测是指在编程中对数组进行验证和检查的过程。数组检测可以涉及以下方面: 确定数组的存在:在使用数…...

【JavaEE基础学习打卡02】是时候了解Java EE了!
目录 前言一、为什么要学习Java EE二、Java EE规范介绍1.什么是规范?2.什么是Java EE规范?3.Java EE版本 三、Java EE应用程序模型1.模型前置说明2.模型具体说明 总结 前言 📜 本系列教程适用于 Java Web 初学者、爱好者,小白白。…...
LeetCode 2813. Maximum Elegance of a K-Length Subsequence【反悔贪心】2582
本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…...

【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...

C++实现分布式网络通信框架RPC(2)——rpc发布端
有了上篇文章的项目的基本知识的了解,现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...

Sklearn 机器学习 缺失值处理 获取填充失值的统计值
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...
土建施工员考试:建筑施工技术重点知识有哪些?
《管理实务》是土建施工员考试中侧重实操应用与管理能力的科目,核心考查施工组织、质量安全、进度成本等现场管理要点。以下是结合考试大纲与高频考点整理的重点内容,附学习方向和应试技巧: 一、施工组织与进度管理 核心目标: 规…...
flow_controllers
关键点: 流控制器类型: 同步(Sync):发布操作会阻塞,直到数据被确认发送。异步(Async):发布操作非阻塞,数据发送由后台线程处理。纯同步(PureSync…...