Vue非单文件组件

目录

Vue非单文件组件

几个注意点

组件的嵌套

关于VueComponent

重要的内置关系


Vue非单文件组件

Vue中使用组件的三大步骤:
一、定义组件(创建组件)
二、注册组件
三、使用组件(写组件标签)

一、如何定义一个组件?

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

区别如下:

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

2.data必须写成函数 ,为什么? ------------ 避免组件被复用时,数据存在引用关系。
备注:使用template可以配置组件结构。

必须只有一个根节点、要想换行必须要用模版字符串,不然只能写在一行上面(es6模版字符串)

二、如何注册组件?

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

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

三、编写组件标签:

<school></school>

几个注意点

组件的嵌套

html 复制代码
<!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">
			
		</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({
			template:'<app></app>',
			el:'#root',
			//注册组件(局部)
			components:{app}
		})
	</script>
</html>

关于VueComponent

1.school组件本质是一个名为VueComponent的构造函数,且不是程序员定义的,是Vue.extend生成的。调用Vue.extend,就相当于new了一个VueComponent的实例对象

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

option参数就相当于(红色框)

3.特别注意:每次调用Vue.extend,返回的都是一个全新的VueComponent!!!!就是每次只要用了自定义组件,就会调用一次Vue.extend,那么就会创建一个新的VueComponent

解释:查看Vue.extend源码可以发现,当调用到了Vue.extend的时候,都会给你返回一个VueComponent,而且是var现定义的,所以每次调用Vue.extend都会产生一个姓的VueComponent,不是共用一个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。

区别:vm可以通过el指定为哪个容器服务,vc不能通过el指定

重要的内置关系

VueComponent.prototype.proto === Vue.prototype

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

html 复制代码
<!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">
			<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)
				}
			},
		})

	</script>
</html>
相关推荐
2401_857636399 分钟前
医疗服务品质提升:SSM 与 Vue 打造医院预约挂号系统方案
前端·javascript·vue.js
疯狂的沙粒17 分钟前
前端开发 详解 Node. js 都有哪些全局对象?
开发语言·javascript
余生H1 小时前
前端的Python应用指南(一):快速构建 Web 服务器 - Flask vs Node.js 对比
服务器·前端·python
白瑕1 小时前
[JavaScript] 我该怎么去写一个canvas游戏
前端·javascript
m0_748248941 小时前
前端篇-Content-Type 详解
前端
m0_748255021 小时前
新手参加2025年CTF大赛——Web题目的基本解题流程
前端·网络·安全
憨憨小江1 小时前
Vue3 基础记录
前端
SANG嘻嘻嘻1 小时前
ES6中的map和set
前端·javascript·es6
fantasy_arch2 小时前
CPU性能优化--前端优化
前端·性能优化
粥里有勺糖2 小时前
视野修炼第114期 | 2024JS现状调查结果
前端·javascript·github