При использовании функций в качестве компонентов у вас есть возможность использовать хук useMediaQuery
из material-ui. Однако это нигде не показывает, как использовать этот хук внутри класса.
Поэтому я провел небольшое исследование и выяснил, что вы можете использовать его в классе, выполнив следующее:
import React from 'react';
import useMediaQuery from '@material-ui/core/useMediaQuery';
const withMediaQuery = (...args) => Component => props => {
const mediaQuery = useMediaQuery(...args);
return <Component mediaQuery={mediaQuery} {...props} />;
};
export default withMediaQuery;
Однако при добавлении его в класс следующим образом:
export default withStyles(styles)(withMediaQuery(Main));
Это дает мне такую ошибку:
index.js:1 Warning: Functions are not valid as a React child. This may happen if you return a Component instead of <Component /> from render. Or maybe you meant to call this function rather than return it.
Мне действительно нужно использовать медиа-запрос, потому что некоторые переменные зависят от них. Это метод рендеринга класса, для которого я хотел бы использовать медиазапрос.
render() {
const { classes, children } = this.props;
const isDesktop = useMediaQuery(theme => theme.breakpoints.up('lg'), {
defaultMatches: true,
});
const shouldOpenSidebar = isDesktop ? true : this.state.openSidebar;
return (
<div
className={cc({
[classes.root]: true,
[classes.shiftContent]: isDesktop,
})}>
<Topbar
onSidebarOpen={this.handleSidebarOpen}
/>
<Sidebar
onClose={this.handleSidebarClose}
open={shouldOpenSidebar}
variant={isDesktop ? 'persistent' : 'temporary'}
/>
<main className={classes.content}>
{children}
</main>
</div>
);
}
Я уже пытался обернуть компонент, но тогда я не смог бы использовать переменные