学习Vue当中组件之间的关系

125 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第5天,点击查看活动详情

1.组件

1-1. 组件之间的样式冲突问题

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

  • 导致组件之间样式冲突的根本原因是:
    1. 单页面应用程序员,所有组件的 DOM 结构,都是基于唯一的 index.html页面进行呈现的
    1. 每个组件中的样式,都会影响整个 index.html 页面中的 DOM 元素

1-2. 思考:如何解决组件样式冲突的问题

为每个组件分配唯一的自定义属性,在编写组件样式时,通过属性选择器来控制样式的作用域,示例代码如下:

<template>
    <div class="container" data-v-001>
        <h3 data-v-001>轮播图组件</h3>
    </div>
</template><style>
/*
    通过中括号 "属性选择器", 来防止组件之间的 "样式冲突问题",
    因为每个组件分配的自定义属性是 "唯一的"
*/
.container[data-v-0001]{
    border:1px solid red;
}
</style>

1-3. style节点的scoped属性

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

<template>
    <div class="container">
        <h3>轮播图组件</h3>
    </div>
</template><style>
/*
    style 节点的 scoped 属性,用来自动为每个组件分配唯一的 "自定义属性",
    并自动为当前组件的 DOM 标签和 style 样式应用这个自定义属性, 防止组件的样式冲突问题
*/
.container{
    border:1px solid red;
}
</style>

1-4. /deep/样式穿透

如果给当前组件的style节点添加了scoped属性,则当前组件的样式对其子组件是不生效的。如果想让某些样式对子组件生效,可以使用/deep/深度选择器

<style>
.title{
    /*  不加 /deep/ 时, 生成的选择器格式为 .title[data-v-052242de] */
    color:blue;
}
/deep/.title{
    /*  加上 /deep/ 时, 生成的选择器格式为 [data-v-052242de].title */
    color:blue;
}
</style>

2. 生命周期 & 生命周期函数

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

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

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

3. 生命周期图示

可以参考 vue 官方文档给出的 "生命周期图示", 进一步理解组件生命周期执行的过程:v2.cn.vuejs.org/v2/guide/in… 生命周期图示