#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 .