iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >React和Vue项目问题怎么解决
  • 169
分享到

React和Vue项目问题怎么解决

2023-06-30 13:06:24 169人浏览 泡泡鱼
摘要

本篇内容主要讲解“React和Vue项目问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“React和Vue项目问题怎么解决”吧!组件库的样式覆盖不掉,这应该是很多前端在工作中遇到过的问

本篇内容主要讲解“ReactVue项目问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“React和Vue项目问题怎么解决”吧!

React和Vue项目问题怎么解决

组件库的样式覆盖不掉,这应该是很多前端在工作中遇到过的问题。今天从实际案例出发分析原因,最后会给出在React和Vue项目中的最优解。

本文会讲清:

  • React中CSS Module的原理是什么?:global是做什么的?

  • Vue中Scoped的原理是什么?深度作用选择器是什么?

先不讲概念,直接从需求出发:我使用了Antd组件库来展示一个日历。

React和Vue项目问题怎么解决

现在我想将当前日期上面的蓝色边框变成紫色。

可以试试你能不能实现。

不管是React还是Vue,整个Calendar是被封装起来的,我们没有办法在组件外简单加上style/class改动内部的样式。

import { Calendar } from 'antd';...<div className="myWrapper">  <Calendar class="custom"/></div>

定位要覆盖的样式


首先用开发工具定位对应的样式:.ant-picker-calendar-date-today,这就是我们要修改的地方。

React和Vue项目问题怎么解决

.ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date-today {    border-color: #1890ff; }

熟悉webpack的人应该知道,引入的CSS文件最终都会被style-loader处理。简单来说,它的作用就是把CSS文件打包,放在style标签内,最后塞进html中作为一个内部样式表。不管是组件库的样式还是我们写的自定义样式都是这样处理的。

React和Vue项目问题怎么解决

我们要把组件库的样式先于自定义样式引入,这样自定义样式才能有更高的优先级。

修改源文件


直接改组件库的CSS源码是最简单粗暴的方法。打开你项目的node_modules文件夹,一层层点开,找到对应样式文件,按照需求修改即可。

个人项目这样处理确实可行,但是团队合作时,同步别人本地的node_modules就比较麻烦,只能算一个60分解法。

全局CSS文件


之前提到,把自己写的的CSS文件放在组件库的样式后面,可以保障自定义有更高优先级。只要重写同名的样式,理论上就能实现覆盖组了。

但这样?处理会发现并不起作用:

.ant-picker-calendar-date-today {  border-color: purple; }
// src/Demo.js// 组件库的样式import 'ant-design-vue/dist/antd.css'; // 自定义样式import './demo.css'import { Calendar } from 'antd';...<div className="myWrapper">  <Calendar /></div>...

因为这里还涉及CSS组合选择器的优先级。

基础的优先级应该不用赘述:!important>内联样式>ID选择器>类选择器>标签选择器。(!important这种hack会导致项目不好维护,不提倡使用)

在这个基础上还有五种组合选择器要对优先级分数做累计,以类选择器为例:

  • 后代选择器(空格):.A .B选择.A元素后的所有.B元素,

  • 子元素选择器(大于号):.A>.B选择.A元素的直接后代中的.B元素

  • 相邻兄弟选择器(加号):.A+.B选择.A元素后紧邻的第一个兄弟.B元素

  • 后续兄弟选择器(~号):.A~.B选择.A元素后所有的兄弟.B元素

  • 交集选择器(连在一起):.A.B选择自身同时拥有.A和.B两个属性的元素

上面几个规则看着很复杂,其实用的多的就是第一个后代选择器,记住它就行。Antd组件库用的就是它:

.ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date-today {    border-color: #1890ff; }

如果说一个类选择器优先级分数是10分,那三个形成的后代选择器就是30分。

而自定义的样式?只有10分,所以即使放在更后面引入,也不能成功覆盖。

.ant-picker-calendar-date-today {  border-color: purple; // 覆盖为紫色}

需要完整重写整个选择器才能实现想要的效果。

这里补充一点,同样也是组合选择器,但并集选择器(逗号)优先级不累计:.A, .B选择.A或者.B元素(可以是逗号+空格)

样式隔离CSS Module和Scoped


上面我们引入自定义的全局CSS文件,实现了样式的覆盖,但是这种解法只能给80分。因为在实际工作中,项目Owner通常不允许使用全局CSS,这会造成样式污染:你定义了一个样式my_button,团队其他人恰巧也命名为my_button,这就造成样式冲突。

我们需要给每个文件做样式隔离,就好像是给它一个命名空间。通常使React项目使用的是用的是CSS Module,Vue项目使用Scoped标记。

接下来会讲清两种样式隔离的原理,以及使用样式隔离时怎么覆盖组件库的样式。

React的CSS Module

首先来了解一下CSS Module的原理。它的使用很简单,在CSS文件加一个后缀.module,然后当做一个变量引入到JS文件中。

// src/Demo.jsimport styles from './demo.module.css';export default function Demo() {  return (    <div className={styles.myWrapper}>      <Calendar />    </div>  );}
.myWrapper {  border: 5px solid black;}

被编译后?,插入的样式表和元素的class属性都会加上一个哈希值作为命名空间。

<style>.demo_myWrapper__Hd9Qg {  border: 5px solid black;}</style><div class="demo_myWrapper__Hd9Qg">...</div>

可以看到,原本的CSS选择器和HTML元素类名都从myWrapper变成了demo_myWrapper__Hd9Qg,前面加上了文件名,后面加上了哈希值,这样就能保障样式只在当前这个文件下生效了。

但是在这种样式隔离情况下,我们原本用作覆盖的CSS也被加上了哈希值,就像下图这样,这时没有办法选中UI组件,覆盖也就不会成功。

React和Vue项目问题怎么解决

所以,React给我们提供了一个语法:global。它生效范围内的样式会被当作全局CSS。

具体使用如下,在CSS文件中,使用:global包裹希望全局生效的样式

:global(.ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date-today) {  border-color:purple; }

SCSS或SASS中,还可以使用嵌套语法:

:global {  .ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date-today {    border-color:purple;  }}

最后编译出来的代码如下:

.demo_myWrapper__Hd9Qg {  border: 5px solid black;}.ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date-today {  border-color:purple;}

React和Vue项目问题怎么解决

借助:global语法,即使使用CSS Module进行样式隔离也可以如愿实现覆盖功能。

Vue中的Scoped

Vue中也有类似的样式隔离功能,使用Scoped标记CSS部分,使用也很简单?:

<style scoped>.myWrapper{  border: 5px solid black}</style>...<div class="myWrapper" >  <Calendar /></div>...

编译出来的代码如下:

<style>.myWrapper[data-v-2fc5154c] {  border: 5px solid black}</style><div class="myWrapper" data-v-2fc5154c>  ...</div>

可以看到,它的原理和CSS Module不太一样,Vue的Scoped会使CSS选择器后加上一个中括号。

这并不是Vue独创的语法,而是属性选择器。.myWrapper[data-v-2fc5154c]代表选择拥有data-v-2fc5154c这个属性的、同时是myButton类的HTML元素。只有这个文件内部的HTML元素才会被打上data-v-2fc5154c这个属性。其余文件的HTML元素即使是myWrapper类,这个样式也不会对他生效。

回到相同的问题,假如Vue项目在使用了Scoped做样式隔离,我们用于覆盖的样式也会加上属性选择器,但是UI组件内部的HTML元素都没有该属性。

React和Vue项目问题怎么解决

所以Vue提供了一个类似的语法:深度作用选择器。

使用很简单,把要“渗透“进组件内部的样式前面加上>>>,作用域内的CSS样式都不会带上哈希值作为属性选择器。

<style scoped>.myWrapper>>>.ant-picker-calendar-full .ant-picker-panel .ant-picker-calendar-date-today{  border-color:purple}</style><template>  <div class="myWrapper" >    <Calendar  />  </div></template>

编译后

<style>.myWrapper[data-v-2fc5154c].ant-picker-calendar-full.ant-picker-panel.ant-picker-calendar-date-today {  border-color:purple}</style><div class="myWrapper" data-v-2fc5154c>  <div class="ant-picker-calendar-full" data-v-2fc5154c>    <div class="ant-picker-date-panel">      <td class="ant-picker-cell-today"></td>    </div>  </div></div>

React和Vue项目问题怎么解决

借助深度作用选择器,可以将要用于覆盖CSS“渗透”进组件内部。

也可以将>>>写成/deep/或者::v-deep

相较于React的:global,Vue的深度作用选择器是一种更优秀的方案,它必须要一个前导(也就是上面例子中的.myWrapper选择器),前导依旧会被打上哈希值作为属性选择器,要渗透进去的样式实际上是作为它的子选择器,只在当前这个文件下生效,彻底避免造成全局污染。

到此,相信大家对“React和Vue项目问题怎么解决”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: React和Vue项目问题怎么解决

本文链接: https://www.lsjlt.com/news/329442.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • React和Vue项目问题怎么解决
    本篇内容主要讲解“React和Vue项目问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“React和Vue项目问题怎么解决”吧!组件库的样式覆盖不掉,这应该是很多前端在工作中遇到过的问...
    99+
    2023-06-30
  • Vue项目中怎么解决跨域问题
    本篇内容主要讲解“Vue项目中怎么解决跨域问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue项目中怎么解决跨域问题”吧!跨域跨域报错是前端开发中非常经典的一个错误,报错如下 Ac...
    99+
    2023-07-02
  • vue项目部署跨域问题怎么解决
    这篇文章主要介绍“vue项目部署跨域问题怎么解决”,在日常操作中,相信很多人在vue项目部署跨域问题怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue项目部署跨域问题怎么解决”的疑惑有所帮助!接下来...
    99+
    2023-06-30
  • React项目中className运用及问题解决
    目录抛出问题解决问题组件化思想className运用总结问题抛出问题 className 大家都用过吧,用它在 react 项目中设置样式。它的用法很简单,除了可以设置一个样式外,r...
    99+
    2022-12-15
    React项目className运用 React className
  • vue-cli创建项目的loader问题怎么解决
    这篇文章主要介绍“vue-cli创建项目的loader问题怎么解决”,在日常操作中,相信很多人在vue-cli创建项目的loader问题怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue-cli创建...
    99+
    2023-07-04
  • 如何解决基于Vue/React项目移动端适配的问题
    这篇文章给大家分享的是有关如何解决基于Vue/React项目移动端适配的问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。px2rem或postcss-px2rem在移动端中,为...
    99+
    2024-04-02
  • Vue项目报错:parseComponent问题及解决
    目录Vue项目报错:parseComponent报错内容解决步骤Vue常见错误及解决办法1.在配置路由并引入组件后2.在组件中的标签和样式中图片路径出错时3.在组件中标签没有闭合&n...
    99+
    2024-04-02
  • 聊聊jenkins部署vue/react项目的问题
    目录准备工作1、安装参数化部署插件2、安装好插件后,配置Nodejs环境创建项目构建centOS安装jenkins1、安装JDK2、安装jenkins3、配置jenkis的端口4、启...
    99+
    2024-04-02
  • Vue开发项目中的兼容问题怎么解决
    今天小编给大家分享一下Vue开发项目中的兼容问题怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1. KingEdit...
    99+
    2023-07-04
  • 如何解决React项目中碰到的IE问题
    这篇文章将为大家详细讲解有关如何解决React项目中碰到的IE问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。最近接手一个React项目,在IE下碰到了俩问题IE11报...
    99+
    2024-04-02
  • vue项目proxyTable配置和部署服务器的问题怎么解决
    这篇文章主要介绍“vue项目proxyTable配置和部署服务器的问题怎么解决”,在日常操作中,相信很多人在vue项目proxyTable配置和部署服务器的问题怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家...
    99+
    2023-06-30
  • 如何解决React使用browserHistory项目访问404的问题
    这篇文章主要介绍了如何解决React使用browserHistory项目访问404的问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。最近项...
    99+
    2024-04-02
  • 怎么解决vue项目打包后文件过大问题
    这篇文章主要讲解了“怎么解决vue项目打包后文件过大问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么解决vue项目打包后文件过大问题”吧!为什么打包后文件过大?移动app项目,使用vu...
    99+
    2023-06-30
  • react项目怎么改标题
    本教程操作环境:Windows10系统、react18.0.0版、Dell G3电脑。react项目怎么改标题?React项目修改标签页图标和标题 一、修改标签页标题: 在项目根目录打开cmd 使用vscode打开项目根目录public文件...
    99+
    2023-05-14
    React
  • Vue项目中该如何解决跨域问题
    目录跨域同源策略express服务器vue处理跨域express处理跨域总结跨域 跨域报错是前端开发中非常经典的一个错误,报错如下  Access to XMLHttpRe...
    99+
    2024-04-02
  • 解决运行vue项目内存溢出问题
    目录运行vue项目内存溢出记录一下JavaScript heap out of memory(Vue项目运行内存溢出)解决方法运行vue项目内存溢出 npm clone下拉的项目,s...
    99+
    2024-04-02
  • vue项目无法删除的问题及解决
    目录vue项目无法删除vue新增与删除问题vue项目无法删除 问题 今天删除本地的vue项目,一直提示“操作无法完成,因为其中的文件夹或文件已在另一个程序组打开,请关闭该...
    99+
    2024-04-02
  • vue项目中created()被调用多次的问题怎么解决
    本文小编为大家详细介绍“vue项目中created()被调用多次的问题怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue项目中created()被调用多次的问题怎么解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来...
    99+
    2023-07-05
  • vue-loader和webpack项目配置及npm错误问题的解决
    目录vue-loader和webpack项目配置及npm错误解决vue-loader webpack版本出现的问题问题描述解决方法vue-loader和webpack项目配置及npm...
    99+
    2024-04-02
  • React项目中decorators装饰器报错问题解决方案
    目录问题:问题: 我先安装了decorators: 然后运行项目就报错emmmmm: src\pages\home\cookbook\swiper.jsxLine 21: Par...
    99+
    2023-01-12
    react decorators装饰器报错 react decorators装饰器 decorators装饰器报错 React项目装饰器报错
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作