материальные стили пользовательского интерфейса внутри компонента react

#reactjs #material-ui

#reactjs #материал-пользовательский интерфейс

Вопрос:

Здесь вы можете увидеть пример использования стилей пользовательского интерфейса material вне компонента react.

 import React from 'react';
import { makeStyles } from '@material-ui/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>;
}
  

Я хочу сделать то же самое, но внутри компонента react:

 class Component extends React.Component {

render() {

const {height} = this.props

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: height,
    padding: '0 30px',
  },
});

const classes = useStyles();

return <Button className={classes.root}>Hook</Button>;
}}
  

Возможно ли это?

Я вижу, что здесь должна быть правильная версия react с хуками, но я не нашел ни одного примера, где люди использовали бы его внутри класса makeStyles

Ответ №1:

makeStyles создает перехват React; из-за этого вы не можете взаимодействовать с компонентами класса.

Хуки используются для полной замены классов, поскольку React больше движется в направлении чисто функциональных компонентов ради оптимизации компилятора и других низкоуровневых вещей (хотя есть и внешние преимущества для разработчиков, такие как меньшая детализация, лучшее использование и более интуитивное понимание функциональной природы JS). В случае makeStyles вы получаете дополнительные преимущества, такие как возможность использовать любую переменную, включая те, которые традиционно были бы реквизитами и состоянием, и автоматически ваш JSS пересчитывает только на основе наблюдаемых параметров, которые вы предоставили vs, при любых изменениях реквизита.

Вместо этого, как указал @Richard Ansell, вам следует использовать withStyles , если вам некомфортно вне классов. Это компонент высокого порядка. Однако я бы предположил, что в более новых кодовых базах вы изучаете хуки и адаптируетесь к ним, поскольку хуки могут представлять почти всю функциональность как из HOC, так и из компонентов, когда вы станете лучше в них разбираться.

Ниже приведен пример из material-ui документации ( RTFM here ):

 import React from 'react';
import PropTypes from 'prop-types';
import { withStyles } from '@material-ui/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);
  

Ответ №2:

Из того, что я могу собрать, вы можете просто использовать withStyles API, который может обернуть ваш компонент и внедрить ваш стиль непосредственно в экспортируемый компонент. Смотрите следующую страницу, на которой это объясняется более подробно: withStyles

Пример:

 import React from 'react';
import PropTypes from 'prop-types';
import { withStyles } from '@material-ui/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',
        padding: '0 30px',
    },
};

function HigherOrderComponent(props) {
    const { classes, customHeight } = props;
    return <Button className={classes.root} style={{minHeight: customHeight, maxHeight: customHeight}}>Higher-order 
    component</Button>;
}

HigherOrderComponent.propTypes = {
    classes: PropTypes.object.isRequired,
    customHeight: PropTypes.object.isRequired
};

export default withStyles(styles)(HigherOrderComponent);
  

Комментарии:

1. Можете ли вы прислать мне пример? Я не вижу, что withStyles может решить мою проблему

2. Пожалуйста, посмотрите приведенный выше пример, в котором показано, как экспортировать компонент React с примененным стилем, надеюсь, это поможет.

3. Проверьте, пожалуйста, мой пример, я хочу динамически изменять высоту в css (const {height} = this.props), это должно быть внутри класса.

4. Я обновил свой ответ, чтобы показать, как вы можете динамически передавать высоту. Это, по-видимому, является некоторым ограничением пользовательского интерфейса React Material, однако вышесказанное должно позволить вам установить размер кнопки по своему усмотрению в качестве требуемого реквизита.

5. Если использовать параметр style , то мне даже не нужны withStyles , я могу объявить все реквизиты внутри style={style.root} , я не думаю, что это правильно использовать style .