VUE 04 全局组件,局部组件,组件中的数据, 组件嵌套, 父数据传子,子数据传父

https://baijiahao.baidu.com/s?id=1668458579784282002&wfr=spider&for=pc

1.全局组件的创建

<script type="text/javascript">
	/*	


什么是组件?
扩展html元素,封装可重复的代码(就是把html代码封装起来)

组件分为:
 全局组件:
	定义:定义在vue对象外的组件,可以在任意的对象中使用



	语法格式:
	一,在new Vue对象之前创建组件:
	Vue.component('组件名',{
	 1.template:'html代码' 要封装的html代码
	 或者:
	 2.template:'#id名'
     })

	 二,若template使用ID名,则在body标签后面创建模板
	 注意:模板中只能有一个子元素,元素较多时可用div包裹
		 <body></body>
		 <template id='名'>
			 里面包着大量的html代码
		 </template>
		

	三:如何使用组件:
     在页面上直接使用组件名的方式去使用组件
	 
	   例如:
		<div id="app">

		<组件名></组件名>
		</div>  

	四,运行后页面显示组件中的html代码



	

	注意: 声明全局组件的时候,需要把声明的组件放到new对象之前
	 理解:在得到vue对象之前,把全局组件注册到实例中
*/
</script>
<!DOCTYPE html>
<html>

<head>
	<title></title>
	<meta charset="utf-8" />
	<!-- 开发环境版本,包含了有帮助的命令行警告 -->
	<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>

<body>
	<div id='app'>
		<!-- 如果定义的时候使用小驼峰命名法,在使用组件的时候,就使用-作为分隔符 -->
		<my-demo></my-demo>
		<my-demo2></my-demo2>

	</div>


	<div id='app2'>
		<my-demo></my-demo>
		<my-demo2></my-demo2>
		<!-- 在两个作用域中都可以使用全局组件 -->
	</div>
</body>

<template id="demo">
	<div>
		<h1>我是template标签中封装的模板</h1>
		<h1>我是template标签中封装的模板</h1>
	</div>
</template>

<template id="demo2">
	<div>
		<ul>
			<li>我是的demo2中的模板内容</li>
			<li>我是的demo2中的模板内容</li>
			<li>我是的demo2中的模板内容</li>
		</ul>
	</div>
</template>





<script>
	Vue.component('myDemo', {
		template: '#demo'
	})
	Vue.component('myDemo2', {
		template: '#demo2'
	})
	new Vue({
		el: '#app',
		data: {

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

		}
	})
</script>

</html>

 

2.局部组件


<script>
	/*
	局部组件:
	定义:定义在vue对象中的组件,这种组件只能在当前的new Vue({}) 作用范围内使用
	语法格式:

	一,在new Vue({})中穿件组件
	new Vue({
		el:'#app',
		components:{

			'组件名':{
				template:'html代码'
			},
**************************或
			
			'组件名':{
				template:'#id名'
			}
		}
	})

	二,定义模板(template中只能有一个元素,注意用div包裹起来)
	<body></body>
	<template id='id名'>
		<div>
			大量的html代码
		</div>
	</template>


	三,使用组件
	<div id='app'>
		<组件名></组件名>
	</div>


	四,运行后显示模板中的html代码

*/
</script>
<!DOCTYPE html>
<html>
<head>
	<title></title>
	<meta charset="utf-8"/>
	<!-- 开发环境版本,包含了有帮助的命令行警告 -->
	<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
	<my-demo2></my-demo2>
</div>

<div id='app2'>
	<my-demo2></my-demo2>
	<!-- 
		由于my-demo2组件为app的局部变量
		执行后会报错:
		[Vue warn]: Unknown custom element: <my-demo2>
	 -->
	
</div>
	
</body>
<template id='demo2'>
	<!-- 这是app中---my-demo2的模板 -->
	<div>
		<ul>
			<li>hahahahha</li>
			<li>hahahahha</li>
			<li>hahahahha</li>
			<li>hahahahha</li>
		</ul>
		<h1>再来一个</h1>
	</div>
</template>



<script type="text/javascript">

new Vue({
	el:'#app',
	components:{
		'my-demo':{
			template:'<h1>我是局部组件中的h1</h1>'
		},
		'my-demo2':{
			template:'#demo2'
		}
	}
})


new Vue({
	el:'#app2'
})
</script>
</html>

 

 

3.创建组件data

<script>
/*
	在组件中不能直接使用data中的数据,如果需要使用数据,需要自己去组件中定义
	如何在组件中定义数据

	语法格式:

	'组件名':{
		template:'#id名',
		在组件中声明数据,必须是函数,并有返回值,返回值是对象
		data:function(){
			return{
				键:值
			}
		}
	}
*/
</script>
<!DOCTYPE html>
<html>
<head>
	<title></title>
	<meta charset="utf-8"/>
	<!-- 开发环境版本,包含了有帮助的命令行警告 -->
	<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
	<div id="app">
		<demo></demo>
	</div>
</body>


<!-- demo组件的模板 -->
<template id="demo">
	<div >
		<p>{{str1}}</p>
		<h2>{{num}}</h2>
	</div>
</template>


<script type="text/javascript">
	
	new Vue({
		el:'#app',
		data:{
			str:"字符串"
		},
		// 定义一个局部组件
		components:{
			'demo':{
				template:'#demo',
				data:function(){
					return{
						str1:'我是组件中的data中的数据',
						num:10
					}
				}
			}
		}
	})
</script>
</html>

 

4.组件中的父子组件

 

<!DOCTYPE html>
<html>

<head>
	<title>组件中的父子组件</title>
	<meta charset="utf-8" />
	<!-- 开发环境版本,包含了有帮助的命令行警告 -->
	<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>

<body>
<div id="app">
	<my-parent></my-parent>

    <!-- 
	<my-child2></my-child2>	
	[Vue warn]: Unknown custom element:  <my-child2>
	 -->

	<!-- 
		对于app来说myParent就是它的子元素,
		在父元素中只能写子元素,不能写孙子元素
	-->	

</div>
</body>
<!-- 父组件模板 -->
<template id="demop">
	<div>
		<div>我是父组件中的模板,我自己的数据是:{{str}}</div>
		<my-child1></my-child1><!-- 子组件1 -->
		<my-child2></my-child2>	
	</div>
</template>

<!-- 子组件1模板 -->
<template id='democ1'>
	<div>
		<ul>
			<li>我是子主见的模板内容</li>
			<li>我是子主见的模板内容</li>
			<li>我是子主见的模板内容</li>
			<li>我是子主见的模板内容</li>
		</ul>
		<div>我是子组件中的模板,我自己的数据是:{{str1}}</div>
	</div>
</template>

<!-- 子组件2模板 -->
<template id='democ2'>
	<div>
		<p>我是子组件2的模板内容,我自己的数据是:{{str2}}</p>
	</div>
</template>
<script type="text/javascript">
	new Vue({
		el: '#app',
		data: {},
		components: {
			'myParent': {
				template: '#demop',
				data: function () {
					return {
						str: '我是父组件中的数据'
					}
				},
				components: {
					'myChild1': {
						template: '#democ1',
						data() {
							return {
								str1: '我是子组件1的数据'
							}
						},
					},
					'myChild2': {
						template: '#democ2',
						data() {
							return {
								str2: '我是子组件2中的数据'
							}
						},
					}
				},

			}
		}

	})
</script>

</html>

5.父组件传值----给子组件

<script>
	/*
		父组件传值子组件
		1.父组件传值--给子组件需要自定义属性,

			子组件使用自定义属性来绑定需要传递组件内的变量
		2.在子组件中使用props接收传递进来的值(:自定义属性='父组件的数据')


		语法格式:
    一,在父模板中通过子组件创建自定义属性,绑定要传递的值    
			<template id='父组件模板'>
				{{父组件的数据}}
				<子组件:自定义属性='父组件数据'></子组件>
			<template>

	二,在子组件中接收传递的值

			components:{
				'组件名':{
					props:{
						自定义属性名:{
							type:接数据的类型,
							defaule
						}
					}
				}
			}
    三,使用:在子组件中即可使用自定义属性名(表示父组件的元素)
			<template id='子组件模板'>
				{{子组件的数据}} √
				{{父组件的数据}} X
				{{自定义属性名}} √		
			<template>

	四:输出:输出后一中的子组件效果被父组件调用后可显示自定义属性的值
	<div id="app">
		<my-parent></my-parent>
	</div>		
*/
</script>
<!DOCTYPE html>
<html>

<head>
	<title>组件传值-(父传子)</title>
	<meta charset="utf-8" />
	<!-- 开发环境版本,包含了有帮助的命令行警告 -->
	<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>

<body>
	<div id="app">
		<my-parent></my-parent>
	</div>
</body>

<!-- 父组件的模板 -->
<template id='demo1'>
	<div>
		{{pstr}}
		<my-child :mystr='pstr'></my-child>
	</div>
</template>

<!-- 子组件的模板 -->
<template id='demo2'>
	<div>
		{{cstr}}
		{{mystr}}
	</div>
</template>



<script type="text/javascript">
	new Vue({
		el: '#app',
		data: {},
		components: {
			'myParent': {
				template: '#demo1',
				data: function () {
					return {
						pstr: '*****我是父组件中的数据********'
					}
				},
				components: {
					'myChild': {
						// 用于接收传递的值
						props: {
							// 在使用的时候,需要使用mystr作为数据源(父组件传递进来的数据)即可

							mystr: {
								// 里边存储的值就是:mystr属性传递进来的值
								// 指定接收数据的类型
								type: String,
								default: ''
							}
						},
						template: '#demo2',
						data: function () {
							return {
								cstr: '####我是子子子组件中的数据####'
							}
						}
					}
				}
			}
		}
	})
</script>

</html>

6.子组件传值给父组件

<script>
	/*
	一,在子模板中添加按钮创造契机
	<button @click='sendColor()'>变颜色</button>

	二,在子组件中的methods中创建方法
	methods: {
					sendColor() {						
						// 需要使用自定义事件帮我们将组件的数据传递出去
						// this.$emit('自定义事件名','你要发出去的数据')
						this.$emit('changecolor', this.color)
					}
				},

	三,在vue作用范围中的--子组件中添加事件(事件类型为二中的自定义事件名)
	<div id="app">
		<p :style="{'color':color}">点击按钮就变颜色噢</p>
		<!-- 该事件会在组件模板渲染的时候自动调用 -->
		<my-demo @changecolor='cColor'></my-demo>
	</div>


	四,使用:在父元素的methods中创建自定义事件的方法,方法中的参数为子组件传入的值(red)
	methods: {
			cColor(v) {
				console.log(v);
				this.color = v;
			}
		},

	*/
</script>
<!DOCTYPE html>
<html>

<head>
	<title>组件传值-(子传父)</title>
	<meta charset="utf-8" />
	<!-- 开发环境版本,包含了有帮助的命令行警告 -->
	<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>

<body>
	<div id="app">
		<p :style="{'color':color}">点击按钮就变颜色噢</p>
		<!-- 该事件会在组件模板渲染的时候自动调用 -->
		<my-demo @changecolor='cColor'></my-demo>
	</div>

</body>

<!-- 子模板(相对于vue对象) -->
<template id="demo">
	<div>
		<!-- 在组件传值给父组件,需要有契机 -->
		<!-- 在组件中触发事件后调用方法,需要在组件中声明 -->
		<button @click='sendColor()'>变颜色</button>
		子组件中的颜色:{{color}}
	</div>
</template>

<script type="text/javascript">
	new Vue({
		el: '#app',
		data: {
			color: '#7bb707'
		},
		methods: {
			cColor(v) {
				console.log(v);
				this.color = v;
			}
		},
		components: {
			'myDemo': {
				template: '#demo',
				data: function () {
					return {
						color: 'red'
					}
				},
				methods: {
					sendColor() {
						// alert(123);
						// 获取到中间的数据
						// alert(this.color);
						// 需要使用自定义事件ba帮我们将组件的数据传递出去
						// this.$emit('自定义事件名','你要发出去的数据')
						this.$emit('changecolor', this.color)
					}
				},

			}
		}
	})
</script>

</html>

点击按钮,父中颜色变成子中红色

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值