vue2.0-组件

VUE2.0-2-组件

vue 是一个支持组件化开发的前端框架。

vue 中规定:组件的后缀名是 .vue。之前接触到的 App.vue 文件本质上就是一个 vue 的组件。

组成部分

每个 .vue 组件都由 3 部分构成,分别是:

  • template -> 组件的模板结构
  • script -> 组件的 JavaScript 行为
  • style -> 组件的样式

其中,每个组件中必须包含 template 模板结构,而 script 行为和 style 样式是可选的组成部分

template

每个组件对应的模板结构,需要定义到template节点中

  • template是vue提供的容器标签,只起到包裹性质的作用
  • template中只能包含唯一的根节点(vue2)

script

开发者可以在 <script> 节点中封装组件的 JavaScript 业务逻辑

组件相关的data数据,method方法都要定义到export default所导出的对象中

  • 注意data的写法 (.vue组件中的data不能像之前一样指向对象,必须是个函数)
1
2
3
4
5
6
7
export default {
data() {
return {

} //return出去的对象中可以定义数据
}
}

style

组件内的 <style> 节点是可选的,开发者可以在 <style> 节点中编写样式美化当前组件的 UI 结构

使用组件

组件间的关系

使用组件的步骤

使用import方法导入需要的组件

1
2
3
4
// 1. 导入需要使用的 .vue 组件
import Left from '@/components/Left.vue'
import Right from '@/components/Right.vue'
import Test from '@/components/Test.vue'

用components节点注册组件

1
2
3
4
5
6
7
8
 // 2. 注册组件
export default {
components: {
Left,
Right,
Test
},
}

以标签的形式使用刚才的组件

1
2
3
4
5
6
<div class="box">
<!-- 渲染 Left 组件和 Right 组件 -->
<!-- 3. 以标签形式,使用注册好的组件 -->
<Left></Left>
<Right></Right>
</div>

通过 components 注册的是私有子组件

例如:

在组件 A 的 components 节点下,注册了组件 F。

则组件 F 只能用在组件 A 中;不能被用在组件 C 中

注册全局组件

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

1
2
3
4
5
6
import Vue from 'vue'
import App from './App.vue'

// 导入需要被全局注册的那个组件
import Count from '@/components/Count.vue'
Vue.component('MyCount', Count)

props

props 是组件的自定义属性,在封装通用组件的时候,合理地使用 props 可以极大的提高组件的复用性

props是只读的

vue 规定:组件中封装的自定义属性是只读的,程序员不能直接修改 props 的值。否则会直接报错

要想修改 props 的值,可以把 props 的值转存到 data 中,因为 data 中的数据都是可读可写的

props 的 default 默认值

在声明自定义属性时,可以通过 default 来定义属性的默认值

(要把props改成对象形式)

props的type值类型

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
props: {
// 自定义属性A : { /* 配置选项 */ },
// 自定义属性B : { /* 配置选项 */ },
// 自定义属性C : { /* 配置选项 */ },
init: {
// 如果外界使用 Count 组件的时候,没有传递 init 属性,则默认值生效
default: 0,
// init 的值类型必须是 Number 数字
type: Number,
// 必填项校验
required: true
}
},

props 的 required 必填项

在声明自定义属性时,可以通过 required 选项,将属性设置为必填项,强制用户必须传递属性的值。

1
2
3
4
5
6
7
8
9
10
11
12
13
props: {
// 自定义属性A : { /* 配置选项 */ },
// 自定义属性B : { /* 配置选项 */ },
// 自定义属性C : { /* 配置选项 */ },
init: {
// 如果外界使用 Count 组件的时候,没有传递 init 属性,则默认值生效
default: 0,
// init 的值类型必须是 Number 数字
type: Number,
// 必填项校验
required: true
}
},

组件间的样式冲突问题

默认情况下,写在 .vue 组件中的样式会全局生效,因此很容易造成多个组件之间的样式冲突问题

导致组件之间样式冲突的根本原因是:

① 单页面应用程序中,所有组件的 DOM 结构,都是基于唯一的 index.html 页面进行呈现的

② 每个组件中的样式,都会影响整个 index.html 页面中的 DOM 元素

为每个组件分配唯一的自定义属性

在编写组件样式时,通过属性选择器来控制样式的作用域

scoped属性(原理就是分配自定义属性)

为了提高开发效率和开发体验,vue 为 style 节点提供了 scoped 属性,从而防止组件之间的样式冲突问题

/deep/样式穿透

在父组件中直接去改造子组件的样式

如果给当前组件的 style 节点添加了 scoped 属性,则当前组件的样式对其子组件是不生效的。如果想让某些样

式对子组件生效,可以使用 /deep/ 深度选择器。

相当于变成了复合选择器,父级是scoped给父组件的属性的属性选择器,因为子组件的最外层会有父组件的属性,所以可以被选中。

组件的生命周期

生命周期 & 生命周期函数

生命周期(Life Cycle)是指一个组件从创建 -> 运行 -> 销毁的整个阶段,强调的是一个时间段。

生命周期函数:是由 vue 框架提供的内置函数,会伴随着组件的生命周期,自动按次序执行。

注意:生命周期强调的是时间段,生命周期函数强调的是时间点。

组件生命周期的分类

生命周期图示

可以参考 vue 官方文档给出的“生命周期图示”,进一步理解组件生命周期执行的过程:

[Vue 实例 — Vue.js (vuejs.org)]生命周期图示(vue2文档中的,vue3有所不同)

1
<Test info="你好" v-if="flag"></Test>

通过v-if控制是否被销毁

组件间的数据共享

组件间的关系

1.父子关系

2.兄弟关系

父子组件之间的数据共享

父组件向子组件共享数据

父组件向子组件共享数据需要使用自定义属性

父组件自定义数据,子组件设定props接受父组件的数据(传复杂类型的话传的是引用,简单类型是复制了一份)

子组件向父组件共享数据

子组件向父组件共享数据使用自定义事件

兄弟组件之间的数据共享

在 vue2.x 中,兄弟组件之间数据共享的方案是 EventBus。

ref引用

MVVM的思想,在vue中,程序员不需要操作DOM,只需要把数据维护好即可。

因此在vue项目中不建议使用jQuery

假设:在vue中需要操作DOM了,需要拿到页面上某个DOM元素的引用

ref 用来辅助开发者在不依赖于 jQuery 的情况下,获取 DOM 元素或组件的引用。每个 vue 的组件实例上,都包含一个 $refs 对象,里面存储着对应的 DOM 元素或组件的引用。默认情况下,组件的 $refs 指向一个空对象。

使用 ref 引用 DOM 元素

如果想要使用 ref 引用页面上的 DOM 元素,则可以按照如下的方式进行操作

使用 ref 引用组件实例

ref也可以获得组件的引用,从而调用子组件的方法

this.$nextTick(cb) 方法

组件的 $nextTick(cb) 方法,会把 cb 回调推迟到下一个 DOM 更新周期之后执行。通俗的理解是:等组件的

DOM 更新完成之后,再执行 cb 回调函数。从而能保证 cb 回调函数可以操作到最新的 DOM 元素。


vue2.0-组件
https://wjcbolg.cn/2023/06/19/VUE2.0-2-组件/
作者
JasonWang
发布于
2023年6月19日
许可协议
BY-JW