Vue——组件篇

Vue——组件篇

author:木子六日

学习视频来源于

coderwhy老师的vue教学

01.组件的基本使用

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>组件的基本使用</title>
	</head>
	<body>
		<!-- 
			1.创建组件构造器对象;
			2.注册组件;
			3.使用组件;
		 -->
		<div id="app">
			<!-- 3.使用组件 -->
			<cpn></cpn>
		</div>
		<script src="js/vue.js"></script>
		<script type="text/javascript">
			//1.创建组件构造器对象
			const cpn = Vue.extend({
				template:`
				<div>
					<h1>标题</h1>
					<p>哈哈哈哈哈哈</p>
					<p>呵呵呵呵呵呵</p>
				</div>
				`
			})
			//2.注册组件(这种是全局注册)
			//Vue.component('cpn',cpn)
			const app = new Vue({
				el:'#app',
				data:{
					
				},
				//这种是局部注册(只能在Vue实例管理的标签下使用)
				components:{
					cpn: cpn
				}
			})
		</script>
	</body>
</html>

02.父组件与子组件

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>父组件与子组件</title>
	</head>
	<body>
		<div id="app">
			<cpn2></cpn2>
		</div>
		<script src="js/vue.js"></script>
		<script type="text/javascript">
			const cpn1 = Vue.extend({
				template:`
				<div>
					<h1>我是组件1标题</h1>
					<p>哈哈哈哈</p>
				</div>
				`
			});
			const cpn2 = Vue.extend({
				template:`
				<div>
					<cpn1></cpn1>
					<h1>我是组件2标题</h1>
					<p>呵呵呵呵</p>
				</div>
				`,
				//将组件1注册为组件2的子组件
				components:{
					cpn1:cpn1
				}
			});
			const app = new Vue({
				el:'#app',
				components:{
					cpn2:cpn2
				}
			})
		</script>
	</body>
</html>

03.组件注册的语法糖

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>组件注册的语法糖</title>
	</head>
	<body>
		<div id="app">
			<cpn1></cpn1>
			<cpn2></cpn2>
		</div>
		<!-- 模板与js的分离写法 -->
		<script type="text/template" id="cpn1">
			<div>
				<h1>我是组件1标题</h1>
				<p>{{haha}}</p>
			</div>
		</script>
		<!-- 推荐一下这种模板分离写法 -->
		<template id="cpn2">
			<div>
				<h1>我是组件2标题</h1>
				<p>{{hehe}}</p>
			</div>
		</template>
		<script src="js/vue.js"></script>
		<script type="text/javascript">
			Vue.component('cpn2',{
				template:'#cpn2',
				//注意data必须是一个函数
				data(){
					return {
						hehe:'呵呵呵呵'
					}
				}
			})
			const app = new Vue({
				el:'#app',
				components:{
					//局部注册的语法糖
					cpn1:{
						template:'#cpn1',
						//这里也一样,组件注册时data必须写成函数而不是对象
						data(){
							return {
								haha:'哈哈哈哈'
							}
						}
					}
				}
			})
		</script>
	</body>
</html>

04.父子组件间的通信(父传子)

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>父子组件间的通信</title>
	</head>
	<body>
		<div id="app">
			<!-- 采用v-bind传入父组件数据 -->
			<cpn :cwords="words"></cpn>
		</div>
		
		<template id="cpn">
			<!-- 和data一样直接用{{}}引用 -->
			<div>
				{{cwords}}
			</div>
		</template>
		<script src="js/vue.js"></script>
		<script type="text/javascript">
			
			const app = new Vue({
				el:'#app',
				data:{
					words:['啊啊啊','哈哈哈','呵呵呵']
				},
				components:{
					cpn:{
						template:'#cpn',
						//通过props属性取得从父组件那里获取的数据
						//props:['cwords']
						//props也可以写成对象
						props:{
							//还有可以限制类型
							//cwords:Array,
							//还可以设置初始值
							cwords:{
								type: Array,
								//default: '123456'
								//如果是Object或Array,default必须写成函数
								default(){
									return ['a','b','c']
								}
							}
						}
					}
				}
			})
		</script>
	</body>
</html>

05.父子组件间的通信(子传父)

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>父子组件通信</title>
	</head>
	<body>
		<!-- 
			子传父步骤:
			1.子组件中添加监听事件(比如点击)
			2.子组件的监听方法中向父组件发送一个监听事件:this.$emit('btnclick',item)
			3.在父组件中的子组件上添加自定义的监听事件<cpn @btnclick="cpnclick"></cpn>
			4.完成父组件的监听方法。
			
			共有两个监听事件,两个监听方法要写。
			以下例子中:
				子组件事件:click
				子组件监听方法:itemclick(item) 定义在子组件中
				父组件事件:btnclick
				父组件监听方法:cpnclick  定义在父组件中参数可以不写
		 -->
		<div id="app">
			<cpn @btnclick="cpnclick"></cpn>
			<h2>{{temp}}</h2>
		</div>
		<template id="cpn">
			<div>
				<!-- 为按钮添加监听事件 -->
				<button v-for="item in categories" @click="itemclick(item)">{{item.name}}</button>
			</div>
		</template>
		<script src="js/vue.js"></script>
		<script type="text/javascript">
			const app = new Vue({
				el:'#app',
				data:{
					temp:''
				},
				methods:{
					//监听到事件后的响应函数
					cpnclick(item){
						this.temp = item.name
					}
				},
				components:{
					cpn:{
						template:'#cpn',
						data(){
							return {
								categories:[
									{id:'1',name:'热门推荐'},
									{id:'2',name:'家用电器'},
									{id:'3',name:'手机数码'},
									{id:'4',name:'电脑办公'}
								]
							}
						},
						methods:{
							itemclick(item){
								//向父组件发射数据,第一个参数是给父组件定义的监听名称,第二个参数是数据
								this.$emit('btnclick',item)
							}
						}
					}
				}
			})
		</script>
	</body>
</html>

06.父组件访问子组件

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>父组件访问子组件</title>
	</head>
	<body>
		<!-- 
			父组件可以直接通过$children[索引值]找到对应的子组件,然后就可以直接调属性或者方法
			但是$children这种方式用的并不多,用的更多的还是$refs
		 -->
		<div id="app">
			<!-- 给对应子组件加上ref标识 -->
			<cpn ref="aaa"></cpn>
			<button type="button" @click="btnClick">按钮</button>
		</div>
		<template id="cpn">
			<div>
				<h1>我是子组件</h1>
			</div>
		</template>
		<script src="js/vue.js"></script>
		<script type="text/javascript">
			const app = new Vue({
				el:'#app',
				methods:{
					btnClick(){
						console.log(this.$children[0].name);
						console.log(this.$children[0].showName());
						console.log(this.$refs.aaa.name)
						console.log(this.$refs.aaa.showName())
					}
				},
				components:{
					cpn:{
						template:'#cpn',
						data(){
							return {
								name:'我是子组件的name属性'
							}
						},
						methods:{
							showName(){
								return this.name;
							}
						}
					}
				}
			})
		</script>
	</body>
</html>

07.子组件访问父组件

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>子组件访问父组件</title>
	</head>
	<body>
		<div id="app">
			<cpn></cpn>
		</div>
		<template id="cpn">
			<button type="button" @click="btnClick">按钮</button>
		</template>
		<script src="js/vue.js"></script>
		<script type="text/javascript">
			const app = new Vue({
				el:'#app',
				data:{
					message:'我是父组件的属性'
				},
				components:{
					cpn:{
						template:'#cpn',
						methods:{
							btnClick(){
								//子组件访问父组件使用$parent即可
								console.log(this.$parent.message);
								//也可以通过$root直接访问根组件
								console.log(this.$root.message);
							}
						}
					}
				}
			})
		</script>
	</body>
</html>

08.slot插槽的基本使用

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>slot的基本使用</title>
	</head>
	<body>
		<div id="app">
			<cpn></cpn>
			<cpn><span>我是span</span></cpn>
			<cpn><p>我是p</p></cpn>
			<cpn></cpn>
			<hr >
			<cpn2><span slot="mid">我是插槽2</span></cpn2>
			<hr >
			<cpn3>
				<!-- 采用.data的方式拿到子组件数据 -->
				<template v-slot="slot">
					<span v-for="item in slot.data">{{item}}</span>
				</template>
			</cpn3>
		</div>
		<template id="cpn">
			<!-- 
				slot叫做插槽,代表slot里面可以放置不同的东西,使得同一组件可以变得不同
			 -->
			 <div>
			 	<h1>我是子组件</h1>
				<!-- slot内部写的就是默认值,也可以不写 -->
				<slot><button>按钮</button></slot>
			 </div>
		</template>
		<template id="cpn2">
			<!-- 
				如果有多个slot,而我们又想给指定的slot赋值的话,就要给插槽起名字了
			 -->
			 <div>
				<slot><button>我是插槽1</button></slot>
				<slot name="mid"><button>我是插槽2</button></slot>
				<slot><button>我是插槽3</button></slot>
			 </div>
		</template>
		<template id="cpn3">
			<div>
				<!-- 如果父组件想拿到数据,子组件里应该这样写 -->
				<slot :data="languages">
					
				</slot>
			</div>	
		</template>
		<script src="js/vue.js"></script>
		<script type="text/javascript">
			const app = new Vue({
				el:'#app',
				components:{
					cpn:{
						template:'#cpn'
					},
					cpn2:{
						template:'#cpn2'
					},
					cpn3:{
						template:'#cpn3',
						data(){
							return {
								languages:['C','C++','Java','Python','Go']
							}
						}
					}
				}
			})
		</script>
	</body>
</html>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值