第 2 章:Vue 组件化编程

news2025/2/28 13:56:57

目录

模块与组件、模块化与组件化

模块

组件

模块化

组件化

非单文件组件

小结

组件的几个注意点

组件的嵌套

VueComponent构造函数

小结

一个重要的内置关系

小结

 单文件组件

一个.vue 文件的组成(3 个部分)

1. 模板页面

2. JS 模块对象

3. 样式

基本使用


模块与组件、模块化与组件化

模块

1. 理解: 向外提供特定功能的 js 程序, 一般就是一个 js 文件
2. 为什么: js 文件很多很复杂
3. 作用: 复用 js, 简化 js 的编写, 提高 js 运行效率

组件

1. 理解: 用来实现局部(特定)功能效果的代码集合(html/css/js/image…..)
2. 为什么: 一个界面的功能很复杂
3. 作用: 复用编码, 简化项目编码, 提高运行效率

模块化

当应用中的 js 都以模块来编写的, 那这个应用就是一个模块化的应用。

组件化

当应用中的功能都是多组件的方式来编写的, 那这个应用就是一个组件化的应用,。

非单文件组件

1. 模板编写没有提示
2. 没有构建过程, 无法将 ES6 转换成 ES5
3. 不支持组件的 CSS
4. 真正开发中几乎不用
基本使用代码:
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>基本使用</title>
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!-- 准备好一个容器-->
		<div id="root">
			<hello></hello>
			<hr>
			<h1>{{msg}}</h1>
			<hr>
			<!-- 第三步:编写组件标签 -->
			<school></school>
			<hr>
			<!-- 第三步:编写组件标签 -->
			<student></student>
		</div>

		<div id="root2">
			<hello></hello>
		</div>
	</body>

	<script type="text/javascript">
		Vue.config.productionTip = false

		//第一步:创建school组件
		const school = Vue.extend({
			template:`
				<div class="demo">
					<h2>学校名称:{{schoolName}}</h2>
					<h2>学校地址:{{address}}</h2>
					<button @click="showName">点我提示学校名</button>	
				</div>
			`,
			// el:'#root', //组件定义时,一定不要写el配置项,因为最终所有的组件都要被一个vm管理,由vm决定服务于哪个容器。
			data(){
				return {
					schoolName:'尚硅谷',
					address:'北京昌平'
				}
			},
			methods: {
				showName(){
					alert(this.schoolName)
				}
			},
		})

		//第一步:创建student组件
		const student = Vue.extend({
			template:`
				<div>
					<h2>学生姓名:{{studentName}}</h2>
					<h2>学生年龄:{{age}}</h2>
				</div>
			`,
			data(){
				return {
					studentName:'张三',
					age:18
				}
			}
		})
		
		//第一步:创建hello组件
		const hello = Vue.extend({
			template:`
				<div>	
					<h2>你好啊!{{name}}</h2>
				</div>
			`,
			data(){
				return {
					name:'Tom'
				}
			}
		})
		
		//第二步:全局注册组件
		Vue.component('hello',hello)

		//创建vm
		new Vue({
			el:'#root',
			data:{
				msg:'你好啊!'
			},
			//第二步:注册组件(局部注册)
			components:{
				school,
				student
			}
		})

		new Vue({
			el:'#root2',
		})
	</script>
</html>

小结

Vue中使用组件的三大步骤:

 一、定义组件(创建组件)

 二、注册组件

 三、使用组件(写组件标签)

 一、如何定义一个组件?

 使用Vue.extend(options)创建,其中options和new Vue(options)时传入的那个options几乎一样,但也有点区别;

区别如下:

1.el不要写,为什么? ——— 最终所有的组件都要经过一个vm的管理,由vm中的el决定服务哪个容器。

2.data必须写成函数,为什么? ———— 避免组件被复用时,数据存在引用关系。

备注:使用template可以配置组件结构。

二、如何注册组件?

1.局部注册:靠new Vue的时候传入components选项

2.全局注册:靠Vue.component('组件名',组件)

三、编写组件标签:

 <school></school>

组件的几个注意点

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>几个注意点</title>
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!-- 准备好一个容器-->
		<div id="root">
			<h1>{{msg}}</h1>
			<school></school>
		</div>
	</body>

	<script type="text/javascript">
		Vue.config.productionTip = false
		
		//定义组件
		const s = Vue.extend({
			name:'atguigu',
			template:`
				<div>
					<h2>学校名称:{{name}}</h2>	
					<h2>学校地址:{{address}}</h2>	
				</div>
			`,
			data(){
				return {
					name:'尚硅谷',
					address:'北京'
				}
			}
		})

		new Vue({
			el:'#root',
			data:{
				msg:'欢迎学习Vue!'
			},
			components:{
				school:s
			}
		})
	</script>
</html>

 1.关于组件名:

一个单词组成:

第一种写法(首字母小写):school

 第二种写法(首字母大写):School

多个单词组成:

 第一种写法(kebab-case命名):my-school

 第二种写法(CamelCase命名):MySchool (需要Vue脚手架支持)

  备注:

(1).组件名尽可能回避HTML中已有的元素名称,例如:h2、H2都不行。

(2).可以使用name配置项指定组件在开发者工具中呈现的名字。

2.关于组件标签:

第一种写法:<school></school>

 第二种写法:<school/>

 备注:不用使用脚手架时,<school/>会导致后续组件不能渲染。

3.一个简写方式:

 const school = Vue.extend(options) 可简写为:const school = options

组件的嵌套

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>组件的嵌套</title>
		<!-- 引入Vue -->
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!-- 准备好一个容器-->
		<div id="root">
			<app></app>
		</div>
	</body>

	<script type="text/javascript">
		Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

		//定义student组件
		const student = Vue.extend({
			name:'student',
			template:`
				<div>
					<h2>学生姓名:{{name}}</h2>	
					<h2>学生年龄:{{age}}</h2>	
				</div>
			`,
			data(){
				return {
					name:'尚硅谷',
					age:18
				}
			}
		})
		
		//定义school组件
		const school = Vue.extend({
			name:'school',
			template:`
				<div>
					<h2>学校名称:{{name}}</h2>	
					<h2>学校地址:{{address}}</h2>	
					<student></student>
				</div>
			`,
			data(){
				return {
					name:'尚硅谷',
					address:'北京'
				}
			},
			//注册组件(局部)
			components:{
				student
			}
		})

		//定义hello组件
		const hello = Vue.extend({
			template:`<h1>{{msg}}</h1>`,
			data(){
				return {
					msg:'欢迎来到尚硅谷学习!'
				}
			}
		})
		
		//定义app组件
		const app = Vue.extend({
			template:`
				<div>	
					<hello></hello>
					<school></school>
				</div>
			`,
			components:{
				school,
				hello
			}
		})

		//创建vm
		new Vue({
			el:'#root',
			//注册组件(局部)
			components:{app}
		})
	</script>
</html>

VueComponent构造函数

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>VueComponent</title>
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!-- 准备好一个容器-->
		<div id="root">
			<school></school>
			<hello></hello>
		</div>
	</body>

	<script type="text/javascript">
		Vue.config.productionTip = false
		
		//定义school组件
		const school = Vue.extend({
			name:'school',
			template:`
				<div>
					<h2>学校名称:{{name}}</h2>	
					<h2>学校地址:{{address}}</h2>	
					<button @click="showName">点我提示学校名</button>
				</div>
			`,
			data(){
				return {
					name:'尚硅谷',
					address:'北京'
				}
			},
			methods: {
				showName(){
					console.log('showName',this)
				}
			},
		})

		const test = Vue.extend({
			template:`<span>atguigu</span>`
		})

		//定义hello组件
		const hello = Vue.extend({
			template:`
				<div>
					<h2>{{msg}}</h2>
					<test></test>	
				</div>
			`,
			data(){
				return {
					msg:'你好啊!'
				}
			},
			components:{test}
		})


		// console.log('@',school)
		// console.log('#',hello)

		//创建vm
		const vm = new Vue({
			el:'#root',
			components:{school,hello}
		})
	</script>
</html>

小结

关于VueComponent:

1.school组件本质是一个名为VueComponent的构造函数,且不是程序员定义的,是Vue.extend生成的。

2.我们只需要写<school/>或<school></school>,Vue解析时会帮我们创建school组件的实例对象,即Vue帮我们执行的:new VueComponent(options)。

3.特别注意:每次调用Vue.extend,返回的都是一个全新的VueComponent!!!!

 4.关于this指向:

 (1).组件配置中:

data函数、methods中的函数、watch中的函数、computed中的函数 它们的this均是【VueComponent实例对象】。

 (2).new Vue(options)配置中:

data函数、methods中的函数、watch中的函数、computed中的函数 它们的this均是【Vue实例对象】。

 5.VueComponent的实例对象,以后简称vc(也可称之为:组件实例对象)。

 Vue的实例对象,以后简称vm。

一个重要的内置关系

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>一个重要的内置关系</title>
		<!-- 引入Vue -->
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!-- 
				1.一个重要的内置关系:VueComponent.prototype.__proto__ === Vue.prototype
				2.为什么要有这个关系:让组件实例对象(vc)可以访问到 Vue原型上的属性、方法。
		-->
		<!-- 准备好一个容器-->
		<div id="root">
			<school></school>
		</div>
	</body>

	<script type="text/javascript">
		Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
		Vue.prototype.x = 99

		//定义school组件
		const school = Vue.extend({
			name:'school',
			template:`
				<div>
					<h2>学校名称:{{name}}</h2>	
					<h2>学校地址:{{address}}</h2>	
					<button @click="showX">点我输出x</button>
				</div>
			`,
			data(){
				return {
					name:'尚硅谷',
					address:'北京'
				}
			},
			methods: {
				showX(){
					console.log(this.x)
				}
			},
		})

		//创建一个vm
		const vm = new Vue({
			el:'#root',
			data:{
				msg:'你好'
			},
			components:{school}
		})

		
		//定义一个构造函数
		/* function Demo(){
			this.a = 1
			this.b = 2
		}
		//创建一个Demo的实例对象
		const d = new Demo()

		console.log(Demo.prototype) //显示原型属性

		console.log(d.__proto__) //隐式原型属性

		console.log(Demo.prototype === d.__proto__)

		//程序员通过显示原型属性操作原型对象,追加一个x属性,值为99
		Demo.prototype.x = 99

		console.log('@',d) */

	</script>
</html>

小结

1.一个重要的内置关系:VueComponent.prototype.__proto__ === Vue.prototype

2.为什么要有这个关系:让组件实例对象(vc)可以访问到 Vue原型上的属性、方法。

 单文件组件

一个.vue 文件的组成(3 个部分)

1. 模板页面

<template>
页面模板
</template>

2. JS 模块对象

<script>
export default {
data() {return {}},
methods: {},
computed: {},
components: {}
}
</script>

3. 样式

<style>
样式定义
</style>

基本使用

1. 引入组件
2. 映射成标签
3. 使用组件标签

看“19_单文件组件”代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/581644.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:Python中4+5的结果是多少?

Python中45的结果是多少&#xff1f; Python是一种高级的编程语言&#xff0c;由它所支持的各种库和框架&#xff0c;可以对不同的业务场景进行快速、高效的处理。在Python中&#xff0c;基本的运算符包括加、减、乘、除等&#xff0c;其中加操作是一个非常基本的操作&#xf…

chatgpt赋能python:Python中isin函数的使用方法

Python中isin函数的使用方法 Python是一种流行的编程语言&#xff0c;被广泛使用于数据分析、Web应用程序和游戏开发等领域。其中&#xff0c;Python的算法和数据结构库为程序员提供了实用的工具&#xff0c;使得数据的筛选、排序和搜索操作更加简易。Python之中的isin函数&am…

浅尝RTSP

RTSP (real time streaming protocol) RTC2326 RTSP 实时流传输协议,是TCP/IP 协议体系中的一个应用层协议,由哥伦比亚大学, 网景和realnetworks公司提交的IETF RTC 标准&#xff0c;该协议定义了一对多应用程序如何有效地通过IP网络传送多媒体数据。 RTSP在体系结构上位于 rtp…

二分搜索树层序遍历

二分搜索树的层序遍历&#xff0c;即逐层进行遍历&#xff0c;即将每层的节点存在队列当中&#xff0c;然后进行出队&#xff08;取出节点&#xff09;和入队&#xff08;存入下一层的节点&#xff09;的操作&#xff0c;以此达到遍历的目的。 通过引入一个队列来支撑层序遍历…

【SpringBoot】整合Mybatis-Plus并输出SQL日志

目录 本地开发环境说明pom.xml主要依赖application.yml主要配置MapperScan注解使用说明实体类示例Mapper接口示例Service接口示例Service接口实现类示例单元测试示例打印SQL日志使用slf4j打印SQL 总结 本地开发环境说明 开发依赖版本Spring Boot3.0.6Mybatis-Plus3.5.3.1JDK20…

git客户端的使用

1. git 分布式版本控制工具。 具有中央服务器仓库和本地仓库。 客户端下载&#xff1a;GitHub Desktop | Simple collaboration from your desktop 2. git的使用 2.1 修改操作本地仓库的用户信息 2.2 创建本地仓库 左上角&#xff1a;File - New repository 本地的两个仓库…

chatgpt赋能python:Python中4.5/2:浮点数除法的谬误

Python中4.5/2&#xff1a;浮点数除法的谬误 在Python中&#xff0c;当我们尝试对两个整数进行除法运算时&#xff0c;通常可以得到预期的正确结果。但是&#xff0c;当我们的被除数或者除数是浮点数时&#xff0c;可能会遇到令人疑惑的结果。 例如&#xff0c;执行4.5/2的计…

chatgpt赋能python:Python中Delete的用法及其重要性

Python中Delete的用法及其重要性 Python是一种强大的编程语言&#xff0c;它提供了许多强大的工具和API&#xff0c;帮助程序员轻松编写高效的代码。其中&#xff0c;Delete是Python语言中一个非常重要的关键字&#xff0c;用于删除对象和变量。 Delete的用法 Delete作为Pyt…

chatgpt赋能python:Python中IDLE怎么执行代码

Python中IDLE怎么执行代码 介绍 作为一种非常流行的编程语言&#xff0c;Python可以编写各种应用程序&#xff0c;从自动化脚本到网站后端。无论您是一个新手还是一个经验丰富的程序员&#xff0c;您都可能会使用Python编程语言来完成您的工作。 一个好的Python IDE可以大大…

sql的各种排序(order by加asc或者desc、order by加field()加asc或者desc)

sql的各种排序&#xff08;order by加asc或者desc、order by加field()加asc或者desc&#xff09; 1.单字段排序&#xff1b; 【order by】排序&#xff1a;order by后面跟着的字段就是数据的排序字段&#xff1b; &#xff08;1&#xff09;升序排序&#xff1b; 举例&#x…

c++—封装:构造函数、析构函数、成员操作

1. 封装的主要目的是解决代码的维护性问题&#xff0c;经过封装的函数代码独立性高&#xff1b; 2. 封装的演变历史&#xff0c;以栈为例子介绍&#xff1a; ①成员&#xff08;top、data[ ]&#xff09;都在main函数里&#xff0c;动作方法&#xff08;push、pop&#xff09;…

力扣sql中等篇练习(二十八)

力扣sql中等篇练习(二十八) 1 每个城市最高气温的第一天 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # Write your MySQL query statement below SELECT w.city_id,MIN(w.day) day,w.degree FROM Weather w INNER JOIN (SELECT city_id,MAX(degr…

chatgpt赋能python:Python中keys的概述

Python中keys的概述 在Python中&#xff0c;字典&#xff08;dictionary&#xff09;是一种非常常见的数据结构&#xff0c;它由一系列键&#xff08;keys&#xff09;和对应值&#xff08;values&#xff09;组成。键是唯一的&#xff0c;而值可以重复。在字典中&#xff0c;…

Lucene基础学习

一、基础知识 1.Lucene简介 2.入门实例 3.内建Query对象 4.分析器Analyzer 5.Query Parser 6.索引 7.排序 8.过滤 9.概念简介 10.Lucene入门实例 二、Lucene的基础 三、索引建立 1.lucene索引_创建_域选项 2.lucene索引_的删除和更新 3.lucene索引_加权操作和Luke的简单演示…

msvcp140.dll丢失怎么办?msvcp140.dll重新安装的解决方法

msvcp140.dll是微软编译器系统中的一个动态链接库文件&#xff0c;它存储了许多的代码和数据&#xff0c;能帮助计算机程序正常运行。当系统中出现了msvcp140.dll丢失的情况时&#xff0c;则会出现程序无法正常运行的错误。这篇文章将为大家介绍如何解决msvcp140.dll丢失的问题…

WookTeam是一款轻量级的开源在线团队协作工具

产品介绍 English Documentation wookteam 是一款轻量级的在线团队协作工具&#xff0c;提供各类文档工具、在线思维导图、在线流程图、项目管理、任务分发&#xff0c;知识库管理等工具。wookteam 支持团队在线聊天沟通&#xff0c;订阅任务动态实时推送。wookteam 全部开源…

JavaScript实现用while语句来计算1-10的和的代码

以下为实现用while语句来计算1-10的和的程序代码和运行截图 目录 前言 一、用while语句来计算1-10的和 1.1 运行流程及思想 1.2 代码段 1.3 JavaScript语句代码 1.4 运行截图 前言 1.若有选择&#xff0c;您可以在目录里进行快速查找&#xff1b; 2.本博文代码可以根据…

chatgpt赋能python:Python中的Dayup:如何用编程实现日益进步?

Python中的Dayup&#xff1a;如何用编程实现日益进步&#xff1f; 在Python编程语言中&#xff0c;Dayup是一个非常受欢迎的概念&#xff0c;它代表了一种积极向上的生活态度&#xff0c;即每天都在不断进步。这一概念起源于一位中国作家的作品&#xff0c;被广泛应用于生活、…

哈希表(模拟散列表 字符串哈希)

目录 一、哈希表的概念二、模拟散列表题目代码实现①拉链法②开放寻址法 三、字符串哈希题目思路注意点代码实现 一、哈希表的概念 哈希表&#xff08;又称为散列表&#xff09;&#xff0c;将一个比较大的值域映射到一个小的范围。 例如有哈希函数 h(x)&#xff0c;将区间 [ …

点到直线距离

点到直线距离最小二乘解释 推倒部分 形象描述是C到AB距离最短&#xff0c;也就是CD最短用数学语言描述是 m i n ∣ ∣ ( B − A ) λ A − C ∣ ∣ min||(B-A) \lambda A - C || min∣∣(B−A)λA−C∣∣ 其中 D ( B − A ) λ A D (B-A) \lambda A D(B−A)λA,其实本质…