当前位置: 首页 > news >正文

vue2的scoped 原理

Vue 2 中的 Scoped CSS 是通过 PostCSS 插件 postcss-scoped 实现的,其核心原理是通过为组件添加唯一属性标识重写 CSS 选择器来实现样式隔离。以下是详细原理:


实现步骤:

  1. 添加唯一属性标识
    当在 <style> 标签中添加 scoped 属性后,Vue 在编译时会为当前组件的所有 DOM 元素添加一个唯一的 data-v-xxxxxxx 属性(如 data-v-9ea40744)。该哈希值基于组件路径生成,确保全局唯一。

  2. 重写 CSS 选择器
    同时,Vue 会重写 <style scoped> 内的所有 CSS 规则,在每个选择器末尾添加属性选择器 [data-v-xxxxxxx]
    例如:

   /* 原始样式 */
.home {background: red;
}
.img {width: 100%;
}

编译后变为:

.home[data-v-9ea40744] {background: red;
}
.img[data-v-9ea40744] {width: 100%;
}

最终效果:

<!-- 编译后的模板 -->
<div data-v-9ea40744="" class="home"><img data-v-9ea40744="" alt="Vue logo" src="" class="img">
</div><!-- 编译后的样式 -->
<style>
.home[data-v-9ea40744] {background: red;
}
.img[data-v-9ea40744] {width: 100%;
}
</style>
  • 样式仅作用于当前组件:由于其他组件的 DOM 元素没有相同的 data-v-xxxxxxx 属性,样式不会泄露。
  • 不影响全局样式:未添加 scoped 的样式仍为全局样式。

深度选择器(穿透作用域)

当需要影响子组件样式时,使用深度选择器:

/* 写法1:Vue 2 推荐 */
.parent >>> .child { color: blue; }/* 写法2:Sass/预处理器可用 */
.parent /deep/ .child { color: blue; }/* 写法3:Vue 3 也兼容的语法 */
.parent ::v-deep .child { color: blue; }

编译后:

.parent[data-v-f3f3eg9] .child { color: blue; }

注意:深度选择器会移除子组件选择器前的属性限定,使样式穿透到子组件。


关键特点:

  1. 局部作用域
    样式仅影响当前组件,避免全局污染。
  2. 属性选择器实现
    不依赖 CSS Modules 的类名哈希,而是通过 HTML 属性隔离。
  3. 编译时处理
    .vue 文件编译阶段由 vue-loader 完成转换。
  4. 权重不变
    选择器权重与原始规则一致(如 .class[attr] 权重 = 类选择器 + 属性选择器)。

注意事项:

  • 不适用于动态内容:通过 v-html 插入的 DOM 不会添加 data-v-xxxxxxx 属性,需手动处理或使用深度选择器。
  • 性能影响:属性选择器比类选择器稍慢,但现代浏览器中差异可忽略。
  • 避免全局样式泄漏:Scoped 样式依然可能被全局样式覆盖(因 CSS 层叠规则)。

通过这种巧妙的属性选择器重写机制,Vue 2 实现了简洁高效的 CSS 作用域隔离。

http://www.lryc.cn/news/596776.html

相关文章:

  • 基于SpringBoot+MyBatis+MySQL+VUE实现的实习管理系统(附源码+数据库+毕业论文+项目部署视频教程+项目所需软件工具)
  • Python通关秘籍(五)数据结构——元组
  • linux 驱动 - v4l2 驱动框架
  • Linux 重定向和缓冲区
  • docker-desktop启动失败
  • leetcode 1695. 删除子数组的最大得分 中等
  • importlib.import_module() 的用法与实战案例
  • MySQL 学习一 存储结构和log
  • HTML结构解析
  • SpringAOP的实现原理和场景
  • SQLAlchemy 2.0简单使用
  • c++day05(ASCII)
  • 性能测试-从0到1搭建性能测试环境Jmeter+Grafana+influxDB+Prometheus+Linux
  • “鱼书”深度学习入门 笔记(1)前四章内容
  • torchvision.transforms 与 MONAI 数据增强的异同
  • C# 类 封装 属性 练习题
  • RabbitMQ-交换机(Exchange)
  • Ajax第一天
  • 美团视觉算法面试30问全景精解
  • freertos关键函数理解 uxListRemove
  • JavaScript 01 JavaScript 是什么
  • 在 Linux 上安装 `pgvector`(这是一个 PostgreSQL 的向量类型扩展,常用于处理嵌入向量,便于进行向量相似度搜索)
  • JavaScript 03 严格检查模式Strict字符串类型详解
  • 从零开始学习大模型之文本数据处理
  • Kotlin伴生对象
  • Python的界面美化库 QDarkStyleSheet
  • 循环神经网络--NLP基础
  • 2025年6月GESP(C++五级):最大公因数
  • 【第三节】Class与Style绑定
  • p5.js 圆弧的用法