#javascript #reactjs #material-ui
Вопрос:
Я только начал использовать интерфейс Material UI версии 5. Первоначально для использования стилей моей пользовательской темы я бы использовал стили создания, но, похоже, это не работает в версии 5. Мои темы находятся в отдельном компоненте, и для их импорта я использовал {createTheme}
вместо старых {createMuiTheme}
. Моя тема импортирована в родительский компонент, как обычно, и настроена как <ThemeProvider theme{theme}></ThemeProvider>
.
Теперь, на моем другом компоненте, я снова пытался использовать стили использования, но это не сработало, потому что оно не используется в версии 5. Мне трудно понять, как его преобразовать, чтобы его можно было использовать в версии 5. Вот часть незаконченного кода, над которым я работал:
const useStyles = makeStyles((theme) => ({
logo: {
height: "8em",
marginLeft: "0.2em",
},
tabContainer: {
marginLeft: "auto",
},
tab: {
...theme.typography.tab,
minWidth: 10,
marginRight: "50px",
opacity: 1,
"amp;hover": {
color: theme.palette.common.purple,
textDecoration:"none",
},
},
}));
export default function Navigation(props) {
const classes = useStyles();
const [value, setValue] = useState(0);
const handleChange = (e, value) => {
setValue(value);
};
const refreshPage = () => {
window.location.reload();
};
useEffect(() => {
switch (window.location.pathname) {
case "/":
if (value !== 0) {
setValue(0);
}
break;
default:
break;
}
}, [value]);
return (
<React.Fragment>
<ElevationScroll>
<AppBar
position="relative"
style={{
borderBottom: "2px solid black",
}}
>
<Toolbar disableGutters>
<img src={logo} alt="nasa logo" className={classes.logo}/>
<Typography variant="h1" style={{ textAlign: "center" }}>
Nasa<br></br>Photos
</Typography>
<Tabs
value={value}
onChange={handleChange}
className={classes.tabContainer}
indicatorColor="primary"
>
<Tab
className={classes.tab}
component={Link}
onClick={refreshPage}
to="/"
label="Home"
/>
</Tabs>
</Toolbar>
</AppBar>
</ElevationScroll>
</React.Fragment>
);
}
Я читал о свойстве xs, а также слышал о функции styled() в документации Material UI, но мне трудно применить ее к написанному мной коду, и я хотел бы подтолкнуть в правильном направлении.
Поэтому, чтобы отредактировать то, что у меня было ранее, я также добавлю свой Theme.js файл тоже. Я думал, что это было сделано правильно, но опять же он не читает ни мою вкладку, ни мою палитру.
import {createTheme} from "@mui/material/styles";
const pink = "#FFC0CB";
const lightblue = "#ADD8E6";
const purple = "#800080";
const black = "#000000";
const theme = createTheme({
palette: {
common: {
pink: pink,
lightblue: lightblue,
purple: purple,
black: black
},
primary: {
main: pink,
mainGradient: "linear-gradient(to left, purple, pink)",
},
secondary: {
main: lightblue,
mainGradient: "linear-gradient(to right, lightblue, pink)"
},
},
typography: {
tab: {
fontFamily:"Orbitron",
textTransform: "none",
fontSize: "2.5rem",
color: black,
},
h1: {
fontFamily: "Orbitron",
fontSize: "2.5em"
},
h2: {
fontFamily: "Orbitron",
fontSize: "2.5em"
},
subtitle1: {
fontFamily: "Orbitron"
},
subtitle2: {
fontFamily: "Orbitron",
fontSize: "1.5rem"
},
buttons: {
fontFamily: "Orbitron",
textTransform: "none"
},
},
});
export default theme
Я импортировал свою тему в свою App.js файл, который является моим файлом верхнего уровня, я включу его сюда на тот случай, если с этим что-то было сделано не так:
import React,{useState} from "react";
import PicOfDay from "./Components/PictureOfDay";
import Navigation from "./Components/Navigation";
import {
Typography,
} from "@mui/material";
import {ThemeProvider} from '@mui/material/styles'
import theme from "../src/ui/Theme";
import {BrowserRouter as Router} from "react-router-dom";
function App(props) {
const [date, setDate] = useState(new Date());
return (
<ThemeProvider theme={theme}>
<Router>
<Navigation date={date} setDate={setDate} />
<Typography
variant="h1"
style={{fontSize: "5rem", textAlign: "center", marginTop:"2rem"}}
>
Astronomy Picture of the Day
</Typography>
{/* <PicOfDay date={date} /> */}
</Router>
</ThemeProvider>
);
}
export default App;
Я просмотрел некоторую документацию, которую вы мне прислали, и я просматривал часть по устранению неполадок, в которой говорилось, что «[Типы] Свойства «палитра», «интервал» не существует для типа» DefaultTheme»», потому что makeStyles экспортируется по-другому, и он не знает о теме. Кажется, есть сниппет для вставки в проект машинописи (который я не запускаю, я использую javascript), и там был раздел для добавления файла ts в мой javascript и размещения рекомендованного фрагмента, который я пробовал, но я что-то упустил, потому что он ничего не сделал, и я не уверен, нужно ли мне что-то добавить в свой javascript. App.js файл для того, чтобы он мог это прочитать?
Ответ №1:
Вы все еще можете использовать makeStyles
utils как то, что вы используете, но в материале v5, если вам нравится это делать, вам нужно установить еще один пакет @mui/styles
и
import { makeStyles } from '@mui/styles';
https://mui.com/guides/migration-v4/#mui-material-styles
Утилита makeStyles JSS больше не экспортируется из @mui/материал/стили. Вместо этого вы можете использовать @mui/стили/стили создания.
Кроме того, вам нужно добавить tab
и purple
createTheme
, если они вам нужны
const theme = createTheme({
typography: {
tab: {
fontSize: 20,
},
},
palette: {
common: {
purple: 'purple',
},
},
})
Комментарии:
1. Я проверил, и у меня уже был установлен @mui/стили. У меня есть стили, импортированные как:
import {makeStyles} from "@mui/styles"
и это все еще не работает. Я замечаю в своем коде vs, когда копаюсь в своем распространении...theme.typography.tab
, иcolor: theme.palette.common.purple
в нем говорится (параметр) тема: Тема по умолчанию, когда раньше в v. 4 говорилось (параметр) тема: Тема2. да, это правда, в v5 тема имеет тип
DefaultTheme
вместо на тему как v4>, так как makeStyles теперь экспортируется из пакета @mui/styles, который не знает о теме в основном пакете. mui.com/guides/migration-v4/… В вашем случае вам нужно добавитьtab
иpurple
вcreateTheme
` const theme = createTheme({ типография: { вкладка: { Размер шрифта: 20, }, }, палитра: { общий: { фиолетовый: ‘фиолетовый’, }, }, }) `3. Я добавил больше в свой первоначальный пост
4.Хорошо, одна важная вещь при выполнении такого рода миграции вам нужно иметь опцию
StyledEngineProvider
с injectFirst в верхней части дерева компонентов mui.com/guides/migration-v4/#style-library5. Вот и все! Когда я использовал<StyledEngineProvider injectFirst>, это исправило мои проблемы с неработающими стилями. Я только что понял, что в одном из моих стилей макияжа была опечатка, я неправильно написал типографию. После осознания этого это сработало. Кроме того, у меня просто возникла странная проблема, когда моя первая вкладка не отображается. Если у меня есть вторая вкладка, отображается 2-я вкладка, но первая по-прежнему не отображается. Я думаю, что, вероятно, лучше задать этот вопрос в качестве другого вопроса. Можете ли вы также включить это в свой ответ
Ответ №2:
На основе документации:
@mui/стили-это устаревшее решение для создания стилей для MUI. Он устарел в версии 5. Это зависит от JSS как решения для укладки, которое больше не используется в @mui/материале.
Вы можете использовать-sx-реквизит или стиль