首页 > 其他分享 >vue的scoped中的class data-v-xxx生成规则为什么是按照文件的路径?

vue的scoped中的class data-v-xxx生成规则为什么是按照文件的路径?

时间:2024-02-05 09:47:25浏览次数:18  
标签:vue 哈希 样式 xxx 路径 生成 Vue scoped 组件

Vue.js中,当在单文件组件(.vue 文件)的 <style> 标签上使用 scoped 属性时,Vue Loader 会为组件中的 CSS 添加一个唯一的属性选择器,以确保样式只作用于当前组件内的元素。这个独特的属性通常格式为 data-v-xxx,其中 xxx 是一个根据文件内容和路径生成的哈希值。

生成规则基于文件内容和路径的原因是为了保证:

  1. 唯一性:每个组件都有一个独立的哈希标识符,即使有多个组件包含相似或相同的类名,它们各自的样式也不会相互影响。

  2. 模块化与复用:由于Vue是基于组件化开发,不同的组件可能存在于项目中的不同目录下,通过将组件的路径纳入哈希计算,可以确保即使是具有相同类名的两个不同组件,在不同的位置也会得到不同的 scoped 样式前缀,从而实现样式隔离。

  3. 缓存友好:当组件文件的内容发生变化时,对应的哈希值会发生变化,这有助于浏览器准确地识别出哪些样式需要重新加载,有利于缓存策略的实施。

因此,Vue Loader 使用文件路径和内容来生成 data-v-xxx 的目的就是为了提供一种可靠的机制来实现CSS样式的局部作用域,并且保持项目的可维护性和性能优化。

为什么使用文件路径呢?

使用文件路径作为生成 scoped 样式选择器哈希的一部分,主要是为了增强组件样式隔离的唯一性和确定性:

  1. 唯一标识:在大型项目中,可能会有多个组件具有相同的类名。通过结合文件路径信息生成哈希值,可以确保即使两个不同位置的组件拥有相同的类名,它们也会被赋予不同的 scoped 选择器,从而避免样式冲突。

  2. 支持组件移动与重命名:当开发过程中需要移动或重命名组件时,由于哈希包含了文件路径,所以更改文件位置后,对应的 scoped 选择器也会相应改变,确保移动后的组件依然保持良好的样式隔离效果,不会影响其他位置已存在的同名组件。

  3. 增量编译与缓存更新:Vue Loader 在编译过程中,如果文件路径发生变化,则生成的选择器哈希也随之变化,这有助于准确识别出哪些样式需要重新编译和加载,有利于提高构建效率并合理利用浏览器缓存。

总之,基于文件路径来生成 scoped 样式的哈希前缀是一种有效的策略,它有助于实现 Vue.js 组件化开发中的样式局部作用域,并适应于组件在整个项目结构中的移动、复用以及维护场景。

在 React 内部,调用组件的“父路径”生成 useId。这就是为什么如果客户端和服务器的树相同,不管渲染顺序如何,“父路径”始终都匹配。vue中是不是也有这方面的考虑

在React中,通常使用useId这样的Hook来生成唯一标识符(ID),这有助于在组件内部创建唯一的DOM元素ID或类名。React Hooks并不直接依赖于“父路径”,而是基于每个组件实例的内部状态来确保即使在客户端和服务器端渲染(CSR与SSR)过程中顺序不同,也能生成一致的ID。

Vue.js中实现类似功能时,尽管Vue本身并没有内置的类似于useId的Hook,但开发者可以编写类似的逻辑来生成全局唯一的ID。在Vue 3中,可以通过组合getCurrentInstance()API和自定义Hook的方式来获取当前组件实例及其上下文信息,从而依据组件在组件树中的位置或者其它相关信息来生成一个确定的ID。

Vue在处理SSR场景时,同样需要保证无论是服务端还是客户端渲染时,对于同一组件实例生成的内部状态是一致的。虽然Vue没有像React那样直接提供基于父路径生成ID的机制,但是开发者可以根据组件自身的生命周期钩子函数、组件实例属性或者结合Vue Router等工具提供的信息来构建出稳定的ID生成策略。

Vue在设计上也强调组件的独立性和可复用性,通过props、v-model、emit等方式进行父子组件间的通信和状态同步,这些机制有助于在不依赖特定渲染顺序的情况下维持应用状态的一致性。

标签:vue,哈希,样式,xxx,路径,生成,Vue,scoped,组件
From: https://www.cnblogs.com/longmo666/p/18007407

相关文章

  • 零基础入门Vue之To be or not to be——条件渲染
    温故上一节:零基础入门Vue之皇帝的新衣——样式绑定在前面的内容能了解到,Vue不仅仅能进行数据渲染还可以对样式进行绑定并且他能随意的切换样式,但Vue的初衷就是尽量少让使用者操作dom节点加入你要让指定dom显示或者不显示,该怎么办呢?以目前的东西来说,不拿到dom节点还是做不到的......
  • vue2中使用富文本编辑器tinyMCE全过程
    TinyMCE中文文档地址:http://tinymce.ax-z.cn/1.安装[email protected]$npminstall@tinymce/[email protected].将node_modules/tinymce文件夹下的plugins文件夹和skins文件夹直接复制到public/tinymce目录下3.引入汉语包在plublic/tinymce文......
  • Highcharts 在Vue3 TS 引入
    前沿在vue3中引入 Highcharts但是在你要是这么引入的话最新的版本 Highcharts 然后就在main.ts下引入就会报错 //UsetheHighchartsVueplugin,register<highcharts>component//@ts-ignoreapp.use(Highcharts)这么写虽然不会报错,但是还是无法在页面里面使......
  • Vue 3开发者必看:路由传参的终极分析与实践建议!
    前言在Vue应用中,路由传参是一项常见的需求,它允许我们在不同的页面之间传递数据,实现更加灵活和动态的页面交互。下面我将介绍如何在Vue应用中实现路由传参,包括基本的路由参数传递和更复杂的场景下的传参技巧。router与route区别router是通过VueRouter构造函数new出来得到了的一......
  • Vue 用户提问:如何在 React 中实现全局路由守卫?
    前言如果想在vue中实现全局路由守卫,只需要在beforeEach中写路由守卫逻辑即可。但是如果使用react的话,应该怎么做呢?在react中,其实是没有beforeEach的,如果需要实现路由守卫,需要结合 ReactRoute 路由库,自己手动搓一个路由守卫。需求我的这个管理系统对于路由守卫......
  • 关于 AJAX 请求跨域问题在 Vue 项目中的解决方式
    0.前言关于域,sry刚刚新建文件夹,写好了就换过来;此文为88岁高龄、入门级前端初心者专用笔记;暂时只关心AJAX请求受同源策略的影响及在Vue项目中的解决方式捏;1.必要性1.0你需要知道(1)协议、域名、端口都相同,才为同源;(2)浏览器报跨域错误,并不是服务器没有返回,而......
  • 零基础入门Vue之皇帝的新衣——样式绑定
    回顾大致掌握了上一节的插值语法我已经可以把想要的数据显示到页面上,并且仅需要修改变量,页面就会跟着实时改变但如果对于已经熟悉前端的人来说,单单有数据还是不太行,还需要css对数据进行样式的修饰,让页面更加好看所本篇将记录记录Class与Style绑定的学习总所周知,想要给D......
  • Vue入门
     CDN引入vuevue常用指令v-for 循环渲染语法:v-for="(item,index)initems"items:遍历的数组item:遍历出来的元素index:索引下标v-bind 动态绑定作用:为空间动态绑定属性值,href,css,etc语法:v-bind:属性名=“属性值”简化::属性名=“属性值” v-if   v-sho......
  • 轻松掌握Vue:一键导出PDF和Word文档的秘诀!
    适用业务需求:将当前页面显示内容导出pdf或者word文件实现思路:先将显示内容转成图片base64地址,再生成相应文件注意:显示内容直接转图片慎用::before、::after这些css,svg图标,不然可能出现生成的图片样式丢失问题,如果确实需要显示svg图标的话目前做法是转成png显示,如有更好方法,欢迎补充......
  • vue2.x的项目运行问题(export,set)
    Windows系统修改package.json文件:"scripts":{"serve":"setNODE_OPTIONS=--openssl-legacy-provider&&vue-cli-serviceserve","build":"setNODE_OPTIONS=--openssl-legacy-provider&&vue-cli-s......