Vue3的三种样式控制及实现原理

news2024/9/22 3:59:48

你好,我是沐爸,欢迎点赞、收藏和关注。个人知乎

Vue3中一共有三种样式控制,分别是全局样式控制、局部作用域样式控制和深度样式控制,今天我们一起看下这三种样式控制的使用,以及实现的原理是什么。

一、全局样式控制

在组件中定义的样式,默认是全局有效的。也就是说,无论对于根组件App.vue,还是普通的视图组件或公共组件,在style标签中定义的样式都是全局样式。

原因在组件标签中的样式,在打包时没有额外添加其他限制条件,自动成为了全局样式。

App.vue

<template>
  <header>
    <img alt="Vue logo" class="logo" src="@/assets/logo.svg" width="125" height="125" />

    <div class="wrapper">
      <HelloWorld msg="You did it!" class="p-20" />

      <nav>
        <RouterLink to="/">Home</RouterLink>
        <RouterLink to="/about">About</RouterLink>
      </nav>
    </div>
  </header>
  
  <RouterView />
</template>

<style>
a {
  color: red !important;
}
</style>

示例中的样式会导致全局的a标签都是红色。

image.png

二、局部作用域样式控制

全局样式的弊端也很明显:样式很可能产生冲突和覆盖。局部作用域样式只在当前组件内部生效,不影响其他组件(可能影响子组件的根标签,如果你在组件上添加class并定义样式的话)。使用起来也很方便,只需要在style标签上添加scoped属性即可。

App.vue

<template>
  <header>
    <img alt="Vue logo" class="logo" src="@/assets/logo.svg" width="125" height="125" />

    <div class="wrapper">
      <HelloWorld msg="You did it!" class="p-20" />

      <nav>
        <RouterLink to="/">Home</RouterLink>
        <RouterLink to="/about">About</RouterLink>
      </nav>
    </div>
  </header>
  
  <RouterView />
</template>

<style scoped>
a {
  color: red !important;
}
.p-20 {
  padding: 20px;
}
</style>

HelloWorld.vue

<template>
  <div class="greetings">
    <h1 class="green">{{ msg }}</h1>
    <h3>
      You’ve successfully created a project with
      <a href="https://vitejs.dev/" target="_blank" rel="noopener">Vite</a> +
      <a href="https://vuejs.org/" target="_blank" rel="noopener">Vue 3</a>.
    </h3>
  </div>
</template>

<style scoped>
a {
  color: green;
}
.greetings {
  padding: 20px;
}
</style>

App.vue中定义的样式,a标签的样式只在App.vue中生效,不会影响HelloWorld.vue中的a标签,而.p-20则会影响HelloWorld.vue的根标签的样式。

局部作用域样式的原理并不复杂,Vue内部主要做了两件事情:

(1)一旦style声明为scoped,当前组件的所有标签和子组件的根标签,都会自动动添加名为 data-v-xxx的唯一标识。

(2)在打包运行的页面中,样式选择器的最右侧添加了名为data-v-xxx 的属性选择器,导致只有该属性的元素才会具有该属性选择器的样式。

image.png

三、深度样式控制

如何让组件的局部样式影响子组件的子标签呢?这就需要使用Vue提供的深度作用域选择器来实现。只需要将要修改的标签用":deep()"包裹即可。

例如我们要在App.vue中修改HelloWorld.vue组件的h1标签的下外边距,App.vue可以这样设置:

<template>
  <header>
    <img alt="Vue logo" class="logo" src="@/assets/logo.svg" width="125" height="125" />

    <div class="wrapper">
      <HelloWorld msg="You did it!" />

      <nav>
        <RouterLink to="/">Home</RouterLink>
        <RouterLink to="/about">About</RouterLink>
      </nav>
    </div>
  </header>
  
  <RouterView />
</template>

<style scoped>
.wrapper :deep(.green) {
    margin-bottom: 30px;
}
</style>

深度样式控制的实现原理是什么?deep声明将选中标签原本具有的data-v-xxx 的属性选择器给移除了。如果不明白,详细看下方的截图:

image.png

四、总结

你有可能看着本篇博客的内容有些眼熟,如果你读过《剑指Vue3–入门到实践》,内容来自4.3章节。今天的分享更像是一个学习笔记,分享的示例和语言组织都是个人感悟,并非照搬原文。

好了,分享结束,谢谢点赞,下期再见。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2068963.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据恢复技术-手动修复MBR-/NTFS分区

前言 本文只作为本人学习笔记&#xff0c;不做他用&#xff0c;转载请注明原处谢谢&#xff01; 本文教大家如何手工修复MBR引导分区&#xff0c;找回丢失的数据&#xff0c;先附加题目镜像&#xff08;右键我的电脑或win标&#xff0c;选择管理/磁盘管理---操作---附加VHD&…

笔记整理—uboot启动过程(2)BL1低级初始化

lowlevel_init看名字就知道是关于初级方面的初始化&#xff0c;其中可用将其干的事情分为11个步骤&#xff1a; &#xff08;1&#xff09;push {lr} 也就是lr压栈。 &#xff08;2&#xff09;检测复位状态&#xff1a;如冷上电、热启动、睡眠等。冷上电要初始化DDR后才能使用…

MS2232/MS2232T——±20kV ESD 保护、3V-5.5V 供电、真 RS-232 收发器

MS2232/MS2232T 芯片是集成电荷泵、具有 20kV ESD 保护的 RS-232 收发器&#xff0c;包括两路接收器、两路发送器。芯 片满足 TIA/EIA-232 标准&#xff0c;为异步通信控制器和串口连接器 提供通信接口。 芯片采用 3V-5.5V 供电&#xff0c;电荷泵仅用 4 个 0.1-0.47μF 小…

GUI / GitOps / API: 用 Bytebase 实现 SQL 审核

修改数据库中的数据时&#xff0c;确保安全准确至关重要。Bytebase 提供 SQL 审核功能&#xff1a;将 SQL 变更应用到数据库之前&#xff0c;可对其进行评估。SQL 审核可通过 Bytebase GUI、GitOps 工作流或 API 触发。 本教程将使用 Bytebase 的 SQL 审核来改进数据库 Schema …

对数据治理和云采用的思考:过去和现在

组织在向云服务转变的过程中面临数据治理复杂性和挑战。 如今&#xff0c;到了 2024 年&#xff0c;形势已经发生了变化&#xff0c;但根本问题却愈演愈烈。 数据的增长以及网络攻击的频率和复杂性不断增加&#xff0c;使得对强大的数据治理和安全的需求比以往任何时候都更加…

Educational Codeforces Round 169 (Rated for Div. 2)

前言 电脑显示屏一闪一闪地感觉要拿去修了&#xff0c;比赛时重启了好几次。 手速场&#xff0c;E 题没学过 Sprague-Grundy 吃了亏&#xff0c;好在前四题都一发过才不至于掉分。 Standings&#xff1a;1214 题目链接&#xff1a;Dashboard - Educational Codeforces Round 16…

shell脚本中$0 $1 $# $@ $* $? $$ 的各种符号意义详解

文章目录 一、概述1.1、普通字符1.2、元字符 二、转义字符$2.1、实例12.2、实例22.3、实例32.4、实例42.5、实例5 三、linux命令执行返回值$?说明 一、概述 shell中有两类字符&#xff1a;普通字符、元字符。 1.1、普通字符 在Shell中除了本身的字面意思外没有其他特殊意义…

设计模式-结构性模式-桥接模式

1.桥接模式定义 桥接模式就是将抽象部分与他的实现部分分离&#xff0c;使他们都可以独立的变化&#xff1b; 桥接模式用一种巧妙地方式处理多层继承存在的问题&#xff0c;用抽象关联来取代传统的多层继承&#xff0c;将类之间的静态继承关系转变为动态的组合关系&#xff0c;…

26个希腊字母写法和读音

瞧&#xff0c;在许多时候都会用到这些希腊字母&#xff0c;但不认识更不知道怎么读&#xff0c;so 记录一下便于查阅 26个希腊字母写法和读音 大写小写中文名英文注音意义Aα阿尔法Alpha角度;系数Bβ贝塔Beta磁通系数;角度;系数「γ伽玛Gamma电导系数(小写)Δδ德尔塔Delta变…

ES之二:centos7安装kibana和IK分词器

目录 一、Kibana介绍二、Kibana安装1、注意elasticsearch 和 kibana使用同一个版本2、更改配置3、kibana使用 三、Kibana安装1. 解压ik分词器2. 重新启动ES启动报错&#xff1a; 一、Kibana介绍 Kibana是一个针对Elasticsearch的开源分析及可视化平台&#xff0c;使用Kibana可…

客户端可以访问ntp时钟源,时间却一直不同步的问题

ntp时钟源通常是通过开放123 的udp端口对外提供ntp服务的&#xff0c;udp端口的访问可以通过nc -uvz xx.xx.xx.xx 123 端口进行验证&#xff0c;验证发现ntp时钟服务的123端口是开放的&#xff0c;也没有防火墙拦截123端口&#xff0c;但为什么客户端不同步ntp时钟源呢&#xf…

鸿蒙内核源码分析(异常接管篇) | 社会很单纯,复杂的是人

为何要有异常接管? 拿小孩成长打比方&#xff0c;大人总希望孩子能健康成长&#xff0c;但在成长过程中总会遇到各种各样的问题&#xff0c;树欲静而风不止&#xff0c;成长路上有危险&#xff0c;有时是自己的问题有时是外在环境问题.就像抖音最近的流行口水歌一样&#xff…

dp的练习总结(9)

P8766 异或三角 1.由题干给出的条件可知&#xff1a; (1)1≤a,b,c≤n&#xff0c;可得上限和枚举的范围 (2)a⊕b⊕c0&#xff0c;只有当前位相同的二进制数字异或才是 0&#xff0c;所以由此可知&#xff0c;当前位 a,b,c 都选 0&#xff0c;或 a,b,c 中任意两个数选择 1。同时…

Linux jobs命令:查看和管理后台任务

目录 一、jobs命令简介二、jobs命令适用的Linux版本三、jobs命令的基本语法四、jobs命令的常用选项或参数五、jobs命令实例5.1 显示当前shell中的后台作业将命令放到后台查看后台作业状态将后台作业带到前台 5.2 显示后台作业的进程号5.3 显示已停止的后台作业5.4 显示上次shel…

it程序员常用的技术社区网站有哪些

it程序员常用的技术社区网站有哪些??作为程序员&#xff0c;选择好合适的开发社区对提高自己的编程能力会有很大的帮助&#xff0c;技术人员经常会在各种技术交流社区游逛。优秀的实时开发社区确实能帮你积累不少开发经验技术教程 _ 网址大全 _ 博科趣 - 第1页技术教程网站,技…

cuda性能分析工具: nsight systems

安装 1. 安装nsys&#xff0c; nsys可以用命令行生成性能分析报告&#xff0c;参考&#xff1a; nsys profile 2. 安装Nsight Systems可视化工具NVIDIA Nsight Systems | NVIDIA 开发者 使用方法 1. 找一个可执行的cuda程序&#xff0c;编译成可执行文件&#xff0c;比如m…

14-17岁未成年如何办理能一直用的手机卡?

14-17岁未成年如何办理能一直用的手机卡&#xff1f; 有些姐妹要去外面上学&#xff0c;都想要一张属于自己的手机卡。 但是因为反诈的原因&#xff0c;对于手机卡的申领特别严格。 很多不满18岁的人能申领的卡&#xff0c;都是物联卡或者纯流量卡&#xff0c;只能上网&#x…

pytorch深度学习基础 6(简单的参数估计学习2)

上一节我们建立了一个简单的模型进行分析散点图&#xff0c;利用均方差来实现损失函数的计算&#xff0c;但是并没有计算出具体的参数值&#xff0c;这次我们来计算损失函数的损失值以及不断减小损失值&#xff0c;计算出最优的参数&#xff0c;代码原理非常简单大家可以自行理…

TOMCAT-企业级WEB应用服务器

一 WEB技术 1.1 HTTP协议和B/S 结构 HTTP&#xff08;HyperText Transfer Protocol&#xff09;协议即超文本传输协议&#xff0c;是用于在万维网&#xff08;WWW&#xff09;上传输超文本内容的基础协议。 一、HTTP 协议的特点 1、简单快速 客户向服务器请求服务时&#…

八股(3)——计网

八股&#xff08;3&#xff09;——计网 3. 计算机基础3.1 计算机网络OSI 七层模型是什么&#xff1f;每一层的作用是什么&#xff1f;TCP/IP 四层模型是什么&#xff1f;每一层的作用是什么&#xff1f;1. 应用层&#xff08;Application layer&#xff09;2. 传输层&#xff…