Vue2 (六):使用组件的三大步骤

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

1.如何定义一个组件?

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

1).el不要写,为什么?

最终所有的组件都要经过一个vm的管理,由vm中的el决定服务哪个容器。

2).data必须写成函数,为什么?

避免组件被复用时,数据存在引用关系。
备注:使用template可以配置组件结构。

2.如何注册组件?

1).局部注册:靠new Vue的时候传入components选项
2).全局注册:靠Vue.component(‘组件名’,组件)

<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>
		<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: 'Elena'
			}
		}
	})
	//第二步:全局注册组件
	Vue.component('hello', hello)
	// 创建vm
	new Vue({
		el: '#root',
		data: {
			msg: '非常好'
		},
		// 第二步:注册组件(局部注册)
		components: {
			school: school,
			student: student
		}
	})
	new Vue({
		el: '#root2',
	})
</script>

3.编写组件标签:

直接写标签名字就可以

   <!-- 准备一个容器 -->
    <div id="root">
		<school></school>
    </div>

二、组件的几个注意点

1.关于组件名:

一个单词组成:
第一种写法(首字母小写):school
第二种写法(首字母大写):School
多个单词组成:
第一种写法(kebab-case命名):my-school
第二种写法(CamelCase命名):MySchool (大驼峰,需要Vue脚手架支持)

备注:

(1).组件名尽可能回避HTML中已有的元素名称,例如:h2、H2都不行。
(2).可以使用name配置项指定组件在开发者工具中呈现的名字。

	const s = Vue.extend({
		name: 'elena',
	})

2.关于组件标签:

第一种写法:<school></school>
第二种写法:<school/>(自闭合)需在脚手架环境下
备注:不用使用脚手架时,会导致后续组件不能渲染。

3.一个简写方式:

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

三、组件的嵌套

app引领hello和school,school引领student。父子关系
代码倒着看,先写student。
template 中的代码要包起来(div)
在这里插入图片描述

<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组件(含student)
	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组件(含hello、school)
	const app = Vue.extend({
		template: `
				<div>	
					<hello></hello>
					<school></school>
				</div>
			`,
		components: {
			school,
			hello
		}
	})

	//创建vm 只注册组件app即可,一人之下,万人之上
	new Vue({
		template: '<app></app>',
		el: '#root',
		//注册组件(局部)
		components: { app }
	})
</script>

四、VueComponent构造函数

1.什么是VueComponent?

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

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

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

2.VueComponent的this指向:

(1).组件配置中:

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

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

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

3.Vue实例与组件实例

VueComponent的实例对象,以后简称vc(也可称之为:组件实例对象)。不能写el,vc只能跟着vm混。data(){}必须写成函数
Vue的实例对象,以后简称vm。(功能相同,有数据代理、也有数据监视)。能写el,去指定容器。data{}或data(){}都行对象或函数都可。

4.一个重要的内置关系

1).一个重要的内置关系:VueComponent.prototype.proto === Vue.prototype
2).为什么要有这个关系:让组件实例对象(vc)可以访问到 Vue原型上的属性、方法。
继承
和js中的继承类似,红色线是父蓝色线是子。vue做了一个工作就是黄色的线,VueComponent用Vue接住了。
这里涉及了很多js高级的知识,后补。

五、单文件组件

1.School.vue

<template>
  <!-- 组件的结构 -->
  <div class="demo">
    <h2>学校名称:{{ name }}</h2>
    <h2>学校地址:{{ address }}</h2>
    <button @click="showName">点我提示学校名</button>
  </div>
</template>

<script>
// 组件交互相关的代码(数据、方法等等)
// 分别暴露
// export const school = Vue.extend({})//Vue.extend可以省略
// 默认暴露
export default {
  name: "School",
  data() {
    return {
      name: "程序媛大本营",
      address: "云南昆明",
    };
  },
  methods: {
    showName() {
      alert(this.name);
    },
  },
};
//统一暴露
// export { school };
//等价下面的代码
// const School = Vue.extend({
//     name: 'School',
//     data() {
//         return {
//             name: '程序媛大本营',
//             address: '云南昆明',
//         }
//     }
// })

</script>

<style>
/* 组件的样式 */
.demo {
  background-color: orange;
}
</style>

2.student.vue

<template>
	<div>
		<h2>学生姓名:{{name}}</h2>
		<h2>学生年龄:{{age}}</h2>
	</div>
</template>

<script>
	 export default {
		name:'Student',
		data(){
			return {
				name:'yl',
				age:18
			}
		}
	}
</script>

3.App.vue(重要)

<template>
	<div>
		<School></School>
		<Student></Student>
	</div>
</template>
<!-- 汇总组件 -->
<script>
	//引入组件
	import School from './School.vue'
	import Student from './Student.vue'

	export default {
		name:'App',
		components:{
			School,
			Student
		}
	}
</script>

4.main.js

import App from './App.vue'

new Vue({
	el:'#root',
	template:`<App></App>`,
	components:{App},
})

5.index.html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>练习一下单文件组件的语法</title>
	</head>
	<body>
		<!-- 准备一个容器 -->
		<div id="root"></div>
		<!-- <script type="text/javascript" src="../js/vue.js"></script> -->
		<!-- <script type="text/javascript" src="./main.js"></script> -->
	</body>
</html>

放入脚手架里面就能运行

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值