Vue:组件

组件

非单文件组件和单文件组件

非单文件组件:在一个文件中包含多个组件;实际开发基本不用
单文件组件:一个文件中只包含一个组件,等同于一个文件就是一个组件;实际开发用这种

非单文件组件使用

组件的使用分3步:创建,注册,使用;其中注册分为局部注册和全局注册。

创建,局部注册,使用

示例代码如下:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>基本使用</title>
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<div id="root">
			<!-- 第三步:编写组件标签 -->
			<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
				}
			}
		})
		
		//创建vm
		new Vue({
			el:'#root',
			data:{
				msg:'你好啊!'
			},
			//第二步:注册组件(局部注册)
			components:{
				school,
				student
			}
		})
	</script>
</html>
  1. 使用Vue.extend创建组件;记得不要写el选项
  2. 在父组件的components属性注册刚才的组件
  3. 在父组件中以html标签的形式使用

创建,全局注册,使用

<!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>
		</div>

		<div id="root2">
		<!-- 第三步:编写组件标签 -->
			<hello></hello>
		</div>
	</body>

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

		//第一步:创建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:'你好啊!'
			}
		})

		new Vue({
			el:'#root2',
		})
	</script>
</html>
  1. 使用Vue.extend创建组件;记得不要写el选项
  2. 使用Vue.component('hello',hello)注册全局组件,参数1为组件名,参数2为刚才创建的组件
  3. 在所有的vue实例组件的el容器上直接使用。全局组件直接可用于全部的vue实例组件

组件嵌套

<!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>

最终组件呈现的结构如下:
image

单文件组件使用

结构限定

单文件组件:一个.vue结尾的文件作为一个组件。文件里面的内容结构有作限定,如下:

<template>
	...
</template>

<script>
	...
</script>

<style>
	...
</style>

各结构内容编写规范

示例如下:

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

<script>
	 export default {
		name:'School',
		data(){
			return {
				name:'尚硅谷',
				address:'北京昌平'
			}
		},
		methods: {
			showName(){
				alert(this.name)
			}
		},
	}
</script>

<style>
	.demo{
		background-color: orange;
	}
</style>
  1. template中只能有一个根标签
  2. script标签里的唯一目的就是把创建的组件进行导出,方便其他组件导入使用;上面的方式是一种语法糖,为了方便大家看懂,下面演示下简化的流程:
	//原始
	  const School = Vue.extend({
		name:'School',
		data(){
			return {
				name:'尚硅谷',
				address:'北京昌平'
			}
		},
		methods: {
			showName(){
				alert(this.name)
			}
		},
	});
  export default School;
  
  	//简化
  	  export default Vue.extend({
		name:'School',
		data(){
			return {
				name:'尚硅谷',
				address:'北京昌平'
			}
		},
		methods: {
			showName(){
				alert(this.name)
			}
		},
	});
	
	//再简化
export default {
      name:'School',
      data(){
        return {
          name:'尚硅谷',
          address:'北京昌平'
        }
      },
      methods: {
        showName(){
          alert(this.name)
        }
      },
};
  1. 组件想要被使用必须export导出,组件想要使用其他组件import导入,不用使用new的方式

一个重要的内置关系

image

简单总结就是:所有组件实例对象都可以通过原型链到 Vue原型对象获取数据。

posted @ 2022-07-19 16:31  爱编程DE文兄  阅读(22)  评论(0编辑  收藏  举报