Vue组件的创建与通信

1.Vue组件创建的几种方式

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<div id="app">
		<!-- 在命名时组件名称可用驼峰命名法,但在使用时要用小写 -->
		<my-com1></my-com1>	
		<mycom2></mycom2>	
		<mycom3></mycom3>
		<mycom4></mycom4>		
	</div>
	
	<template id="templ">
		<div>
			<h3>这是通过template在外部定义的组件结构</h3>
			<h6>有代码的智能提示和高亮</h6>
		</div>
	</template>

	<div id="app2">
		<login></login>
	</div>

	<script type="text/javascript" src="./node_modules/vue/dist/vue.min.js"></script>

	<script type="text/javascript">
		//注意:不管用哪种方式创建组件,template属性指向的模板内容只能包含唯一的根元素
		var com1 = Vue.extend({
			template:'<h3>这是Vue.extend创建的组件</h3>'
		});
		//Vue.component('组件名称',创建出来的组件模板对象);
		Vue.component('myCom1',com1);

		//不使用中间对象来接收的写法
		Vue.component('mycom2',Vue.extend({
			template:'<h3>这是Vue.extend不使用中间对象创建的组件</h3>'
		}));

		Vue.component('mycom3',{
			template:'<h3>这是Vue.component创建的组件</h3>'
		});

		Vue.component('mycom4',{
			template:'#templ'
		});


	 	new Vue({
	 		el:'#app',
	 		data:{
	 		},
	 	});

	 	var vm2 = new Vue({
	 		el:'#app2',
	 		data:{
	 		},
	 		components:{
	 			login:{
	 				template:'<h3>这是私有组件</h3>'
	 			}
	 		}
	 	});
	</script>
	
</body>
</html>

2.局部组件:声明、挂载、使用

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<div id="app"></div>
	<script type="text/javascript" src="./node_modules/vue/dist/vue.min.js"></script>
	<script type="text/javascript">
		//局部组件:声明、挂载、使用
		//入口组件的声明
		var Apps = {  //预防使用时与HTML的标签混淆,建议组件名首字母大写。声明时用驼峰命名,使用时可用小写,如:声明AppName 使用app-name
			data(){
				return{

				}
			},
			template:`
				<div>
					我是入口组件
				</div>
			`
		}
		var vm = new Vue({
			el:'#app',
			data(){
				return{

				}
			},
			//挂载子组件
			components:{
				App11:Apps
				// Apps
			},
			//父组件可以直接使用
			template:`
				<App11></App11>
				<!--<Apps></Apps>-->
			`
		});
	</script>
	
</body>
</html>

3.全局组件

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<style type="text/css">
		.default{

		}
		.primary{
			background-color: blue;
		}
		.success{
			background-color: green;
		}
	</style>
</head>
<body>
	<div id="app"></div>
	<script type="text/javascript" src="./node_modules/vue/dist/vue.min.js"></script>
	<script type="text/javascript">
		//全局组件
		Vue.component('Vbtn',{
			template:`
			<!--插槽 内置组件slot 作为承载分发内容的出口-->
				<button class="default" :class="type">
					<slot>
						按钮
					</slot>
				</button>
			`,
			props:['type']
		});
		//局部组件:声明、挂载、使用
		var Vheader = {  
			data(){
				return{

				}
			},
			template:`
				<div>
					我是头部组件
				</div>
			`
		}

		var Vasider = {  
			data(){
				return{

				}
			},
			template:`
				<div>
					我是侧边组件
				</div>
			`
		}

		var Vcontent = {  
			data(){
				return{

				}
			},
			template:`
				<div>
					我是内容组件
					<Vbtn type="primary">普通</Vbtn>
					<Vbtn type="success">成功</Vbtn>
					<Vbtn/>
				</div>
			`
		}

		var App = {  
			data(){
				return{

				}
			},
			template:`
				<div>
					<Vheader/>
					<div>
						<Vasider/>
						<Vcontent/>
					</div>
				</div>
			`
			,
			components:{
				Vheader,
				Vasider,
				Vcontent
			},
		}
		var vm = new Vue({
			el:'#app',
			data(){
				return{

				}
			},
			//挂载子组件
			components:{
				App
			},
			//父组件可以直接使用
			template:`
				<App></App>
			`
		});
	</script>
	
</body>
</html>

4.通过prop往子组件通信

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<div id="app"></div>
	<script type="text/javascript" src="./node_modules/vue/dist/vue.min.js"></script>
	<script type="text/javascript">
		//全局组件
		Vue.component('Child',{
			template:`
				<div>
					<p>我是一个孩子组件</p>
					<p>{{childData}}</p>   <!--3.在子组件中使用属性-->
					<input type="text" v-model='childData'/>
				</div>
			`
			,
			props:['childData']  //2.在子组件中用props接收父组件传递的数据
		});

		Vue.component('Parent',{
			data(){
				return{
					msg:"我是父组件的数据" 
				}
			},
			template:`
				<div>
					<p>我是一个父组件</p>
					<Child v-bind:childData = 'msg'/> <!--1.在父组件中绑定自定义属性-->
				</div>
			`
		});
		
		var App = {  
			data(){
				return{

				}
			},
			template:`
				<div>
					<Parent/>
				</div>
			`
			,
			components:{
			},
		}
		var vm = new Vue({
			el:'#app',
			data(){
				return{

				}
			},
			//挂载子组件
			components:{
				App
			},
			//父组件可以直接使用
			template:`
				<App></App>
			`
		});
	</script>
	
</body>
</html>

5.通过事件向子组件发送消息

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<div id="app"></div>
	<script type="text/javascript" src="./node_modules/vue/dist/vue.min.js"></script>
	<script type="text/javascript">
		//全局组件
		Vue.component('Child',{
			template:`
				<div>
					<p>我是一个孩子组件</p>
					<input type="text" v-model='childData' @input = 'changeValue(childData)'/> <!--2.在子组件中触发原生事件-->
				</div>
			`
			,
			props:["childData"],
			methods:{
				changeValue(val){
					this.$emit('childHandler',val)         //在函数中用$emit触发childHandler
				}
			}
		});

		Vue.component('Parent',{
			data(){
				return{
					msg:"我是父组件的数据" 
				}
			},
			template:`
				<div>
					<p>我是一个父组件</p>
					<Child v-bind:childData = 'msg' @childHandler = 'childHandler'/> <!--1.在父组件中绑定自定义事件-->
				</div>
			`
			,
			methods:{
				childHandler(val){
					console.log(val);
				}
			}
		});
		
		var App = {  
			data(){
				return{

				}
			},
			template:`
				<div>
					<Parent/>
				</div>
			`
			,
			components:{
			},
		}
		var vm = new Vue({
			el:'#app',
			data(){
				return{

				}
			},
			//挂载子组件
			components:{
				App
			},
			//父组件可以直接使用
			template:`
				<App></App>
			`
		});
	</script>
	
</body>
</html>

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值