Vue2的组件

组件


当一个组件需要调用另一个组件时需要通过注册调用

通过Vue.component全局注册组件
// Vue.component(组件名,配置项)

Vue.component('cp1',{
	template:`<div> 我是组件1 {{ a }} </div>`,
	data(){
		return {
			a:456
		}
	}
})




私有子组件


在组件中将需要使用的组件导入

import Left from '@/components/Left.vue'

使用components节点注册

export default {
	name: 'MyComp'
	components: {
		Left
	}
}

注册时可以对组件进行命名,当提供了name属性之后,组件的名称就是name属性的值

组件的 注册名称 的主要应用场景为:以标签的形式,把注册好的组件,渲染和使用到页面结构中

组件声明时候的 name 名称 的主要应用场景为:结合keep-alive标签实现组件缓存功能
以及在调试工具中看到组件的name名称

在组件中以标签形式使用

<div class="box">
	<Left></Left>
</div>



注册全局组件

在Vue项目的main.js入口文件中,通过Vue.component()方法注册全局组件

//导入需要全局注册的组件
import Count from '@/components/Count.vue'

//参数1: 字符串格式,表示组件的"注册名字"
//参数2: 需要被全局注册的那个组件
Vue.component('MyCount',Count)



组件中的props

props是组件中的自定义属性,在封装通用组件时提高组件的复用性

export default {
	//组件的自定义属性
	props: ['自定义属性A','自定义属性B','其他自定义属性..'],
	//组件的私有数据
	data(){
	 return { }
	}
}

与data数据类似,但可以在调用组件的标签中传入数据

export default {
//props是自定义属性,允许通过自定义属性,为当前组件指定初始值
	props: ['init']
}
<MyCount init='9'></MyCount>

此时可以设置init的值为9,props中的数据可以直接在模板结构中被使用

但此时的init为字符串,可以通过v-bind将其转为js代码,使init转为数字

<MyCount :init='9'></MyCount>

但props是只读的,可以修改props的值,也会生效,但会报错

此时可以将props的值转存到data中,再调用data中的数据

props的默认值

props同样可以定义默认值,当调用组件不传入props的值时会使用默认值

export default {
//props是自定义属性,允许通过自定义属性,为当前组件指定初始值
//数组写法为简便写法,定义默认值或其他时需要写为对象写法
	props: {
		init: {
			//用default属性定义属性的默认值
			default: 0
		}
	}
}

当接收值为一个对象时,默认值不能为一个空对象,必须为一个函数,函数返回值为默认值

	props: {
		init: {
			type: Object,
			// 对象或数组默认值必须从一个工厂函数获取
			default: function(){
				return { message: 'hello' }
			}
		}
	}
}

props的type与required

在声明自定义属性时,也可以通过type定义属性的值类型

export default {
	props: {
		init: {
			default: 0,
			//用type属性定义属性的值类型
			//如果传递过来的值不符合此类型就会报错
			type: Number,
			
			//类型也可以定义为数组
			//type: [Number, String]
			
			//是否为必填项,指调用组件时必须传入值(有默认值时也必须传)
			required: true
		}
	}
}

props的validator

export default {
	props: {
		init: {
			default: 0,
			type: Number,
			required: true,
			validator(value){
			// return true的时候才能通过校验 return false或没有return -> undefined时会在控制台警告 但不会阻止代码运行
				if(value>5) return true
				if(value<3) return true
			}
		}
	}
}

props的变量命名

当props中的变量命名为小驼峰时,官方建议在传参时使用连字符

<MyCount :init-count='9'></MyCount>
export default {
	props: {
		initCount: {
			default: 0,
			type: [Number, String]
		}
	}
}



组件样式冲突

默认情况下,写在.vue组件中的样式会全局生效,容易造成覆盖冲突

<style lang='less' scoped></style>

在组件的style标签中加入scoped即可让组件的style样式只对组件中的标签生效

原理为vue编译时在组件模板的每个标签中加上独有的属性选择器,便于对组件中标签进行样式修饰

子组件样式修改

通过scoped属性可以让样式只对本身组件生效,因此对调用的子组件不生效

当需要父组件修改调用了的子组件样式时需要用到/deep/样式穿透

<style lang='less' scoped>
/deep/ h5 {  /*对调用的子组件中的h5标签做样式修改*/
	color:red;
}
</style>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Raccom

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值