Материал пользовательского интерфейса внутри реактивного компонента - PullRequest
3 голосов
/ 14 марта 2019

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

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>;
}

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

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>;
}}

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

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

Ответы [ 2 ]

0 голосов
/ 09 июля 2019

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

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

Вместо этого, как указал @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);
0 голосов
/ 15 марта 2019

Из того, что я могу собрать, вы можете просто использовать API withStyles, который может обернуть ваш компонент и внедрить ваш стиль непосредственно в экспортируемый компонент. Смотрите следующую страницу, которая объяснит это более подробно: 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);
...