拥有一个从登录屏幕到仪表板的应用程序,其中包含两个页面:客户和项目。 当我加载这些屏幕时,它工作正常,但是当我返回浏览器或单击浏览器上的刷新时,css会丢失。 这是我的代码: 任何帮助都将不胜感激。
1) App.js
import React, {Component} from 'react';
import Login from './js/components/login/Login.js';
import Dashboard from './js/components/dashboard/Dashboard.js';
import {BrowserRouter as Router, Route, Switch, withRouter} from 'react-router-dom';
import store from './js/config/store'
import { Provider } from 'react-redux'
import PrivateRoute from './common/PrivateRoute';
import { getCurrentUser } from './util/APIUtils';
import { Layout, notification } from 'antd';
import { ACCESS_TOKEN } from './index';
//Private Route
import Projects from "./js/components/projects/Projects.js";
//Public Route
import Customers from "./js/components/customers/Customers.js";
const { Content } = Layout;
class App extends Component {
constructor(props) {
super(props);
this.state = {
currentUser: null,
isAuthenticated: true,
isLoading: false
}
// this.handleLogout = this.handleLogout.bind(this);
this.loadCurrentUser = this.loadCurrentUser.bind(this);
//this.handleLogin = this.handleLogin.bind(this);
notification.config({
placement: 'topRight',
top: 70,
duration: 3,
});
}
loadCurrentUser() {
this.setState({
isLoading: true
});
getCurrentUser()
.then(response => {
this.setState({
currentUser: response,
isAuthenticated: true,
isLoading: false
});
}).catch(error => {
this.setState({
isLoading: false
});
});
}
componentDidMount() {
this.loadCurrentUser();
}
render() {
return (
<Provider store={store}>
<Router>
<Switch>
<Route exact path="/"
render={(props) => <Login isAuthenticated={this.state.isAuthenticated}
currentUser={this.state.currentUser} handleLogout={this.handleLogout} {...props} />}>
</Route>
<Route path="/login"
render={(props) => <Login onLogin={this.handleLogin} {...props} />}></Route>
<PrivateRoute authenticated={this.state.isAuthenticated} path="/projects" component={Projects}></PrivateRoute>
<PrivateRoute authenticated={this.state.isAuthenticated} path="/customers" component={Customers}></PrivateRoute>
<PrivateRoute authenticated={this.state.isAuthenticated} path="/dashboard" component={Dashboard}></PrivateRoute>
</Switch>
</Router>
</Provider>
)
}
}
export default App
2)Dashboard.js
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { connect } from 'react-redux';
import { fetchProjects } from "../../actions/ProjectActions";
import '../../../css/main.css';
import {
Route,
NavLink,
BrowserRouter as Router,
Redirect,
withRouter
} from "react-router-dom";
//Private Route
import Projects from "../projects/Projects.js";
//Public Route
import Customers from "../customers/Customers.js";
class Dashboard extends Component {
render() {
return (
<Router>
<div>
<h1>Reporting Tool</h1>
<ul className="header">
<li><NavLink to="/projects">Projects</NavLink></li>
<li><NavLink to="/customers">Customers</NavLink></li>
</ul>
<div className="content">
<Route path="/projects" component={Projects}/>
<Route path="/Customers" component={Customers}/>
</div>
</div>
</Router>
);
}
}
export default Dashboard;
3)CSS
@import url('https://fonts.googleapis.com/css?family=Roboto:300,400,500');
* {
box-sizing: border-box;
padding: 0;
margin: 0;
}
h1, h2, h3, h4 ,h5, h6, p, ui, li{
font-weight: 400;
}
/*Dashboard*/
ul.header li {
display: inline;
list-style-type: none;
margin: 0;
}
ul.header {
background-color: #111;
padding: 0;
}
ul.header li a {
color: #FFF;
font-weight: bold;
text-decoration: none;
padding: 20px;
display: inline-block;
}
.content {
background-color: #FFF;
padding: 20px;
}
.content h2 {
padding: 0;
margin: 0;
}
.content li {
margin-bottom: 10px;
}
a {
text-decoration: none;
outline: none;
}
ul {
list-style: none;
}
body {
font-family: 'Roboto', sans-serif;
font-weight: 300;
color: #323531;
-webkit-font-smoothing: antialiased;
}
/* Login */
.wrapper {
display: flex;
flex-direction: row;
height: 100vh;
}
.wrapper .right {
flex: 3;
}
.wrapper .left {
display: flex;
flex-direction: column;
flex: 1;
align-items: center;
justify-content: center;
height: 100vh;
box-shadow: 2px 0 5px 0 rgba(43,40,43,0.3);
z-index: 1;
}
.left .login {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
width: 80%;
padding-bottom: 1rem;
}
.left .login .logo {
display: flex;
flex-direction: row;
align-items: center;
width: 100%;
padding-left: 1rem;
}
.left .login .logo img {
width: 100px;
}
.left .login .logo h1 {
font-size: 1.5rem;
}
.left .login label {
font-size: 0.9rem;
line-height: 2rem;
font-weight: 400;
}
.left .login form {
width: 80%;
padding-bottom: 2rem;
}
.login .text-input {
margin-bottom: 1.5rem;
width: 100%;
border-radius: 3px;
background: transparent;
border: 1px solid #4D52694D;
padding: 0.5rem 1rem;
line-height: 1.3rem;
}
.login .error-message {
display: none;
font-weight: 400;
color: #ED5565;
}
.login .error-message.show {
display: flex;
align-items: center;
justify-content: center;
width: 80%;
}
.login .form-actions {
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
}
.login .form-actions a {
color: #4D5269;
text-decoration: none;
text-align: center;
font-size: 0.9rem;
}
.login .or, .links {
width: 80%;
}
.secondary-btn {
width: 60%;
}
.login .links a {
display: block;
text-decoration: none;
text-align: center;
font-size: 0.9rem;
margin-bottom: 1rem;
}
.login .or {
display: flex;
flex-direction: row;
margin-bottom: 1.5rem;
align-items: center;
}
.login .or .bar {
flex: auto;
border: none;
height: 1px;
background: #4D52694D;
}
.login .or span {
color: #4D5269;
padding: 0 0.9rem;
}
.right .banner-showcase {
display: flex;
justify-content: center;
background: url('../image/banner-big.jpg') no-repeat center center / cover;
height: 100vh;
text-align: center;
}
.right .banner-showcase h1 {
font-size: 3rem;
width: 100%;
color: #fff;
padding-top: 2vh;
}
.login-footer {
text-align: center;
font-size: 0.8rem;
width: 80%;
padding-top: 3rem;
}
/* Buttons */
.primary-btn {
padding: 0.7rem 1rem;
height: 2.5rem;
display: block;
border: 1px solid #977ED9;
border-radius: 3px;
font-weight: 300;
background: transparent;
color: #977ED9;
text-decoration: none;
cursor: pointer;
text-align: center;
transition: all 0.5s;
}
.secondary-btn {
padding: 0.5rem 1rem;
font-size: 0.9rem;
height: 2.5rem;
display: block;
border: 1px solid #977ED9;
border-radius: 3px;
font-weight: 300;
background: transparent;
color: #977ED9;
text-decoration: none;
cursor: pointer;
text-align: center;
transition: all 0.5s;
}
/* React progress button */
.pb-container {
width: 100%;
}
.pb-container .pb-button {
background: transparent;
border: 1px solid #977ED9;
border-radius: 3px;
padding: 0.7em 1em;
height: 2.5rem;
width: 100%;
}
.pb-container .pb-button span {
font-size: 0.9rem;
color: #977ED9;
font-weight: 300;
}
.pb-container .pb-button svg {
height: 2.5rem;
width: 2.5rem;
}
.pb-container.loading .pb-button {
width: 2.5rem;
border-radius: 27px;
color: #977ED9;
}
.pb-container.error .pb-button {
border-color: #ED5565;
background-color: #ED5565;
}
.pb-container.success .pb-button {
border-color: #A0D468;
background-color: #A0D468;
}
答案 0 :(得分:1)
由于main.css是全局样式表,因此您可以将其添加到index.html中,而不必尝试将其导入JS
如果您使用了Create React App或类似的工具,则index.html文件可能会保存在/public
文件夹中。
您可以将main.css文件复制到该公用文件夹,然后将其添加到<head>
标记中,如下所示:
<head>
<link rel="stylesheet" href="main.css">
</head>