@material-ui/styles
Вы можете использовать в своем приложении стилевое решение Material-UI вне зависимости от того, используете вы компоненты Material-UI или нет.
Material-UI стремится обеспечить прочную основу для создания динамических интерфейсов. Material-UI стремится обеспечить прочную основу для создания динамических интерфейсов. Вы можете пользоваться им, но вы не обязаны задействовать именно его, поскольку Material-UI также совместим со всеми другими основными решениями для стилизации.
Зачем использовать решение для стилей Material-UI?
В предыдущих версиях Material-UI использовал LESS, а затем пользовательские inline-стили для написания стилей компонент, но эти подходы оказались ограниченными. Подход * CSS-in-JS * преодолевает многие из этих ограничений, и ** открывают множество замечательных возможностей** (вложенность тем, динамические стили, самостоятельная поддержка и т. д.).
Подход к стилизации Material-UI вдохновлен многими другими библиотеками стилей, такими как styled-components и emotion.
- 💅 Вы можете ожидать всех преимуществ, которые имеются в styled-components.
- 🚀 невероятно быстро ,
- 🧩 возможность расширения с помощью плагина API.
- ⚡️ решение использует JSS в своей основе - высокая производительность компилятора JavaScript в CSS, который работает и во время выполнения и на стороне сервера.
- 📦 Менее 15 КБ в архиве ; и не увеличивает размер пакета, если используется вместе с Material-UI.
Инструкция по установке
@material-ui/stylesis re-exported as@material-ui/core/styles- you only need to install it if you wish to use it independently from Material-UI.
Для установки и сохранения в вашем package.json зависимости, запустите:
// with npm
npm install @material-ui/styles
// with yarn
yarn add @material-ui/stylesНачало работы
Мы предоставляем 3 разных API для генерации и применения стилей, но все они имеют одинаковую базовую логику.
Hook API
import * as React from 'react';
import { makeStyles } from '@material-ui/core/styles';
import Button from '@material-ui/core/Button';
const useStyles = makeStyles({
  root: {
    background: 'linear-gradient(45deg, #FE6B8B 30%, #FF8E53 90%)',
    border: 0,
    borderRadius: 3,
    boxShadow: '0 3px 5px 2px rgba(255, 105, 135, .3)',
    color: 'white',
    height: 48,
    padding: '0 30px',
  },
});
export default function Hook() {
  const classes = useStyles();
  return <Button className={classes.root}>Hook</Button>;
}<Button className={classes.root}>Styled with Hook API</Button>Styled components API
Примечание: это относится только к синтаксису вызова. Для определения стилей по-прежнему используется объект JSS. Вы можете изменить это поведение (с некоторыми ограничениями).
import * as React from 'react';
import { styled } from '@material-ui/core/styles';
import Button from '@material-ui/core/Button';
const MyButton = styled(Button)({
  background: 'linear-gradient(45deg, #FE6B8B 30%, #FF8E53 90%)',
  border: 0,
  borderRadius: 3,
  boxShadow: '0 3px 5px 2px rgba(255, 105, 135, .3)',
  color: 'white',
  height: 48,
  padding: '0 30px',
});
export default function StyledComponents() {
  return <MyButton>Styled Components</MyButton>;
}<MyButton>Styled with styled-components API</MyButton>Higher-order component API
import * as React from 'react';
import PropTypes from 'prop-types';
import { withStyles } from '@material-ui/core/styles';
import Button from '@material-ui/core/Button';
const styles = {
  root: {
    background: 'linear-gradient(45deg, #FE6B8B 30%, #FF8E53 90%)',
    border: 0,
    borderRadius: 3,
    boxShadow: '0 3px 5px 2px rgba(255, 105, 135, .3)',
    color: 'white',
    height: 48,
    padding: '0 30px',
  },
};
function HigherOrderComponent(props) {
  const { classes } = props;
  return <Button className={classes.root}>Higher-order component</Button>;
}
HigherOrderComponent.propTypes = {
  classes: PropTypes.object.isRequired,
};
export default withStyles(styles)(HigherOrderComponent);Вложенные селекторы
Вы можете вкладывать селекторы в целевые элементы внутри текущего класса или компонента. В следующем примере используется Hook API, но вы можете аналогично работать и с другими API.
const useStyles = makeStyles({
  root: {
    color: 'red',
    '& p': {
      color: 'green',
      '& span': {
        color: 'blue'
      }
    }
  },
});This is green since it is inside the paragraph and this is blue since it is inside the span
Адаптация на основе props
You can pass a function to makeStyles ("interpolation") in order to adapt the generated value based on the component's props. Функция может быть предоставлена на уровне правила стиля или на уровне свойства CSS:
const useStyles = makeStyles({
  // style rule
  foo: props => ({
    backgroundColor: props.backgroundColor,
  }),
  bar: {
    // CSS property
    color: props => props.color,
  },
});
function MyComponent() {
  // Simulated props for the purpose of the example
  const props = { backgroundColor: 'black', color: 'white' };
  // Pass the props as the first argument of useStyles()
  const classes = useStyles(props);
  return <div className={`${classes.foo} ${classes.bar}`} />
}Этот компонент кнопки имеет свойство цвет, которое изменяет его цвет:
Адаптация хука API
<React.Fragment>
  <MyButton color="red">Red</MyButton>
  <MyButton color="blue">Blue</MyButton>
</React.Fragment><React.Fragment>
  <MyButton color="red">Red</MyButton>
  <MyButton color="blue">Blue</MyButton>
</React.Fragment><React.Fragment>
  <MyButton color="red">Red</MyButton>
  <MyButton color="blue">Blue</MyButton>
</React.Fragment>Стресс-тест
В следующем стресс-тесте вы можете обновить цвет темы и свойство * background-color *:
const useStyles = makeStyles(theme => ({
  root: props => ({
    backgroundColor: props.backgroundColor,
    color: theme.color,
  }),
}));color: #ffffff
backgroundColor: #2196f3
Отличие @material-ui/core/styles от @material-ui/styles
Material-UI's styles are powered by the @material-ui/styles package, (built with JSS). This solution is isolated. Он не имеет темы по умолчанию и может использоваться для стилизации приложений React, которые не используют компоненты Material-UI.
Чтобы уменьшить количество пакетов, устанавливаемых при использовании Material-UI, и упростить импорт, модули @material-ui/styles реэкспортируются из @material-ui/core/styles ,
Чтобы устранить необходимость постоянного подключения темы, к реэкспортированным модулям применяется дефолтная тема Material-UI. Это относится к модулям: makeStyles, styled, withTheme, useTheme и withStyles
For example:
// Re-export with a default theme
import { makeStyles } from '@material-ui/core/styles';
// Original module with no default theme
import { makeStyles } from '@material-ui/styles';