jim*_*ssy 0 sass reactjs webpack css-modules react-css-modules
我有一个简单的 scss 文件
.navItem {
cursor: pointer;
&.active {
color: $primaryPurple;
}
&:hover {
color: $primaryPurple;
}
span {
margin-left: 10px;
}
}
Run Code Online (Sandbox Code Playgroud)
出于某种原因,:hover
有效但.active
不起作用。正如您在下图中所看到的,li
显然有活动类,但我没有看到字体颜色 css 发生了变化。
TL;DR:将名称作为 JavaScript 对象传递,而不是像一个简单的字符串。
其实这个问题来自于css-modules
配置。显然,基于AdminSideBar_navItem__1aFBc
嵌入图片中的。您css-modules
在 Webpack 配置中的配置是:
// webpack config
module.exports = {
~~~
module: {
~~~
rules: [
{
test: /\.scss$/,
use: ExtractTextPlugin.extract({
fallback: 'style-loader',
use: [
{
loader: 'css-loader',
options: {
modules: true,
importLoaders: 1,
localIdentName: '[name]_[local]_[hash:base64:5]', // <=== Attention to this line
sourceMap: true,
}
},
~~~
],
}),
],
},
~~~
};
Run Code Online (Sandbox Code Playgroud)
因此,当您使用css-modules
它时,意味着您将拥有如此专业的优势,例如更压缩的 css 包文件或完整散列的不可读的丑化包。为了这些好处,你应该像 JavaScript 对象一样使用 CSS 类名,注意下面的 ReactJS 代码和 using css-modules
:
import React from 'react';
import cn from 'classnames'; // <=== install it to have easy coding
import styles from '[pathToScssFiles]/styles.scss';
const MyComponent = ({ isActive }) => (
<li className={cn(styles.navItem, isActive && styles.active)} />
);
Run Code Online (Sandbox Code Playgroud)
我希望你明白我的意思,你通过styles.active
一个简单的字符串:"active"
。所以css-modules
不能把你的类名作为一个对象,并把它作为一个简单的字符串传递给它,因此,"active" **BUT** in the CSS bundle file the
css-modules use the
'[name] [local] [hash:base64:5]'` 模式来变形它的名字。
你:hover
应该工作,它工作,因为任何人都不能改变它,它是一个伪类。
当然,为 编写一个奇怪的属性.active
:
.navItem {
cursor: pointer;
&.active {
fill: yellow;
}
Run Code Online (Sandbox Code Playgroud)
现在fill: yellow
在 Webpack 为你制作的 CSS 包中寻找。你看它是:
.navItem {
cursor: pointer;
&.active {
fill: yellow;
}
Run Code Online (Sandbox Code Playgroud)
注:该~~~
手段等。
归档时间: |
|
查看次数: |
1672 次 |
最近记录: |