Vue-组件
-
组件之间的父子关系 -
使用组件的三个步骤 -
私有组件
-
全局组件
-
在vue 项目的main.js 入口文件中,通过Vue.component() 方法,可以注册全局组件。 import Vue from 'vue'
import App from './App.vue'
// 导入需要被全局注册的那个组件
import Count from '@/components/Count.vue'
Vue.component('MyCount', Count)
Vue.config.productionTip = false
new Vue({
// render 函数中,渲染的是哪个 .vue 组件,那么这个组件就叫做 “根组件”
render: h => h(App)
}).$mount('#app')
-
自定义属性props
-
props 是组件的自定义属性,在封装通用组件的时候,合理地使用props 可以极大的提高组件的复用性! export default{
//组件的自定义属性
props:['自定义属性A','自定义属性B','其他自定义属性...'],
//组件的私有数据
data(){
return {
}
}
}
-
props是只读的:vue 规定组件中封装的自定义属性是只读的,程序员不能直接修改props 的值,否则会直接报错。要想修改props 的值,可以把props 的值转存到data 中,因为data 中的数据都是可读可写的! props:['init'],
data(){
return {
count:this.init,//把this.init的值转存到count
}
}
-
props可以写成对象形式,方便定义属性默认值(default) ,类型(type) ,是否必填(required) 等。 export default{
props:{
init:{
//用default属性定义属性的默认值
default:0,
//用type属性定义属性的值类型,如果传值不符合此类型,则会在终端报错
type:Number,
//必填项校验
required:true,
}
}
}
-
组件之间样式冲突问题
-
默认情况下,写在.vue 组件中的样式会全局生效,因此很容易造成多个组件之间的样式冲突问题。
导致组件之间样式冲突的根本原因是:(1) 单页面应用程序中,所有组件的DOM 结构,都是基于唯一的index.html 页面进行呈现的,(2) 每个组件中的样式,都会影响整个index.html 页面中的DOM 元素.
-
解决组件之间样式冲突的问题:为每个组件分配唯一的自定义属性,在编写组件样式时,通过属性选择器来控制样式的作用域。 <template>
<div class="container" data-v-001>
<h3 data-v-001>轮播图插件</h3>
</div>
</template>
<style>
/*通过中括号"属性选择器",来防止组件之间的"样式冲突的问题",
因为每个组件分配的自定义属性是"唯一的"*/
.container[data-v-001]{
border: 1px solid red;
}
</style>
为了提高开发效率和开发体验,vue 为style 节点提供了scoped属性,从而防止组件之间的样式冲突问题。
<template>
<div class="container">
<h3>轮播图插件</h3>
</div>
</template>
<style scoped>
/*style节点scoped属性,用来自动为每个组件分配唯一的"自定义属性",
并自动为当前组件的DOM标签和style样式应用这个自定义属性,防止组件的样式冲突问 题。*/
.container{
border: 1px solid red;
}
</style>
-
/deep/样式穿透:如果给当前组件的style 节点添加了scoped 属性,则当前组件的样式对其子组件是不生效的。如果想让某些样 式对子组件生效,可以使用/deep/ 深度选择器,但是也有特殊情况:特殊情况传送门 。 <style lang="less" scoped>
.title{
color:blue;/*不加/deep/时,生成的选择器格式为:.title[data-v-052242de]*/
}
/deep/ .title{
color:blue;/*加上/deep/时,生成的选择器格式为:[data-v-052242de] .title*/
}
</style>
|