css - 使用 React Router 路由到另一个组件时 CSS 没有改变
问题描述
当我使用react-router-dom将我的应用程序路由到另一个组件时,CSS 不会改变。
这是用于演示的代码的简约版本
应用程序.js
import React from 'react';
import Home from './Home';
function App() {
return (
<div>
<Home></Home>
</div>
);
}
export default App;
主页.js
import React from 'react';
import './Home.css';
const Home = () => {
return (
<h1>Home</h1>
);
}
export default Home;
主页.css
body {
background-color: blue;
}
仪表板.js
从“反应”导入反应;导入'./Dashboard.css';
import React from 'react';
import './Dashboard.css';
const Dashboard = () => {
return (
<div className='content'>
<h1>Dashboard</h1>
</div>
);
}
export default Dashboard;
仪表板.css
.content {
display: flex;
align-content: center;
align-items: center;
}
index.js
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import Dashboard from './Dashboard';
import * as serviceWorker from './serviceWorker';
import { BrowserRouter as Router, Route } from 'react-router-dom';
ReactDOM.render(
<Router>
<div>
<Route exact path='/' component={App} />
<Route path='/dashboard' component={Dashboard} />
</div>
</Router>, document.getElementById('root'));
// If you want your app to work offline and load faster, you can change
// unregister() to register() below. Note this comes with some pitfalls.
// Learn more about service workers: ...
serviceWorker.unregister();
当我执行 /dashboard 时,它会加载 Dashboard 组件,但它会保留从 App 组件所在的 Home 组件加载的先前 CSS。背景保持蓝色。我希望当我路由到另一个组件时,因为我更改了 URL,它会加载新组件附加到它的任何 CSS,并摆脱以前的任何 CSS。那可能吗?
编辑:我在 CodeSandbox 中做了一个例子来说明。由于操场的限制,它与上面的代码有点不同,但功能是相同的。
可以看出,作为模块导入最终会全局导入。如果我们评论该行import Home from "./Home";
,蓝色背景就会消失。只需导入组件,就会导入整个 CSS,尽管 CSS 是以模块化方式导入的。我不确定我是否遗漏了什么。
编辑2:
以下是我尝试过的不同解决方案:
CSS Modules,但body样式仍然是全局加载的。
样式化的组件不允许我修改body或html选择器 CSS。他们要求我创建一个
<div>
元素,然后让该元素跨越整个身体,我将其设置为就好像它是身体一样。这是我不想使用的解决方法,因为为此我宁愿使用 CSS Modules for the whole body spanning 。内联样式也不允许我修改body或html选择器 CSS。我还需要使用像
<div>
Styled 组件中的 body spanning 之类的解决方法。
解决方案
问题
当您像在这里一样导入 CSS 时
import './Home.css';
您在全局范围内导入它,这意味着它一旦导入就不会消失。
解决方案
CSS 模块
您想要的是CSS Modules,它的使用方式如下:
import styles from './Home.css';
<a className={styles.myStyleClass}>Hello</a>
样式化的组件
或 CSS-in-js 框架,例如样式化组件,使用如下:
import styled from 'styled-components';
const MyStyledElement = styled.a`
color: blue;
`;
<MyStyledElement>Hello</MyStyledElement>
常规对象/内联样式
或者只是“常规” CSS-in-js,例如:
const myStyle = {
color: blue;
}
<a style={myStyle}>Hello</a>
在造型方面有很多选择,这些选择很流行,我鼓励您探索并查看您喜欢的选择。
推荐阅读
- javafx - Javafx2.2画布放大缩小失真问题
- javascript - 如何在其他文件中导出/使用 socket.io?
- vba - 使用 VBA/条件格式的热图
- laravel - 如何将 JSON 数据检索到 Laravel 并在视图上显示它的元素?
- gimp - 有没有办法在 GIMP 中将精灵表切割成单个图像?
- jquery - 填写表格,点击按钮,在线网站每 5 分钟显示一次提醒
- python - python matplotlib.pyplot log-log 绘图点未显示,因为 python 选择的 y 范围不好
- php - PDO 语句在 PHP 7 中不再起作用
- c - 用 C 编写的 Shell 有输出重定向错误:分段错误
- android - 为什么 onClick 方法将视图作为参数?