组件是可复用的 Vue 实例,主要用于开发中 具有相同特征不同数据的模块 把它集成为一个组件 供重复利用
规则:
创建全局组件语法:
//注册全局组件
Vue.component("box", { //标签名
template: "box组件
" //标签内容
//template里面内容只能用一个唯一的div包裹住,如果template的儿子元素中有两个元素,那么就会报错。局部组件也是
})
全局组件完成后相对于局部组件来说不用注册在任何vue管辖的html中(也就是vue的el元素下)都可以调用。
一个vm实例可以有多个局部组件,但是只能供当前vm实例使用
创建局部组件语法:
//Box.vue文件中
{{msg}}

小结:
如果.vue的script注释了 在打包的时候 vue的打包环境 会帮我们把这个文件解析为一个对象 然后给这个对象添加一个template属性 值为解析的页面模板。
每个组件中必须包含 template 模板结构,而 \script 行为和 \style 样式是可选的组成部分。vue 规定:每个组件对应的模板结构,需要定义到\ 节点中。
这里 是 vue 提供的容器标签,只起到包裹性质的作用,它不会被渲染为真正的 DOM 元素。
在 template 中定义根节点
在 vue 2.x 的版本中, 节点内的 DOM 结构仅支持单个根节点:
但是,在 vue 3.x 的版本中, 中支持定义多个根节点:
Vue组件通过props属性来声明一个自己的属性,然后父组件就可以往里面传递数据。
同样传递父组件里面的变量时,使用v-bind绑定。
属性有两种写法:简单声明和详细描述:
简单声明
props:[“prop1”,“prop2”]
对属性做详细的描述
props: {
propA: Number, // 基础的类型检查 (`null` 匹配任何类型)
propB: [String, Number], // 多个可能的类型
propC: { type: String,
required: true // 必填的字符串
},
propD: { type: Number,
default: 100 // 带有默认值的数字
},
propE: { type: Object, // 带有默认值的对象或者数组填Array
default: function () { // 不建议直接填对象(因为对象直接量会一直占用内存),一般使用工厂函数,调用时才创建对象节省资源(面试)
return { message: 'hello' }
}
},
propF: {
validator: function (value) {// 自定义验证函数返回为true就代表数据符合我们规定
return ['success', 'warning', 'danger'].indexOf(value) !== -1
}
}
}
父组件通过属性给子组件传值: 子组件的props接受数据
在页面模板中 使用变量名:属性 data 计算属性
注意:属性传值是单向的
案例:
//再父组件App.vue文件中
App组件中
//属性名不能取官方定义
{{msg}}{{pro}}

全局样式的写法:
在.vue文件中的style中写的样式 打包后就是全局样式
写一个css文件 在项目中导入就是全局样式
如果全局样式出现了相同的选择器. 就看是哪个最后打包引入项目 哪个的优先级就最高
//父组件App.vue
App组件中
//子组件box.vue
{{msg}}{{pro2}}
//子组件user.vue
{{msg}}{{pro}}

全局样式会出先组件样式污染,那么如何解决?
使用局部样式scoped;
局部样式/CSS作用域的实现和原理
在style标签中添加一个scoped
原理就是vue的插件webpack打包时会:
把当前组件模板中的每一个元素添加一个相同的哈希值命名的属性名
并且为添加了scoped的style中的样式选择器上添加一个属性选择器
//修改box.vue中的style
//修改user.vue中的style
