利用封装的思想,把页面上可复用的部分封装成一个个组件,优点便于项目开发和维护
一个页面, 可以拆分成一个个组件,一个组件就是一个整体, 每个组件可以有自己独立的 结构 样式 和 行为
组件的后缀名 .vue
App.vue
根组件,是最大的根组件。
在App.vue
中,还可以写入一些小组件, 而这些组件, 要使用, 就需要先注册
创建新组件,把独立的组件封装一个.vue
文件中,放到components
文件夹。
引入并配置组件
import HeHeader from './components/HeHeader
通过组件的components
配置 局部注册组件
export default {
components: {
// 组件名:组件 相同可省略
// HeHeader:HeHeader
// 组件名不能是已有标签的名字
HeHeader
}
}
<template>
<div id="app">
<h1>组件的基本使用</h1>
<HeHeader></HeHeader>
</div>
</template>
main.js
中通过Vue.component()
全局注册组件import HeButton from './components/HeButton'
// 注册全局组件
// 参数1:组件的名字
// 参数2:组件
Vue.component('HeButton', HeButton)
<template>
<div id="app">
<h1>组件的基本使用</h1>
<HeButton></HeButton>
</div>
</template>
例如:hh-header
例如:HhHeader
默认情况下,写在组件中的样式会全局生效
,因此很容易造成多个组件之间的样式冲突问题。
可以给组件加上scoped
属性,让此样式只作用于当前组件
例如,在HhButton.vue
中
<style lang="less" scoped>
div {
color: pink;
}
</style>
每个组件都有自己的数据,存放于data()中,数据之间是相互独立的,无法互相直接访问。
组件通讯:解决跨组件访问数据问题。
组件通讯方式 1. 父传子 2. 子传父 3. 非父子 4. vuex
例如: 父组件传给子组件money属性
<HeSon :money="money"></HeSon>
<template>
<div>子组件 ---> {{ money }}</div>
</template>
<script>
export default {
// props接收到父组件传过来的数据
props: ['money']
}
</script>
在vue中需要遵循单向数据流原则
MyProduct
通过this.$emit(‘事件名’,参数1,参数2 …)
触发事件的同时传参this.$emit('sayPrice', 2)
<MyProduct
...
@sayPrice="sayPrice">
</MyProduct>
methods: {
sayPrice (num) {
console.log(num)
}
},
props 是父传子, 传递给子组件的数据, 为了提高 子组件被使用时 的稳定性, 可以进行props校验 , 验证传递的数据是否符合要求
默认的数组形式, 不会进行校验, 如果希望校验, 需要提供对象形式的 props
props: {
...
}
{
props: {
// 基础的类型检查
propA: Number,
// 多个可能的类型
propB: [String, Number],
// 必填的字符串
propC: {
type: String,
required: true
},
// 带有默认值的数字
propD: {
type: Number,
default: 100
},
// -------------------------------------------------------------------------
// 自定义验证函数
propF: {
validator: function (value) {
// 这个值必须匹配下列字符串中的一个
return ['success', 'warning', 'danger'].indexOf(value) !== -1
}
}
}
}
使用通用的组件通讯解决方案:event bus
例如:Jack组件给Rose组件发数据
main.js
中创建 bus对象,并且挂到Vue的原型上,保证所有的vue组件都能访问到// 1. 创建event bus
// 实质上 bus就是一个空的vue实例
// 2. 把bus挂载到Vue的原型上,所有的组件都能够通过 this.bus访问到 bus对象
const bus = new Vue()
Vue.prototype.bus = bus
methods: {
fn() {
// 发布消息
this.bus.$emit('aa', this.msg)
},
},
// 钩子函数,,,组件只要创建,就会立即执行created函数
created() {
// 给bus订阅事件
this.bus.$on('aa', (msg) => {
console.log('接收到消息', msg)
this.msg = msg
})
},