Vue组件

241 阅读1分钟

这是我参与11月更文挑战的第13天,活动详情查看:2021最后一次更文挑战

Vue组件

组件(component)是Vue.js最强大的功能之一,可以扩展HTML元素,封装可重用的代码。

全局组件

  • Vue.extend()是Vue构造器的扩展,调用Vue.extend()创建的是一个组件构造器,而不是一个具体的组件实例。
  • Vue.extend()构造器有一个选项对象,选项对象的template属性用于定义组件要渲染的HTML。
  • 使用Vue.component()注册组件时,需要提供2个参数,第1个参数是组件的标签,第2个参数是组件构造器。
  • Vue.component()方法内部会调用组件构造器,创建一个组件实例。·组件应该挂载到某个Vue实例下,否则它不会生效。
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="../js/vue.js"></script>
	</head>
	<body>
		<div id="app">
			<aa></aa>
			<bb></bb>
		</div>
		
		<script>
			//普通注册
			Vue.component('aa',
			{
				template:'<h1>123</h1>'
			},)
			//创建组件构造器
			var rong = Vue.extend({
				template:'<h2>123</h2>'
			})
			Vue.component('bb',rong)
			new Vue({
				el:"#app"
			})
		</script>
	</body>
</html>

image-20211112100115938

局部组件

调用Vue.component()注册组件时,组件的注册是全局的,这意味着该组件可以在任意Vue示例下使用。

可以用选项对象的components属性实现局部注册。

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="../js/vue.js"></script>
	</head>
	<body>
		<div id="app">
			<aa></aa>
		</div>
		<script>
			var rong={
				template:'<h1>abc</h1>'
				}
			new Vue({
				el:"#app",
				components:{
					'aa':rong
				}
			})
		</script>
	</body>
</html>

image-20211112101821901

props属性

props是父组件用来传递数据的一个自定义属性。父组件的数据需要通过props属性传给子组件,子组件需要显式地用props选项声明"props"。

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="../js/vue.js"></script>
	</head>
	<body>
		<div id="app">
			<aa txt="123"></aa>
			
		</div>
		
		<script>
			//普通注册
			Vue.component('aa',
			{
				props:['txt'],
				template:'<h1>{{txt}}</h1>'
			})

			new Vue({
				el:"#app"
			})
		</script>
	</body>
</html>

image-20211112102808408

动态props

类似于用v-bind绑定HTML特性到一个表达式,也可以用v-bind动态绑定props的值到父组件的数据中。当父组件的数据变化时,也会将该变化传递给子组件。

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="../js/vue.js"></script>
	</head>
	<body>
		<div id="app">
			<!-- 双向绑定属性 -->
			<input v-model="mess"/><br>
			{{mess}}
			<!-- 改变输入框的值 内容跟着改变 -->
			<aa v-bind:txt="mess"></aa>
		</div>
		<script>
			Vue.component('aa',{
				props:['txt'],
				template:'<h1>{{txt}}</h1>'
			})
			new Vue({
				el:"#app",
				data:{
					mess:''
				}
			})
		</script>
	</body>
</html>

image-20211112103545520