04-Vue组件

八. 组件

8.1 组件化

为了拆分Vue实例的代码量的,能够让我们以不同的组件,来划分不同的功能模块
组件化 :从代码逻辑的角度进行划分的;方便代码分层开发,保证每个功能模块的职能单一

8.2 三种方式创建组件

8.2.1 vue.extend 创建全局组件

var com1= Vue.extend({
			//通过template 属性 指定了 组件要展示的HTML结构
			template:'<h1>你好一号组件</h1>'
})

8.2.2 Vue.component

Vue.component('mycom1',Vue.extend({
	template:'<h1>你好二号组件</h1>'
})

8.2.3 组件模块对象

var login ={
	template:'<h1>你好三号组件</h1>'
}

8.2.4 通过template元素来定义组件的html模块

html代码:

<div id="app">
	<mycom></mycom>
</div>
<template id="tem">
//组件中的template属性 指向的模板内容,有且只能有唯一的根元素来进行包裹!所以要通过div来包裹
	<div>
		<h1> 通过template元素  来定义组件的html模块 </h1>
	<span> 很好很好 </span>
	</div>
</template>

vue代码:

Vue.component('mycom',{
		template:'#tem'
})

8.2.5 自定义私有组件

html代码:

<div id="app">
	<mycom></mycom>
</div>
<div id="app2">
	<show></show>
</div>
<template id="tem2">
	<h1> 定义私有组件 </h1>	
</template>

vue代码:

Vue.component('mycom',Vue.extend({
	template:'<h1>你好,全局组件</h1>'
})

var vm =new Vue({
	el:'#app',
	data:{},
	methods:{}	
})
var vm1 =new Vue({
			el:'#app2',
			data:{},
			methods:{},
			components:{ //定义私有组件
				show:{
					template:'#tem'
				}
		}
})

8.3 组件中的data和methdos

组件中的data 是 一个的方法并且方法内部返回一个对象

组件中 的data 使用方式与实例中的data方式一样

html代码:

<div id="app">
			<mycom1></mycom1>
		</div>
		
		<template id="tem">
			<div>
				<h1>你好,这是组件++ {{msg}}</h1>
				<input type="button" value="组件按钮" @click="mycom"/>
			</div>
</template>

vue代码:

Vue.component('mycom1',{
			template:'#tem',
			//组件中 的data 是 一个的方法并且方法内部返回一个对象
			//组件中 的data  使用方式与实例中的data方式一样
			data:function(){
				return {
					msg:'我是组件'
				}
			},
			methods:{
				mycom(){
				   console.log('这是组件的方法')
				}
			}
		})
		
		var vm =new Vue({
			el:'#app',
			data:{},
			methods:{
				
			}
		})

8.4 组件之间的传值和调用方法

8.4.1 props

1.子组件自定义绑定父组件的data 数据
2父组件将绑定属性名称 放到 props数组定义一下,子组件就可以使用这个属性了

html代码:

<div id="app">
	<!-- 父组件将传给子组件的数据 通过属性绑定 传递到子组件内部-->
	<com v-bind:parentmsg='msg'></com>
</div>

vue代码:

//子组件默认不能获取父组件的data上的数据和methods的方法
var vm =new Vue({
	el:'#app',
	data:{
		msg:'123-父组件'
	},
	methods:{},
	components:{
		//组件中的props数据都是通过父组件传递给子组件的
	com:{
		//子组件的data属性中数据是子组件私有的 子组件通过ajax请求回来的值 都可以存放到data中
		//data数据可读可写
		data:function  () {
			return {
				num:123
			}
		},
		template:'<h2>注册页面  === {{parentmsg}}</h2>',
		//将父组件传递过来的 parentmsg 属性 现在props数组中定义一下才能使用这个数据
		//props的数据只读 不能重新赋值
		props:['parentmsg']
	}
}
})

8.4.2 this.$emit()

1.子组件 绑定事件 调用 子组件内部的方法
2.子组件使用this.$emit() 触发父组件的自定义事件
3.父组件自定义绑定的事件 调用父组件的方法并传值

html代码:

<div id="app">
			<com @func="show"></com>
</div>
<template id="tem">
			<div >
				<input type="button" value="子组件的按钮" @click="myclick"/>
				<p>看看</p>
			</div>
</template>

vue代码:

var com ={
			template:'#tem',
			data:function  () {
				return {
					list:{name:'我是子组件' ,age:1}
				}
			},
			methods:{
				myclick(){
					// console.log('ok');
					// 子组件可以使用 $emit 触发父组件的自定义事件。
					this.$emit('func',this.list)
		}
	}
}
		
var vm =new Vue({
			el:'#app',
			data:{
				fromson:null
			},
			methods:{
				show(data){
					// console.log("调用了父组件的方法--"+data);
					// console.log(data);
					this.fromson=data
					console.log(this.fromson);
				}
			},
			components:{
				com
			}
})

8.4.3 tihs.$ref()

父组件可以通过 tihs.$ref() 获取DOM元素 和 组件 组件的数据 ,方法

html代码:

<div id="app">
			<input type="button" value="获取元素" @click="myclick"/>
			<h1 ref='myh1'>哈哈哈哈哈</h1>
			<login ref='mylogin'></login>
</div>
		
<template id="tem">
			<div>
				<h1>你好你好</h1>
			</div>
</template>

vue代码:

var login={
			template:'#tem',
			data:function (){
				return{
					name:'我是子组件的数据'
				}
			},
			methods:{
				look(){
					console.log('调用了子组件的方法'+this.name);
				}
			}
}
		
var vm =new Vue({
			el:'#app',
			data:{},
			methods:{
				myclick(){
					//通过ref获取 dom元素
					console.log(this.$refs.myh1.innerText)
					//通过ref获取 组件 组件的数据 方法
					console.log(this.$refs.mylogin.name);
					this.$refs.mylogin.look()
				}
			},
			components:{
				'login':login
			}
})
posted @ 2019-12-10 09:46  okoka  阅读(198)  评论(0)    收藏  举报