在 ReactJS 中更改组件时如何修复错误覆盖 CSS

How to fix error override CSS when change component in ReactJS

Login.js

import React from 'react'

export default class Login extends React.Component {
   componentWillMount(){
        import ('./styles/login_page.css');
    }
   ....
   <Link to="/register">Create account</Link>
}

Register.js

import React from 'react''

export default class Register extends React.Component {
   componentWillMount(){
        import ('./styles/register_page.css');
    }
   ....
   <Link to="/login">Login Now</Link>
}

App.js

import React from 'react'
import ReactDOM from 'react-dom'
import { Route, Switch, BrowserRouter } from 'react-router-dom'
import Login from './Login'
import Register from './Register'
import PageNotFound from './PageNotFound'

ReactDOM.render(
  <BrowserRouter>
    <Switch>
        <Route exact path='/login' component={Login }/>
        <Route exact path='/' component={Home} />
        <Route exact path='/register' component={Register }/>
        <Route component={PageNotFound} />
      </Switch>
  </BrowserRouter>,
  document.getElementById('root'));

渲染后,我点击登录,然后点击创建帐户,再次点击登录,登录组件的 CSS 被注册组件的 CSS 覆盖,主页相同。我想在转到任何组件时,组件的 CSS 正在加载。有办法解决吗?

这通常通过在 CSS 中使用 descendant combinator 来解决。您需要在每个组件的根元素中设置一个不同的 class,并通过将它们的 select 或 class 的后代写入来声明所有其他 CSS 样式。 17=]

Login.js

import React from 'react'

export default class Login extends React.Component {
   componentWillMount(){
        import ('./styles/login_page.css');
    }
   ....
   <Link class="login-component" to="/register">Create account</Link>
}

login_page.css

.login-component .item1 { ... }
.login-component .item2 { ... }

Register.js

import React from 'react''

export default class Register extends React.Component {
   componentWillMount(){
        import ('./styles/register_page.css');
    }
   ....
   <Link class="register-component" to="/login">Login Now</Link>
}

register_page.css

.register-component .item1 { ... }
.register-component .item2 { ... }

因此,即使两个组件都具有匹​​配 .item1.item2 的元素,由于后代组合器,它们也会 select 正确的规则。对于原始 CSS,这可能有点冗长,但如果您使用任何预处理器,它应该非常简单。

否则,您可能只是想以某种方式使 select 不同。

我在同一应用程序中使用不同的 css 模块时也遇到了同样的挑战,我猜问题出在编译器构建 css 时,因为所有 css被编译成一个文件,你可能想通过给它们不同的主 class 名称来区分它们。

如果您使用 sass[=12=,那么在这种情况下的解决方案是将 css 样式嵌套在基础 class 中]

.loginpageContainer {
  .input{ //custom css
 }}
.registerPageContainer{ 
 .input{
// custom css
}}

如果你使用纯 css 同样明智,只需使用主 class

.loginContainer .login .input{
//custom css
} 
.registerContainer .login .input{
//custom css
}