Javascript 页面刷新后,“材质UI”按钮将丢失样式
我正在使用useStyles设置登录页面的样式。页面上的所有内容都具有正确的样式,刷新后,除了按钮之外,它不会丢失样式。 按钮是页面中唯一在刷新后丢失样式的东西 Login.js:Javascript 页面刷新后,“材质UI”按钮将丢失样式,javascript,reactjs,material-ui,styling,Javascript,Reactjs,Material Ui,Styling,我正在使用useStyles设置登录页面的样式。页面上的所有内容都具有正确的样式,刷新后,除了按钮之外,它不会丢失样式。 按钮是页面中唯一在刷新后丢失样式的东西 Login.js: import { useEffect, useState, Fragment } from 'react'; import axios from 'axios' import { BrowserRouter as Router, Switch, Route, MemoryRouter, Redirect, useHi
import { useEffect, useState, Fragment } from 'react';
import axios from 'axios'
import { BrowserRouter as Router, Switch, Route, MemoryRouter, Redirect, useHistory } from "react-router-dom";
import { useStyles } from './style/Login-styling'
import { Container, Grid, Paper, Avatar, TextField, Button, Typography, Link, Snackbar } from '@material-ui/core'
import MuiAlert from '@material-ui/lab/Alert';
import Slide from '@material-ui/core/Slide';
const bcrypt = require('bcryptjs');
function TransitionUp(props) {
return <Slide {...props} direction="up" />;
}
function Alert(props) {
return <MuiAlert elevation={6} variant="filled" {...props} />;
}
export default function Login() {
const [name, setName] = useState('')
const [password, setPassword] = useState('')
const [open, setOpen] = useState(false);
const [alert, setAlert] = useState("Wrong credentials!");
const history = useHistory();
const classes = useStyles();
async function csrf() {
axios({
method: 'GET',
url: '/api/csrf',
headers: {
Accept: "application/json",
"Content-Type": "application/json",
},
credentials: "include",
mode: 'cors'
})
.then(function(res) {
localStorage.setItem('csrfToken', res.data.csrfToken)
})
}
useEffect(() => {
csrf();
}, [])
const passwordEnter = e => {
if (e.code == "Enter") {
login()
}
};
const nameEnter = e => {
if (e.code == "Enter") {
document.getElementsByName('password')[0].focus()
}
};
async function login() {
axios({
method: 'POST',
url: '/api/login',
headers: {
'X-CSRF-Token': localStorage.getItem('csrfToken')
},
data: {
name: name,
password: password
},
credentials: "include",
mode: 'cors'
})
.then(function(res) {
if(res.data.result == "Login successful"){
switch(res.data.job){
case "doctor":
history.replace("/dashboard1")
break;
case "pharmacist":
history.replace("/dashboard2")
}
}
else if (res.data.result == "Invalid credentials"){
setAlert("Wrong credentials!")
setOpen(true);
}
})
.catch(function(err){
if (err) {
setAlert("Invalid CSRF Token!")
setOpen(true);
}
})
}
const handleClose = (event, reason) => {
if (reason === 'clickaway') {
return;
}
setOpen(false);
};
return(
<Fragment>
<Container className={classes.container} component="main" maxWidth="xs">
<div className={classes.paper}>
<Typography variant="h3" className="title">Login</Typography>
<div className={classes.form}>
<TextField color="secondary" margin="normal" fullWidth variant="filled" label="Name" onKeyPress={(e) => nameEnter(e)} autoFocus={true} autoComplete="off" spellCheck="false" type="text" name="name" id="name" value={name} onChange={(e) => setName(e.target.value)}/>
<TextField color="secondary" margin="normal" fullWidth variant="filled" label="Password" onKeyPress={(e) => passwordEnter(e)} type="password" name="password" id="password" value={password} onChange={(e) => setPassword(e.target.value)}/>
</div>
<Button variant="contained" className={classes.button} onClick={login}>Login</Button>
</div>
</Container>
<Snackbar open={open} autoHideDuration={6000}
onClose={handleClose}
>
<Alert onClose={handleClose} severity="error">
{alert}
</Alert>
</Snackbar>
</Fragment>
)
}
App.js:
import { useState, useEffect } from 'react'
import { AnimatePresence, motion } from 'framer-motion'
import Login from './components/Login'
import Dashboard1 from './components/Dashboard2'
import Dashboard2 from './components/Dashboard1'
import Admin from './components/Admin'
import axios from 'axios'
import { BrowserRouter as Router, Switch, Route, MemoryRouter, Redirect, useHistory, Link, useLocation } from "react-router-dom";
import {Helmet} from "react-helmet";
import "./App.css";
import { MuiThemeProvider, createMuiTheme, responsiveFontSizes } from '@material-ui/core/styles';
import { colors } from '@material-ui/core';
import CssBaseline from '@material-ui/core/CssBaseline';
import 'fontsource-roboto';
export default function App(){
const history = useHistory();
let theme = createMuiTheme({
palette: {
type: 'dark',
secondary: {
main: colors.blue[200]
}
},
});
theme = responsiveFontSizes(theme)
const location = useLocation()
const pageTransition = {
initial: {
opacity: 0,
y: "100vh",
},
in: {
opacity: 1,
y: 0,
scale : 1
},
out: {
opacity: 0,
y: "-100vh",
scale: 1,
}
}
const transitionOptions = {
type: "spring",
ease: "anticipate",
duration: 0.6,
delay: 0.5
}
return (
<MuiThemeProvider theme={theme} style={{position: 'relative'}}>
<CssBaseline />
<AnimatePresence>
<Switch location={location} key={location.pathname}>
<Route exact path="/">
<motion.div
initial="false"
animate="in"
exit="out"
variants={pageTransition}
transition={transitionOptions}
style={{position: 'absolute', left: '50%'}}
>
<Login />
</motion.div>
</Route>
<Route path="/dashboard1">
<motion.div
initial="initial"
animate="in"
exit="out"
variants={pageTransition}
transition={transitionOptions}
style={{position: 'absolute'}}
>
<Dashboard1 />
</motion.div>
</Route>
<Route path="/dashboard2">
<motion.div
initial="initial"
animate="in"
exit="out"
variants={pageTransition}
transition={transitionOptions}
style={{position: 'absolute'}}
>
<Dashboard2 />
</motion.div>
</Route>
<Route path="/admin">
<motion.div initial="initial" animate="in" exit="out" variants={pageTransition}>
<Admin />
</motion.div>
</Route>
</Switch>
</AnimatePresence>
</MuiThemeProvider>
);
}
从'react'导入{useState,useffect}
从“帧运动”导入{AnimatePresence,motion}
从“./components/Login”导入登录名
从“./components/Dashboard2”导入仪表板1
从“./components/Dashboard1”导入仪表板2
从“./components/Admin”导入管理员
从“axios”导入axios
从“react Router dom”导入{BrowserRouter as Router,Switch,Route,MemoryRouter,Redirect,useHistory,Link,useLocation};
从“react Helmet”导入{Helmet};
导入“/App.css”;
从'@material ui/core/styles'导入{MuiThemeProvider,createMuiTheme,responsiveFontSizes};
从'@material ui/core'导入{colors};
从“@material ui/core/CssBaseline”导入CssBaseline;
导入“fontsource roboto”;
导出默认函数App(){
const history=useHistory();
让theme=CreateMuiteme({
调色板:{
类型:'暗',
中学:{
主要:颜色。蓝色[200]
}
},
});
主题=响应字体大小(主题)
const location=useLocation()
常量页面转换={
首字母:{
不透明度:0,
y:“100vh”,
},
在:{
不透明度:1,
y:0,
比例:1
},
输出:{
不透明度:0,
y:“-100vh”,
比例:1,
}
}
常量转换选项={
类型:“弹簧”,
轻松:“预期”,
持续时间:0.6,
延迟:0.5
}
返回(
刷新后:
按照JSS按需创建样式的方式,按钮组件的核心样式将覆盖您使用makeStyles
定义的样式,因为组件是在自定义样式之后导入的。如果您在开发工具中检查元素,您可以看到.MuiButton root
样式将覆盖这些样式er生成的类.makeStyles-button-2
——两个单一类CSS选择器具有相同的特性,因此最后一个类最终获胜
要解决此问题,您只需重新排序导入,以便在按钮和其他MUI组件之后导入useStyles
您的项目是否具有全局样式/主题配置?唯一的主题是您在代码中看到的主题MuiThemeProvider@Pitter忘记贴标签了
import { useState, useEffect } from 'react'
import { AnimatePresence, motion } from 'framer-motion'
import Login from './components/Login'
import Dashboard1 from './components/Dashboard2'
import Dashboard2 from './components/Dashboard1'
import Admin from './components/Admin'
import axios from 'axios'
import { BrowserRouter as Router, Switch, Route, MemoryRouter, Redirect, useHistory, Link, useLocation } from "react-router-dom";
import {Helmet} from "react-helmet";
import "./App.css";
import { MuiThemeProvider, createMuiTheme, responsiveFontSizes } from '@material-ui/core/styles';
import { colors } from '@material-ui/core';
import CssBaseline from '@material-ui/core/CssBaseline';
import 'fontsource-roboto';
export default function App(){
const history = useHistory();
let theme = createMuiTheme({
palette: {
type: 'dark',
secondary: {
main: colors.blue[200]
}
},
});
theme = responsiveFontSizes(theme)
const location = useLocation()
const pageTransition = {
initial: {
opacity: 0,
y: "100vh",
},
in: {
opacity: 1,
y: 0,
scale : 1
},
out: {
opacity: 0,
y: "-100vh",
scale: 1,
}
}
const transitionOptions = {
type: "spring",
ease: "anticipate",
duration: 0.6,
delay: 0.5
}
return (
<MuiThemeProvider theme={theme} style={{position: 'relative'}}>
<CssBaseline />
<AnimatePresence>
<Switch location={location} key={location.pathname}>
<Route exact path="/">
<motion.div
initial="false"
animate="in"
exit="out"
variants={pageTransition}
transition={transitionOptions}
style={{position: 'absolute', left: '50%'}}
>
<Login />
</motion.div>
</Route>
<Route path="/dashboard1">
<motion.div
initial="initial"
animate="in"
exit="out"
variants={pageTransition}
transition={transitionOptions}
style={{position: 'absolute'}}
>
<Dashboard1 />
</motion.div>
</Route>
<Route path="/dashboard2">
<motion.div
initial="initial"
animate="in"
exit="out"
variants={pageTransition}
transition={transitionOptions}
style={{position: 'absolute'}}
>
<Dashboard2 />
</motion.div>
</Route>
<Route path="/admin">
<motion.div initial="initial" animate="in" exit="out" variants={pageTransition}>
<Admin />
</motion.div>
</Route>
</Switch>
</AnimatePresence>
</MuiThemeProvider>
);
}