首页 > 其他分享 >深入理解Vue3中style的scoped

深入理解Vue3中style的scoped

时间:2024-09-20 09:23:39浏览次数:3  
标签:style vue 样式 scoped Vue3 组件 sfc compiler

概述

scoped的作用就是样式模块化(CSS Module),即给组件每一个元素(以及非动态添加的子组件的根元素)加上一个data-v-xxxx的属性,样式选择器也会格式化成选择器[data-v-xxxx],这样就做到了样式隔离,每个组件内定义的样式只对该组件生效,避免了不同组件或页面的样式(选择器)冲突。本文将以vue3为例,深入了解scoped原理。

scoped实践

  • vue3组件是如下定义样式:
<template>
  <div class="header">
    <span>标绘管理</span>
  </div>
</template>
<style scoped>
.header span {
  position: relative;
  margin-left: 54px;
  font-size: 16px;
  display: inline-flex;
  height: 24px;
  line-height: 24px;
  font-family: "Microsoft YaHei";
  font-weight: bold;
  color: #303133;
}
</style>
  • 效果如下:

在这里插入图片描述

scoped源码分析

compiler-sfc模块

vue3中有个模块@vue/compiler-sfc,这个模块是单独拎出来,不会被打包到vue.global.jscompiler-sfc主要作用就是用来编译单文件组件,就是.vue。因为scoped的实现是在compiler-sfc模块中,所以本文的所有的讨论也是基于SFC

viteplugin-vue

vue3如果是通过vite搭建的,那么compiler-sfc会通过viteplugin-vue调用,这在script 标签的 setup 实现原理中有讲解,可以简短回顾。

Style 样式选择器中的处理

plugin-vue中会读取.vue组件,并识别<style></style>部分,如下

if (query.type === "style") {
   
  return transformStyle(
    code,
    descriptor,
    Number(query.index || 0),
    options.value,
    this,
    filename
  );
}

transformStyle函数会将<style></style>的 code 传给compiler.compileStyleAsync,并返回编译的结果,其中参数包含idscoped

  • id的生成

    id包含于descriptor中,其生成过程如下所示:

descriptor.id = getHash(normalizedPath + (isProduction ? source : "")); // normalizedPath:序列化文件路径后的字符串,如果是生产环境,还会加上源码

function getHash(text) {
   
  return node_crypto
    .createHash("sha256")
    .update(text)
    .digest("hex")
    .substring(0

标签:style,vue,样式,scoped,Vue3,组件,sfc,compiler
From: https://blog.csdn.net/m0_46281382/article/details/142362456

相关文章

  • 【vue3】vue3.5
    vue3.5是9.1发布的,还挺热乎的,赶快学习起来!!!组件属性结构解析赋值组件属性结构解析赋值,高度提高开发体验,这个特性曾经在vue3.3提出过,然后3.4废弃,终于3.5稳定了。下面一起来看看怎么用的吧。<scriptsetuplang="ts">import{watch}from'vue';//自定义属性......
  • vue3/配置Element-Plus主题颜色
    1.了解主题颜色在Element-Plus中,主题颜色通常包含以下属性:主色(PrimaryColor):主色是应用中使用最频繁的颜色,通常用于按钮、链接、图标等,以提供视觉焦点和品牌识别度。辅助色(AuxiliaryColors):辅助色用于支持和补充主色,可以用于不同的组件状态,如成功、警告、错误等。中性......
  • vue3/Element-Plus/路由的使用
    我们来实现一个简单的二级路由1.准备主页和要配置的组件主页面<template><!--加载配置路由--><RouterView></RouterView></template><stylescoped></style>组件1<template><div>考试组件</div></template>组件2<temp......
  • Vue3项目开发——新闻发布管理系统(七)
    文章目录九、新闻分类管理模块设计开发1、新闻分类主页面设计2、封装页面组件3、改造页面4、新闻分类表格渲染4.1封装API,获取新闻分类数据4.2表格动态渲染4.3表格增加loading效果5、实现新闻分类添加和编辑功能5.1点击显示弹层5.2封装弹层组件Ca......
  • 路由跳转登录权限判断/vue3
    1main.ts引入路由和权限校验importrouterfrom"./router";//路由守卫权限拦截2-2import"@/router/permisstion";2router文件夹,三个文件1.1indexe.tsimport{createRouter,createWebHistory}from"vue-router";import{constRouter}from".......
  • vue3自定义指令,全局注册
    1这是directive.js注册的的importtype{Directive,DirectiveBinding}from"vue";importuseUserStorefrom"@/stores/user";import{createPinia}from"pinia";constuserStore=useUserStore(createPinia());//buttonList:["......
  • 【VUE3.0】动手做一套像素风的前端UI组件库---Button
    目录引言做之前先仔细看看UI设计稿解读一下都有哪些元素:素材补充代码编写1.按钮四周边框2.默认状态下按钮颜色立体效果3.鼠标移入聚焦4.模拟鼠标点击效果组件封装1.按类型设置颜色2.设置按钮禁用状态3.处理一个bug4.看下整体组件效果5.完整代码总结引言......
  • 前后端分离Vue3+SpringBoot零食批发商仓库管理系统
    目录功能和开发技术介绍具体实现截图开发核心技术介绍:技术创新点vue3和vue2的区别:核心代码部分展示系统开发流程系统运行步骤非功能需求分析操作可行性软件测试源码获取功能和开发技术介绍本系统操作无需详细的操作文档,只需要用户简单的进行操作就可以掌握操作流程,......
  • 前后端分离Vue3+SpringBoot房屋租赁系统(编号:49930163)
    目录功能和开发技术介绍具体实现截图开发核心技术介绍:技术创新点vue3和vue2的区别:核心代码部分展示非功能需求分析系统开发流程系统运行步骤软件测试源码获取功能和开发技术介绍本系统操作无需详细的操作文档,只需要用户简单的进行操作就可以掌握操作流程,购买古装操......
  • 前后端分离Vue3+SpringBoot县乡村生活垃圾治理问题中运输地图的设计与实现
    目录功能和开发技术介绍具体实现截图开发核心技术介绍:技术创新点vue3和vue2的区别:核心代码部分展示系统开发流程系统运行步骤非功能需求分析操作可行性软件测试源码获取功能和开发技术介绍技术范围:SpringBoot、Nodejs、Python、Vue、爬虫、数据可视化、小程序、安卓......