Material-ui: рд╕реНрдЯрд╛рдЗрд▓реНрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдкреНрд░реЙрдкреНрд╕ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдХреЛ рдирд┐рд░реНрдорд┐рдд 17 рдЕрдХреНрддреВре░ 2017  ┬╖  54рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: mui-org/material-ui

рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдореИрдВ рдПрдХ рдШрдЯрдХ рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдк рдФрд░ рдереАрдо рдСрдмреНрдЬреЗрдХреНрдЯ рджреЛрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рд╡рд┐рд╖рдп рд╡рд╕реНрддреБ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

const styles = theme => ({
  title: {
    ...theme.typography.headline,
    textAlign: 'center',
    padding: '8px 16px',
    margin: 0,
    color: theme.palette.common.white,
    backgroundColor: theme.palette.primary[500],
  },

withStyles(styles, { withTheme: true })(Component);
....

рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╕реНрдЯрд╛рдЗрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдкреНрд░реЙрдкреНрд╕ рддрдХ рдкрд╣реБрдВрдЪ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдореИрдВрдиреЗ рдЙрджрд╛рд╣рд░рдг рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред

{
 ....
display: (props) => props.display
}

рдореИрдВ рдЕрдВрдд рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП react-jss рдФрд░ withTheme рдХреЛ рдорд┐рд▓рд╛рддрд╛ рд╣реВрдВ

import { withTheme } from 'material-ui/styles';
import injectSheet from 'react-jss';

function withStyles(styles, Component) {
  return withTheme()(injectSheet(styles)(Component));
}

export default withStyles;

....

const styles = {
  title: {
    display: (props) => props.display,
    textAlign: 'center',
    padding: '8px 16px',
    margin: 0,
    color: ({ theme }) => theme.palette.common.white,
    backgroundColor: ({ theme }) => theme.palette.primary[500],
  },

рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╛рдж рдЖрддреА рд╣реИ

  title: {
    ...theme.typography.headline,

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

@oliviertassinari рдпрд╣ рд╕реБрдирдХрд░ рдмрд╣реБрдд рд╕реБрдХреВрди рдорд┐рд▓рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ! рдЗрд╕рд╕реЗ рдШрдЯрдХреЛрдВ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВ рдПрдХ рд╡рд┐рдиреНрдпрд╛рд╕ рдпреЛрдЧреНрдп рдЖрдХрд╛рд░ (рдпрд╛рдиреА рдкрд┐рдХреНрд╕реЗрд▓ рдореЗрдВ рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдВрдЪрд╛рдИ) рдХреЗ рд╕рд╛рде рдПрдХ рдЪреЗрдХрдмреЙрдХреНрд╕ рд░рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ:

<CustomCheckbox size={16} />

рдЕрдЧрд░ рд╣рдо props рдореЗрдВ styles , рддреЛ рдпрд╣ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛрдЧрд╛:

const styles = {
  root: {
    width: props => props.size,
    height: props => props.size
  }
}

рдпрд╛

const styles = props => ({
  root: {
    width: props.size,
    height: props.size
  }
})

рдФрд░ рдлрд┐рд░:

const CustomCheckbox = ({size, classes}) => <Checkbox className={classes.root} />;

export default withStyles(styles)(CustomCheckbox);

рдЕрднреА рдХреЗ рд▓рд┐рдП, рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рд╕реЗ рдХреИрд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? рдпрд╛ рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЛрдИ рдЕрдиреБрдорд╛рди рд╣реИ рдХрд┐ рдЖрдк рд╕реНрдЯрд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдкреНрд░реЙрдкреНрд╕ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ?

рд╕рднреА 54 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рд╣рдореЗрдВ рд╕рдВрднрд╡рддрдГ рдЙрд╕реА рд╕рдВрджрд░реНрдн рдХреБрдВрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд╛рдордЧреНрд░реА-рдпреВрдЖрдИ рдмрдирд╛рдХрд░ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреИрд╕реЗ рдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдЬреЗрдПрд╕рдПрд╕: https://github.com/cssinjs/theming/blob/master/src/channel.js#L1ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, #7633 . рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ

рдореЗрд░реЗ рдкрд╛рд╕ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдЬреЗрдПрд╕рдПрд╕ рдЗрдВрдЯрд░рдСрдкрд░реЗрдмрд┐рд▓рд┐рдЯреА рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рдкреАрдЖрд░ рддреИрдпрд╛рд░ рд╣реИред рдореИрдВ рдЗрд╕реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдореЗрдВ рдЬреЛрдбрд╝ рджреВрдВрдЧрд╛ред рд╕реАрд╕реА @ рдХреЛрдл

@oliviertassinari рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рд╢реИрд▓рд┐рдпреЛрдВ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рднреАрддрд░ рд╕рд╣рд╛рд░рд╛ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЕрдм рд╕рдВрднрд╡ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП? рдпрд╣ рдореБрдЭреЗ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреИрд╕реЗ...

@pelotom рдирд╣реАрдВ, рд╕реНрдЯрд╛рдЗрд▓ рдХреЗ рдкрд╛рд╕ рдЧреБрдгреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рд▓реЛрдЧ рдЗрд╕ рдлреАрдЪрд░ рдХреА рдХрд┐рддрдиреА рдорд╛рдВрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдмрдЧ рдлрд┐рдХреНрд╕ рдХреЗ рдмрд╛рдж, рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗ рд╕рдХрддрд╛ рд╣реВрдВред рдЖрдк injectSheet HOC рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрдИ рдореБрджреНрджреЛрдВ рдХреЗ рд▓рд┐рдП рджреНрд╡рд╛рд░ рдЦреЛрд▓рддрд╛ рд╣реИ: рдореЗрдореЛрд░реА рд▓реАрдХ, рд╣реЙрдЯ рд░реАрд▓реЛрдбрд┐рдВрдЧ рдЯреВрдЯрд╛ рд╣реБрдЖ, рдХреЛрдИ classes рд╕рдВрд░рдЪрдирд╛ рдирд╣реАрдВ, рдХреЛрдИ рдЖрдВрддрд░рд┐рдХ рд░реЗрдлрд░реА рдПрдХреНрд╕реЗрд╕ рдирд╣реАрдВ, рдЯреВрдЯреА рд╣реБрдИ рдереАрдо рдиреЗрд╕реНрдЯрд┐рдВрдЧ рд╣реИрдВрдбрд▓рд┐рдВрдЧред рдХрдо рд╕реЗ рдХрдо, рдпрд╣ рдХреБрдЫ рдРрд╕реЗ рдореБрджреНрджреЗ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдореИрдВ рдЕрддреАрдд рдореЗрдВ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдЗрд╕рдиреЗ рдореЗрд░реЗ рдкреБрдирд░реНрд▓реЗрдЦрди рдХреЛ рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрджрдо рджрд░ рдХрджрдо рдЙрди рдореБрджреНрджреЛрдВ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

@oliviertassinari рдпрд╣ рд╕реБрдирдХрд░ рдмрд╣реБрдд рд╕реБрдХреВрди рдорд┐рд▓рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ! рдЗрд╕рд╕реЗ рдШрдЯрдХреЛрдВ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВ рдПрдХ рд╡рд┐рдиреНрдпрд╛рд╕ рдпреЛрдЧреНрдп рдЖрдХрд╛рд░ (рдпрд╛рдиреА рдкрд┐рдХреНрд╕реЗрд▓ рдореЗрдВ рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдВрдЪрд╛рдИ) рдХреЗ рд╕рд╛рде рдПрдХ рдЪреЗрдХрдмреЙрдХреНрд╕ рд░рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ:

<CustomCheckbox size={16} />

рдЕрдЧрд░ рд╣рдо props рдореЗрдВ styles , рддреЛ рдпрд╣ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛрдЧрд╛:

const styles = {
  root: {
    width: props => props.size,
    height: props => props.size
  }
}

рдпрд╛

const styles = props => ({
  root: {
    width: props.size,
    height: props.size
  }
})

рдФрд░ рдлрд┐рд░:

const CustomCheckbox = ({size, classes}) => <Checkbox className={classes.root} />;

export default withStyles(styles)(CustomCheckbox);

рдЕрднреА рдХреЗ рд▓рд┐рдП, рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рд╕реЗ рдХреИрд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? рдпрд╛ рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЛрдИ рдЕрдиреБрдорд╛рди рд╣реИ рдХрд┐ рдЖрдк рд╕реНрдЯрд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдкреНрд░реЙрдкреНрд╕ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ?

@nmchaves рдЖрдк рдХреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрдирд▓рд╛рдЗрди-рд╢реИрд▓реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЧрд┐рд░рдиреЗ рд▓рдЧрддреЗ рд╣реИрдВ, рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рдХреБрдЫ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рд╢реНрди
https://github.com/callemall/material-ui/blob/75a30061e76eae93c711ec202a2c7e4238a4f19a/docs/src/pages/style/SvgIcons.js#L38 -L44

рдзрдиреНрдпрд╡рд╛рдж @oliviertassinari ! рдореИрдВ рдЙрдореНрдореАрдж рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдореИрдВ рдЗрд╕реЗ withStyles рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреВрд░рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЗрдирд▓рд╛рдЗрди-рд╢реИрд▓рд┐рдпрд╛рдВ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░реЗрдВрдЧреАред рдФрд░ рдпрд╣ рддрдереНрдп рдХрд┐ рдЖрдк рдпрд╣рд╛рдВ + рдбреЙрдХреНрд╕ рдореЗрдВ рдЗрд╕рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдореБрдЭреЗ рдЗрд╕ рдирд┐рд░реНрдгрдп рд╕реЗ рдмрд╣реБрдд рдЖрд╢реНрд╡рд╕реНрдд рдорд╣рд╕реВрд╕ рдХрд░рд╛рддрд╛ рд╣реИред рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдзрдиреНрдпрд╡рд╛рдж!

рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рд▓рд┐рдП рд╢реИрд▓реА рдореЗрдВ рдПрдХ рдкреНрд░реЛрдк (рдЫрд╡рд┐ рд╕реНрд░реЛрдд) рдкрд╛рд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдЫрд╡рд┐

рдореИрдВ withStyle

const withStylesProps = styles =>
  Component =>
    props => {
      console.log(props);
      const Comp = withStyles(styles(props))(Component);
      // return <div>lol</div>;
      return <Comp {...props} />;
    };

const styles = props => ({
  foo: {
    height: `${props.y || 50}px`,
  }
});

export default withStylesProps(styles)(
  props => (
    <div className={props.classes.foo} style={{ ...props.style, background: 'yellow' }}>
      <h1>Hello!</h1>
    </div>
  )
);

рдбреЗрдореЛ: https://codesandbox.io/s/k2y01rj3w7

(рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ ^ рдмрд┐рдирд╛ рдХрд┐рд╕реА ThemeProvider рдФрд░ JssProvider рд╕реЗрдЯ рдЕрдк https://codesandbox.io/s/q6v7krx6 рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЖрд╣ рдпрд╣ рдЗрд╕реЗ рдкреНрд░рд╛рд░рдВрдн рдХрд░рддрд╛ рд╣реИ)

@caub рдпрд╣ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЗрд╕ рдкреИрдЯрд░реНрди рд╕реЗ рд╕рд╛рд╡рдзрд╛рди рд░рд╣рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдЗрдВрдЬреЗрдХреНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ CSS рдШрдЯрдХ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдмрдврд╝реЗрдЧрд╛ред рдпрд╣ #7633 рдХрд╛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕ рд╡рд┐рд╖рдп рдореЗрдВ рдЦреБрджрд╛рдИ рдирд╣реАрдВ рдХреА рд╣реИред рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ @kof рд╕рдВрд╕реНрдХрд░рдг рдХреБрдЫ рдкреНрд░рджрд░реНрд╢рди рдЕрдиреБрдХреВрд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

@caub рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

@oliviertassinari рдпрд╣ https://github.com/cssinjs/react-jss/blob/master/readme.md#dynamic -values тАЛтАЛin React-jss рд╣реИ, рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рд╛рдордЧреНрд░реА-рдпреВрдЖрдИ рдореЗрдВ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрд╛? рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдЖрдкрдХреА рдмрд╛рдд рдХреЛ рд╕рдордЭрддрд╛ рд╣реВрдВ рдЬрд╣рд╛рдВ рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЗрдирд▓рд╛рдЗрди style рдкреНрд░реЛрдк рдЧрддрд┐рд╢реАрд▓ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХрджрдо рд╕рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рд╕рднреА рд╢реИрд▓рд┐рдпреЛрдВ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рд╣реЛрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИред https://github.com/airbnb/react-with-styles рднреА рд╣реИ рдЬреЛ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рдЧрддрд┐рд╢реАрд▓ рд╢реИрд▓рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП className рдФрд░ style рдХреЛ рд╕рдВрднрд╛рд▓реЗрдЧрд╛

рдореБрдЭреЗ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝ рд░рд╣рд╛ рд╣реИ рдХреНрдпрд╛ рдХреЛрдИ рдореЗрд░реА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ?
'рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛' рд╕реЗ рдЖрдпрд╛рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛;
'рдкреНрд░реЛрдк-рдкреНрд░рдХрд╛рд░' рд╕реЗ рдкреНрд░реЛрдкрдЯрд╛рдЗрдк рдЖрдпрд╛рдд рдХрд░реЗрдВ;
'material-ui/styles' рд╕реЗ {withStyles} рдЖрдпрд╛рдд рдХрд░реЗрдВ;
'рд╕рд╛рдордЧреНрд░реА-рдпреВрдЖрдИ/рджрд░рд╛рдЬ' рд╕реЗ рдЖрдпрд╛рдд рджрд░рд╛рдЬ;
'Material-ui/AppBar' рд╕реЗ AppBar рдЖрдпрд╛рдд рдХрд░реЗрдВ;
'рд╕рд╛рдордЧреНрд░реА-рдпреВрдЖрдИ/рдЯреВрд▓рдмрд╛рд░' рд╕реЗ рдЯреВрд▓рдмрд╛рд░ рдЖрдпрд╛рдд рдХрд░реЗрдВ;
'рд╕рд╛рдордЧреНрд░реА-рдпреВрдЖрдИ/рд╕реВрдЪреА' рд╕реЗ рдЖрдпрд╛рдд рд╕реВрдЪреА;
'рд╕рд╛рдордЧреНрд░реА-рдпреВрдЖрдИ/рдЯрд╛рдЗрдкреЛрдЧреНрд░рд╛рдлреА' рд╕реЗ рдЯрд╛рдЗрдкреЛрдЧреНрд░рд╛рдлреА рдЖрдпрд╛рдд рдХрд░реЗрдВ;
'Material-ui/IconButton' рд╕реЗ IconButton рдЖрдпрд╛рдд рдХрд░реЗрдВ;
'рд╕рд╛рдордЧреНрд░реА-рдпреВрдЖрдИ/рд╣рд┐рдбрди' рд╕реЗ рдЫреБрдкрд╛ рдЖрдпрд╛рдд рдХрд░реЗрдВ;
'рдордЯреЗрд░рд┐рдпрд▓-рдпреВрдЖрдИ/рдбрд┐рд╡рд╛рдЗрдбрд░' рд╕реЗ рдЗрдВрдкреЛрд░реНрдЯ рдбрд┐рд╡рд╛рдЗрдбрд░;
'Material-ui-icons/Menu' рд╕реЗ MenuIcon рдЖрдпрд╛рдд рдХрд░реЗрдВ;
рдЖрдпрд╛рдд {mailFolderListItems, OtherMailFolderListItems} './tileData' рд╕реЗ;

рдХрд╛рд╕реНрдЯ рдбреНрд░рд╛рд╡рд░рд╡рд┐рдбреНрде = реирекреж;

рдХреЙрдиреНрд╕реНрдЯ рд╕реНрдЯрд╛рдЗрд▓ = рдереАрдо => ({
рдЬрдбрд╝: {
рдЪреМрдбрд╝рд╛рдИ: '100%',
рдКрдВрдЪрд╛рдИ: 430,
рдорд╛рд░реНрдЬрд┐рдирдЯреЙрдк: рдереАрдо.рд╕реНрдкреЗрд╕рд┐рдВрдЧ.рдпреВрдирд┐рдЯ * 3,
рдЬреЗрдбрдЗрдВрдбреЗрдХреНрд╕: 1,
рдУрд╡рд░ рдлрд▓реЛ рд╣рд┐рдбреЗрди',
},
рдРрдкрдлреНрд░реЗрдо: {
рд╕реНрдерд┐рддрд┐: 'рд░рд┐рд╢реНрддреЗрджрд╛рд░',
рдкреНрд░рджрд░реНрд╢рди: 'рдлреНрд▓реЗрдХреНрд╕',
рдЪреМрдбрд╝рд╛рдИ: '100%',
рдКрдВрдЪрд╛рдИ: '100%',
},
рдРрдкрдмрд╛рд░: {
рд╕реНрдерд┐рддрд┐: 'рдкреВрд░реНрдг',
рдорд╛рд░реНрдЬрд┐рди рд▓реЗрдлреНрдЯ: рдбреНрд░рд╛рд╡рд░рд╡рд┐рдбреНрде,
[рдереАрдо.рдмреНрд░реЗрдХрдкреНрд╡рд╛рдЗрдВрдЯ.рдЕрдк ('рдПрдордбреА')]: {
рдЪреМрдбрд╝рд╛рдИ: calc(100% - ${drawerWidth}px) ,
},
},
navIconHide: {
[рдереАрдо.рдмреНрд░реЗрдХрдкреНрд╡рд╛рдЗрдВрдЯ.рдЕрдк ('рдПрдордбреА')]: {
рдХреБрдЫ рднреА рдбрд┐рд╕реНрдкреНрд▓реЗ рдордд рдХрд░реЛ',
},
},
рдбреНрд░рд╛рд╡рд░рд╣реИрдбрд░: рдереАрдо.рдорд┐рдХреНрд╕рд┐рдиреНрд╕.рдЯреВрд▓рдмрд╛рд░,
рджрд░рд╛рдЬ рдкреЗрдкрд░: {
рдЪреМрдбрд╝рд╛рдИ: реирелреж,
[рдереАрдо.рдмреНрд░реЗрдХрдкреНрд╡рд╛рдЗрдВрдЯ.рдЕрдк ('рдПрдордбреА')]: {
рдЪреМрдбрд╝рд╛рдИ: рджрд░рд╛рдЬрд╡рд┐рдбреНрде,
рд╕реНрдерд┐рддрд┐: 'рд░рд┐рд╢реНрддреЗрджрд╛рд░',
рдКрдВрдЪрд╛рдИ: '100%',
},
},
рд╡рд┐рд╖рдп: {
рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдХрд▓рд░: рдереАрдо.рдкреИрд▓реЗрдЯ.рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб.рдбрд┐рдлреЙрд▓реНрдЯ,
рдЪреМрдбрд╝рд╛рдИ: '100%',
рдкреИрдбрд┐рдВрдЧ: рдереАрдо.рд╕реНрдкреЗрд╕рд┐рдВрдЧ.рдпреВрдирд┐рдЯ * 3,
рдКрдВрдЪрд╛рдИ: 'рдХреИрд▓реНрдХ(100% - 56px)',
рдорд╛рд░реНрдЬрд┐рди рдЯреЙрдк: 56,
[рдереАрдо.рдмреНрд░реЗрдХрдкреНрд╡рд╛рдЗрдВрдЯ.рдЕрдк ('рдПрд╕рдПрдо')]: {
рдКрдВрдЪрд╛рдИ: 'рдХреИрд▓реНрдХ(100% - 64px)',
рдорд╛рд░реНрдЬрд┐рди рдЯреЙрдк: 64,
},
},
});

рдирд┐рд░реНрдпрд╛рдд рд╡рд░реНрдЧ ResponsiveDrawer React.Component рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИ {
рд░рд╛рдЬреНрдп = {
рдореЛрдмрд╛рдЗрд▓ рдУрдкрди: рдЭреВрдард╛,
};

рд╣реИрдВрдбрд▓рдбреНрд░рд╛рд╡рд░ рдЯреЙрдЧрд▓ = () => {
this.setState({mobileOpen: !this.state.mobileOpen});
};

рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛() {
const {рдХрдХреНрд╖рд╛рдПрдВ, рд╡рд┐рд╖рдп} = this.props;

const drawer = (
  <div>
    <div className={classes.drawerHeader} />
    <Divider />
    <List>{mailFolderListItems}</List>
    <Divider />
    <List>{otherMailFolderListItems}</List>
  </div>
);

return (
  <div className={classes.root}>
    <div className={classes.appFrame}>
      <AppBar className={classes.appBar}>
        <Toolbar>
          <IconButton
            color="inherit"
            aria-label="open drawer"
            onClick={this.handleDrawerToggle}
            className={classes.navIconHide}
          >
            <MenuIcon />
          </IconButton>
          <Typography variant="title" color="inherit" noWrap>
            Responsive drawer
          </Typography>
        </Toolbar>
      </AppBar>
      <Hidden mdUp>
        <Drawer
          variant="temporary"
          anchor={theme.direction === 'rtl' ? 'right' : 'left'}
          open={this.state.mobileOpen}
          classes={{
            paper: classes.drawerPaper,
          }}
          onClose={this.handleDrawerToggle}
          ModalProps={{
            keepMounted: true, // Better open performance on mobile.
          }}
        >
          {drawer}
        </Drawer>
      </Hidden>
      <Hidden smDown implementation="css">
        <Drawer
          variant="permanent"
          open
          classes={{
            paper: classes.drawerPaper,
          }}
        >
          {drawer}
        </Drawer>
      </Hidden>
      <main className={classes.content}>
        <Typography noWrap>{'You think water moves fast? You should see ice.'}</Typography>
      </main>
    </div>
  </div>
);

}
}

ResponsiveDrawer.propTypes = {
рдХрдХреНрд╖рд╛рдПрдВ: PropTypes.object.isRequired,
рд╡рд┐рд╖рдп: PropTypes.object.isRequired,
};

рд╕реНрдЯрд╛рдЗрд▓реНрд╕ (рд╢реИрд▓рд┐рдпреЛрдВ) (рдЙрддреНрддрд░рджрд╛рдпреА рдбреНрд░рд╛рд╡рд░) рдХреЗ рд╕рд╛рде рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд┐рд░реНрдпрд╛рдд рдХрд░реЗрдВ;
`

screen shot 2018-02-13 at 3 27 41 am

рдЗрдВрдЬреЗрдХреНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ CSS рдШрдЯрдХ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдмрдврд╝реЗрдЧрд╛ред

@oliviertassinari рдЗрдВрдЬреЗрдХреНрд╢рди рд╕реАрдПрд╕рдПрд╕ + рдмрдврд╝реЗрдЧрд╛ - рдЙрд╕реА рддрд░рд╣ рдПрдЪрдЯреАрдПрдордПрд▓ рдЗрдирд▓рд╛рдЗрди рд╢реИрд▓рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдмрдврд╝реЗрдЧрд╛ред рд╕реНрдерд┐рд░ рд╢реИрд▓рд┐рдпреЛрдВ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╢реАрдЯ рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕рднреА рдШрдЯрдХ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рдЖрдпрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕реНрдЯреЗрдЯрд▓реЗрд╕ рдШрдЯрдХ рдХреЗ рд╕рд╛рде рдпрд╣ withStyle рдХреЛ render рд╕реЗ render рдлрд┐рд░ рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗрдЧрд╛, рд╣рдо рдкреВрд░реНрдг рд╢реБрджреНрдз рдШрдЯрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдЪ рд╕рдХрддреЗ рд╣реИрдВред

import React from 'react';
import {
  withStyles,
  Grid,
  CircularProgress
} from 'material-ui';

const PreloadComponent = props => {
  const { classes,size } = props;
  return (
    <Grid className={classes.container} container justify={'center'} alignItems={'center'}>
      <CircularProgress size={size}/>
    </Grid>
  )
};

const StyleWithThemeProps = (props) => {
  return withStyles(theme => ({
    container: {
      paddingTop: props.size*2 || 50,
      paddingBottom: props.size*2 || 50,
    }
  }),{withTheme: true})(PreloadComponent)
};

const Preload = props => {
  const { size } = props;
  const WithStylesPreloadComponent = StyleWithThemeProps(props);
  return (
    <WithStylesPreloadComponent {...props}/>
  )
};

Preload.defaultProps = {
  size: 20
};

export default Preload;

рд╣рдо рдЕрджреНрдпрддрди рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рд╢реБрджреНрдз рдШрдЯрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

const PreloadComponent = props => {
  const { classes,size } = props;
  return (
    <Grid className={classes.container} container justify={'center'} alignItems={'center'}>
      <CircularProgress size={size}/>
    </Grid>
  )
};

const StyleWithThemeProps = (props) => {
  return withStyles(theme => ({
    container: {
      paddingTop: props.size*2 || 50,
      paddingBottom: props.size*2 || 50,
    }
  }),{withTheme: true})(PreloadComponent)
};

class PreloadFull extends React.PureComponent {

  constructor(props,context) {
    super(props);
  }

  componentWillMount() {
    this.StyledPreloadFull = StyleWithThemeProps(this.props);
  }

  componentWillUpdate(nextProps) {
    this.StyledPreloadFull = StyleWithThemeProps(nextProps);
  }

  render() {
    const { StyledPreloadFull,props } = this;
    return (
      <StyledPreloadFull {...props}/>
    );
  }
}

PreloadFull.defaultProps = {
  size: 20
};

export default PreloadFull;

@ up209d рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдлреА рджрд░реНрджрдирд╛рдХ рд╣реИ, рдореИрдВ withStyles рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛, рдЕрдзрд┐рдХ рд╕реАрдзреЗ https://github.com/cssinjs/react-jss рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рдореВрд▓реНрдпреЛрдВ рдореЗрдВ рдкреНрд░реЛрдк рдкрд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ

@ рд╢реНрд░реАрдХрд╛рдВрдд рдЪреЗрдмреНрд░реЛрд▓реВ рдХреНрдпрд╛ рдЖрдк рдЕрдкрдиреЗ рд╕рдВрджреЗрд╢ рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдореБрджреНрджреЗ рдкрд░ рд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд┐рд╖рдп рдореЗрдВ рдирд╣реАрдВ рд╣реИ?

рдмрд╕ рдЬрд┐рдЬреНрдЮрд╛рд╕реБ рдХрд┐ рдЗрд╕ рдкрд░ рдХреНрдпрд╛ рд╕реНрдерд┐рддрд┐ рд╣реИ? рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрдврд╝ рд░рд╣рд╛ рд╣реВрдВ, рдЬреЗрдПрд╕рдПрд╕ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝, рд╕рд╛рдордЧреНрд░реА-рдпреВрдЖрдИ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝, рдФрд░ рдЕрднреА рддрдХ рдореБрдИ + рдЬреЗрдПрд╕рдПрд╕ + рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдвреВрдВрдв рд░рд╣рд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдЗрдирд▓рд╛рдЗрди рд╢реИрд▓рд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдХреБрдЫ рдЗрдирд▓рд╛рдЗрди рд╢реИрд▓рд┐рдпреЛрдВ рдХреЛ рд░рдЦрдирд╛ рдХрднреА-рдХрднреА рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдРрд╕реА рдХрдИ рд╢реИрд▓рд┐рдпрд╛рдБ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрд╡рд╕реНрдерд╛рдПрдБ рд╣реИрдВ, рд╕рднреА рдереАрдо рдФрд░ рдкреНрд░реЙрдкреНрд╕ рдкрд░ рдПрдХ рд╕рд╛рде рдирд┐рд░реНрднрд░ рд╣реИрдВ: рдирд┐рд░рд╛рд╢:

@chazsolo рдЕрд░реЗ injectSheet рд╕реЗ react-jss рдмрдЬрд╛рдп withStyles рд╕реЗ mui ред рдЗрд╕ рддрд░рд╣ рдЖрдкрдХреЗ рдкрд╛рд╕ props рдФрд░ theme рджреЛрдиреЛрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

import injectSheet from 'react-jss';

const styles = theme => ({
  container: {
     color: props => theme.palette[props.color || 'primary'].main
  }
});

...

export default injectSheet(styles)(AnyComponent);
import { JssProvider, jss, createGenerateClassName } from 'react-jss/lib';
import { MuiThemeProvider } from 'material-ui';

const generateClassName = createGenerateClassName();

...

<JssProvider jss={jss} generateClassName={generateClassName}>
  <MuiThemeProvider theme={props.theme} sheetsManager={new Map()}>
    <App/>
  </MuiThemeProvider>
</JssProvider>

@chazsolo рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ https://github.com/cssinjs/jss/issues/682

рдзрдиреНрдпрд╡рд╛рдж @kof рдФрд░ @up209d - рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдХрд┐рдпрд╛ рдФрд░ up209d рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдПрдХ рд╢реЙрдЯ рджрд┐рдпрд╛ред

@up209d
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░реЗрдЧрд╛ - рдореИрдВрдиреЗ рдЬреЛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рд╣реИ рдЙрд╕реЗ рдореИрдВрдиреЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рдореИрдВ styles рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЕрдВрджрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рднреАрддрд░ рдкреНрд░реЛрдк рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдорд┐рд▓рддреА рд░рд╣рддреА рд╣реИрдВред рдореИрдВ рд╕рд┐рд░реНрдл рдкреНрд░рдХрд╛рд░ рдпрд╛рдж рдХрд░ рд░рд╣рд╛ рд╣реВрдБ? рдореИрдВ рдкреНрд░реЛрдк рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ WithStyles рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореЗрд░реЗ рдкрд╛рд╕ рдкреНрд░реЛрдк рдореЗрдВ classes рдСрдмреНрдЬреЗрдХреНрдЯ рддрдХ рдкрд╣реБрдВрдЪ рд╣реИ (рдЕрдм рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ https://github.com/mui- рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рд╕рдорд╕реНрдпрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ- org/material-ui/issues/8726#issuecomment-337482040)

TS2344: Type '(theme: ITheme) => { arc: { stroke: string; strokeWidth: (props: any) => string | number; }; arcM...' does not satisfy the constraint 'string | Record<string, CSSProperties> | StyleRulesCallback<string>'.
  Type '(theme: ITheme) => { arc: { stroke: string; strokeWidth: (props: any) => string | number; }; arcM...' is not assignable to type 'StyleRulesCallback<string>'.
    Type '{ arc: { stroke: string; strokeWidth: (props: any) => string | number; }; arcMovement: { strokeDa...' is not assignable to type 'Record<string, CSSProperties>'.
      Property 'arc' is incompatible with index signature.
        Type '{ stroke: string; strokeWidth: (props: any) => string | number; }' is not assignable to type 'CSSProperties'.
          Types of property 'strokeWidth' are incompatible.
            Type '(props: any) => string | number' is not assignable to type 'string | number | undefined'.
              Type '(props: any) => string | number' is not assignable to type 'number'.

рдореЗрд░реА рдереАрдо рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ:

import { ITheme } from '...';

export default (theme: ITheme) => ({
  arc: {
    // ...
    strokeWidth: (props: any): number | string => {
      // this logs the correct data I'm expecting
      console.log(props.data[0].properties.name)
      return 1.5
    }
  },
  arcMovement: {
    // ...
  },
})

рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рдЬрдм рдореИрдВ рдЕрдкрдиреЗ рдШрдЯрдХ рдХреЗ рднреАрддрд░ classes рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, arc рдФрд░ arcMovement рдорд╛рдиреНрдп рдЧреБрдг рд╣реИрдВ:

// from Chrome console
{
  arc: "Arcs-arc-0-2-1 Arcs-arc-0-2-3",
  arcMovement: "Arcs-arcMovement-0-2-2"
}

рдЕрджреНрдпрддрди

рдореИрдВ рдпрд╣ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛, рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдореБрдЭреЗ WithStyles , withStyles рд╕рднреА рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛ рдкрдбрд╝рд╛, рдФрд░ рдореИрдВ classes рд░рдЪрдирд╛ рдФрд░ рд╡рд┐рд╖рдп рдЦреЛ рджреЗрддрд╛ рд╣реВрдВ рдШреЛрдВрд╕рд▓рд╛ рдмрдирд╛рдирд╛ рдореИрдВ рдЗрд╕реЗ рдЕрднреА рдЖрд░рд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реВрдВ рдФрд░ рдХреЗрд╡рд▓ рдзрд╛рдЧреЛрдВ рдкрд░ рдирдЬрд░ рд░рдЦрддрд╛ рд╣реВрдВред рдкреВрд░реА рд╕рд╣рд╛рдпрддрд╛рдХреЗ рд▓рд┐рдП рд╢реБрдХреНрд░рд┐рдпрд╛!

@chazsolo рдЕрд░реЗ style рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ props рдХреЗ рдЕрдВрджрд░ classes рддрдХ рдкрд╣реБрдВрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрд╕рдВрднрд╡ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ classes рдХреЗрд╡рд▓ jss рдмрд╛рдж style рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЙрдкрд▓рдмреНрдз рд╣реИ, рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдкрд╣рд▓реЗ рдЖрдк classes рддрдХ рдХреИрд╕реЗ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ classes рднреА рдЯреНрд░рд┐рдЧрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @caub рдиреЗ рдкрд╣рд▓реЗ рд╣реА рдПрдХ рд╕рдорд╛рдзрд╛рди рдкреНрд░рджрд╛рди рдХрд░ рджрд┐рдпрд╛ рд╣реИред рдмрд╕ рдереЛрдбрд╝рд╛ рдЯреНрд╡рд┐рд╕реНрдЯ рдХреЗ рд╕рд╛рде рдШреЛрд▓ рдХреЛ рджреЛрдмрд╛рд░рд╛ рдкреЛрд╕реНрдЯ рдХрд░реЗрдВред рдХрд┐рд╕реА рдЕрддрд┐рд░рд┐рдХреНрдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рд░реИрдкрд░ рдмрдирд╛рдПрдВ withStylesProps ред

import { withStyles } from 'material-ui/styles';

const styles = ( theme, props ) => ({
    exampleStyle: {
           color: 'red'  // <-- or try theme.palette.primary[600]
    }
})

const withStylesProps = ( styles ) =>
  Component =>
    props => {
      const Comp = withStyles(theme => styles(theme, props))(Component);
      return <Comp {...props} />;
    };

const YourComponent = ({  classes }) => 
      <Typography type="display4" className={classes.exampleStyle}>{type}</Typography>

export default withStylesProps(styles)(YourComponent);

рдпрджрд┐ рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдХ рдХреЗ рд▓рд┐рдП withStylesProps рдмрдирд╛рдирд╛ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ рдЕрд▓рдЧ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдФрд░ рдЬрд╣рд╛рдВ рдЪрд╛рд╣реЗрдВ рдЖрдпрд╛рдд рдХрд░реЗрдВред

@iamthuypham рдЯрд┐рдк рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЬрдм рдореИрдВ рдЕрдкрдиреЗ рдШрдЯрдХ рдХреЛ withStylesProps рд╕рд╛рде рд▓рдкреЗрдЯрддрд╛ рд╣реВрдВ, рддреЛ рд╕рдВрдХреНрд░рдордг рдШрдЯрдХ <Collapse рдХреА рдПрдиреАрдореЗрд╢рди рдореИрдВ рд▓рд┐рдкрдЯреЗ рдШрдЯрдХ рдХреЗ рдЕрдВрджрд░ рдХрд╣реАрдВ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд╛рдо рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИред

@ jdolinski1 рдХреНрдпрд╛ рдЖрдк рдЕрдкрдирд╛ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдХреЙрдкреА/рдкреЗрд╕реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

@iamthuypham рдЖрдкрдХреЗ рд╕рдорд╛рдзрд╛рди рдореЗрдВ рд╣рд░ рдмрд╛рд░ рдПрдХ рдШрдЯрдХ <style> рдЯреИрдЧ рдмрдирд╛рдиреЗ рдХреА рдХрдореА рд╣реИред рд╕рд╛рде рд╣реА, рдЖрдк рдбрд┐рдлрд╝реЙрд▓реНрдЯрдкреНрд░реЙрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╕рд╛рд╡рдзрд╛рди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ HOC'd рдШрдЯрдХ рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рди рдХрд┐ рдореВрд▓ рдШрдЯрдХред

image

рдпрд╣ рд╕рдм react-jss рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИ, рдХреНрдпрд╛ рдЗрд╕реЗ рдореВрд▓ рд░реВрдк рд╕реЗ material-ui рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

рд╕рд╛рде рд╣реА, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @ jdolinski1 рдХреА рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдХреЛрдб children рдХрд╛ рдкреНрд░рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд▓рдкреЗрдЯрд╛ рд╣реБрдЖ рдШрдЯрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

@iamthuypham рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдЕрддреАрдд рдореЗрдВ рдРрд╕рд╛ рдХрд░рддрд╛ рдерд╛, рдФрд░ рдЬрдм рддрдХ рдРрдк рд╡рд┐рдХрд╛рд╕ рдмрд╣реБрдд рдЬрд▓реНрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддрдм рддрдХ рдЖрдк рдЦрд░рд╛рдм рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рдЕрдиреБрднрд╡ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдирдП jss style рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде component рдХрд╛ рдПрдХ рдирдпрд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдирд╛ рдХреЛрдбрд┐рдВрдЧ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреА рджреГрд╖реНрдЯрд┐ рд╕реЗ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ style рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ, рдмрд╛рд░-рдмрд╛рд░, рд╣рд░ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рд╕рдордп рдкреНрд░рддрд┐ props рдкрд░рд┐рд╡рд░реНрддрдиред injectSheet рд╕реЗ react-jss рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╡рд┐рдХрд▓реНрдк рд╣реИред рдпрджрд┐ рдЖрдк injectSheet рджреЗрдЦрддреЗ рд╣реИрдВ рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рдЖрдкрдХреА style рд╡рд╕реНрддреБ рдХреЛ 2 рдЯреБрдХрдбрд╝реЛрдВ ( static рдФрд░ dynamic ) рдореЗрдВ рддреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреЗрд╡рд▓ dynamic рдЬрдм props рдмрджрд▓рддреЗ рд╣реИрдВ рддреЛ рдлрд┐рд░ рд╕реЗ рд░реЗрдВрдбрд░ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред

рдЗрдВрдЬреЗрдХреНрдЯрд╢реАрдЯ рдХреЗ рд╕рд╛рде рдЬреЗрдПрд╕рдПрд╕-рдиреЗрд╕реНрдЯреЗрдб рдЬреИрд╕реЗ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ?

рдЗрдВрдЬреЗрдХреНрд╢рдирд╢реАрдЯ рдХреЗ рд╕рд╛рде рдореБрдЭреЗ '&: рд╣реЛрд╡рд░' рдХрдерди рдХрд╛рдо рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИред
рд╕реНрдЯрд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдореИрдВ рд╕рд╣рд╛рд░рд╛ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪ рд╕рдХрддрд╛ ...

@koutsenko рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:

import React from "react";
import { makeStyles } from "@material-ui/styles";
import Button from "@material-ui/core/Button";

const useStyles = makeStyles({
  root: {
    background: props => props.color,
    "&:hover": {
      background: props => props.hover
    },
    border: 0,
    borderRadius: 3,
    color: "white",
    height: 48,
    padding: "0 30px"
  }
});

export default function Hook() {
  const classes = useStyles({
    color: "red",
    hover: "blue"
  });
  return <Button className={classes.root}>Hook</Button>;
}

https://codesandbox.io/s/pw32vw2j3m

рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдпрд╣ рдорджрдж рдХрд░реЗрдЧрд╛ред


рд╡рд╛рд╣, рдпрд╣ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд╣реИ рдХрд┐ рд╣рдордиреЗ ~1 рд╕рд╛рд▓ ЁЯШН рдореЗрдВ рдЬреЛ рдкреНрд░рдЧрддрд┐ рдХреА рд╣реИред

рдЕрдм рдЖрдк рдЗрд╕реЗ рдХреИрд╕реЗ рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВ?

@stunaz рдЕрдЪреНрдЫрд╛ рд╕рд╡рд╛рд▓ рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ред рдореИрдВрдиреЗ рдЗрд╕ рдкрд░ рдЧреМрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред @ eps1lon рдиреЗ рдореЙрдбреНрдпреВрд▓ рдХреА рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреА рд╣реИред рдЖрдк рдЗрд╕реЗ рд╢реБрд░реБрдЖрддреА рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
https://github.com/mui-org/material-ui/blob/f4281a77d15b0d6eec9d33cdc358cfb89844996d/packages/material-ui-styles/src/index.d.ts#L72

@koutsenko рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:

рдзрдиреНрдпрд╡рд╛рдж @oliviertassinari , " react@next " рдХреЗ рд╕рд╛рде рдпрд╣ рдЕрдм рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

@koutsenko рдпрджрд┐ рдЖрдк jss-nested рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХреЗ, рддреЛ рдпрд╣ рдЖрдкрдХреЗ рдХреЛрдбрд┐рдВрдЧ рдореЗрдВ рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕рдорд╕реНрдпрд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдЪреВрдВрдХрд┐ jss-nested рдХреЛ jss-default-preset , рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕рд┐рд░реНрдл рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

https://stackblitz.com/edit/react-py6w2v

@oliviertassinari

рдХреНрдпрд╛ рдЖрдк рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдЪрдпрдирдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдк рдХреЗ рд╕рд╛рде рд╕рдВрдкреВрд░реНрдг рд╕реНрдЯрд╛рдЗрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рднреА рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдЖрдк рд╕рд╢рд░реНрдд рд░реВрдк рд╕реЗ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдХрд╣рд╛рдВ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣

withStyles({
    root: {
        '& > path': (props) => {
            if(props.color)
                return {
                    fill: props.color
                };
           return {};
        }
    }
})

рддрд╛рдХрд┐, рдпрджрд┐ рдкреНрд░реЛрдк рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ рдкрд┐рдЫрд▓реЗ рднрд░рдг рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдмрдЬрд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдореБрдЭреЗ рдЗрд╕реЗ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реИ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдРрд╕реЗ рдЕрдиреНрдп рдирд┐рдпрдо рд╣реИрдВ рдЬреЛ рдЖрдо рддреМрд░ рдкрд░ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдХреЗрд╡рд▓ рдЗрд╕ рдирдИ рднрд░рдг рд╕рдВрдкрддреНрддрд┐ рдХреЛ рд╕реЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдпрджрд┐ color рдкреНрд░реЛрдк рд╕реЗрдЯ рд╣реИред

рдзрдиреНрдпрд╡рд╛рдж!

@Guardiannw рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЖрдкрдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ @kof рд╣рдорд╛рд░реЗ рдкреНрд░рдХрд╛рд╢ рдХреЛ рдмрдврд╝рд╛ рд╕рдХреЗ рдХреНрдпреЛрдВ ред рдЖрдк рдирд┐рдореНрди рдореЗрдВ рд╕реЗ рдХреЛрдИ рдПрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

// ЁЯПЖ
const useStyles = makeStyles({
  root: {
    "& > span": {
      backgroundColor: props => props.color || null,
    }
  }
});

// or 

const useStyles = makeStyles({
  root: props => ({
    "& > span": {
      backgroundColor: props.color || null
    }
  })
});

@oliviertassinari рдореБрдЭреЗ withStyles рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХрд╛ рджреВрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рдХрдард┐рдирд╛рдИ рд╣реЛ рд░рд╣реА рд╣реИред рдХреНрдпрд╛ рдпрд╣ рдХреЗрд╡рд▓ makeStyles рдФрд░ рд╣реБрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?

@Guardiannw рдпрд╣ @material-ui/styles рдХрд┐рд╕реА рднреА рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред

@oliviertassinari рдПрдХ рдорд╛рдиреНрдп рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ, fn рдорд╛рди v10 рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЧрдП рдереЗ, рдЗрд╕рд▓рд┐рдП рдпрд╛ рддреЛ v9 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдпрд╛ рдореБрдЭреЗ рдХреЛрдбреИрдВрдбрдмреЙрдХреНрд╕ рдкреНрд░рдЬрдирди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

рдареАрдХ рд╣реИ, рдореИрдВрдиреЗ рдпрд╣реА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИред рдлрд┐рд░ рд╕реЗ рдХреЛрд╢рд┐рд╢ рдХрд░рдиреА рдкрдбрд╝ рд╕рдХрддреА рд╣реИред

@oliviertassinari рдореЗрд░реЗ рдкрд╛рд╕ @ рдордЯреЗрд░рд┐рдпрд╛-рдпреВрдЖрдИ/рд╢реИрд▓рд┐рдпреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдкреНрд░рд╢реНрди рд╣реИ, рдХреНрдпрд╛ рдпрд╣ рдЙрдкрд▓рдмреНрдз рд╣реИ рдФрд░ рдЙрддреНрдкрд╛рджрди рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП?, рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрдерд┐рд░ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ " 3.9.1", рдЙрджрд╛рд╣рд░рдг https://github.com/mui-org/material-ui/issues/8726#issuecomment -452047345 рдЬреЛ рдЖрдк рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╣реИрдВ рдЙрд╕рдореЗрдВ рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдФрд░ рдЙрдкрдпреЛрдЧреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рдореБрдЭреЗ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрди рдореБрджреНрджреЛрдВ рдореЗрдВ, рдореИрдВрдиреЗ рдПрдХ рдЕрд▓рдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдХрдИ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рджреЗрдЦреАрдВ рдФрд░ рдореБрдЭреЗ @caub рдХрд╛ рд╕рдорд╛рдзрд╛рди https://github.com/mui-org/material-ui/issues/8726#issuecomment -363546636 рдкрд╕рдВрдж рд╣реИ , рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгреА рд╕рдорд╛рдзрд╛рди рдЕрдЪреНрдЫрд╛ рд╣реИред

@contrerasjf0 @material-ui/styles рдХреЗрд╡рд▓ рдЕрд▓реНрдлрд╛ рд░рд┐рд▓реАрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИред рд╣рдо рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдореЗрдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреИрдХреЗрдЬреЛрдВ рдХреА рддрд░рд╣ рдЕрд▓реНрдлрд╛ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХрд╛ рдЗрд▓рд╛рдЬ рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдХрднреА рднреА рдЕрд▓реНрдлрд╛ рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВред рдпрджрд┐ рдЖрдк рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рд░рд┐рд▓реАрдЬ рдХреЗ рдмреАрдЪ рдмрдЧ рдФрд░ рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдпрд╛рдиреА рдЖрдкрдХреЛ рдордВрдерди рдЕрд▓реНрдлрд╛ рд╕рдВрд╕реНрдХрд░рдг рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд▓реЛрдЧ рдЙрди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╛ рддреЛ рд╢реМрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ рд╢рд╛рдЦрд╛ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЙрддреНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рддреИрдирд╛рдд рдирд╣реАрдВ рд╣реИ рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдЙрддреНрдкрд╛рджрди рд╢рд╛рдЦрд╛ рдХреА рддрд░рд╣ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ рдЙрди рд╕рднреА рд▓реЛрдЧреЛрдВ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рдЙрди рдЕрд▓реНрдлрд╛ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╣рдореЗрдВ рдЙрдирдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрддреЗ рд╣реИрдВред

@ up209d рд╣рд╛рдБ, рдЖрдкрдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рде
styles = { name: { cssprop: props => {} } рд╕рдВрдХреЗрддрди, рдирд╣реАрдВ
styles = props => ({ name: { cssprop: {} })

рд╕рд╛рде рд╣реА, JssProvider рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред

@koutsenko

// at value level:
styles = { name: { cssprop: props => value }
styles = theme => ({ name: { cssprop: props => value })

// at class name level
styles = { name: props => ({ cssprop: value })  }
styles = theme => ({ name: props => ({ cssprop: value })  })

рдЖрдк рд╢реАрд░реНрд╖ рд╕реНрддрд░ рдкрд░ props рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ theme рдмрд╛рдж рджреВрд╕рд░реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рднреА

рдореБрдЭреЗ рдПрдХ рд░рд╛рд╕реНрддрд╛ рдорд┐рд▓рд╛

// MyComponent.tsx
import React, { PureComponent } from 'react';
import { myComponentWithStyles } from './myComponentWithStyles';

export interface MyComponentProps {
  copy: string;
  size?: number;
}

export class Twemoji extends PureComponent<myComponentWithStyles> {
  public render() {
    const { copy, classes } = this.props;

    return (
      <div className={classes.message}>
        {copy}
        <img src="https://via.placeholder.com/150" />
    </div>
    );
  }
}

// myComponentWithStyles.tsx
import React from 'react';
import { withStyles, WithStyles, Theme } from '@material-ui/core';
import { MyComponent, MyComponentProps } from './my-component';

const styles = (props: Theme & MyComponentProps) => ({
  message: {
    fontSize: props.typography.caption.fontSize,
    'box-sizing': 'content-box',
    '& img': {
      width: `${props.size || 24}px`,
      height: `${props.size || 24}px`,
      padding: '0 4px',
      verticalAlign: 'middle',
    },
  },
});

export type myComponentWithStyles = WithStyles<any>;

export const Component = (props: MyComponentProps) => {
  const StyledComponent = withStyles((theme: Theme) => styles({ ...props, ...theme }))(
    MyComponent
  );

  return <StyledComponent {...props} />;
};



md5-d0e1b51e375682cf2aad9c4d66b6c73a



<Component size={12} />

@andreasonny83 рдЗрд╕ рдкреИрдЯрд░реНрди рд╕реЗ рдмрдЪреЗрдВред рд╣рдо v4 рдореЗрдВ рдПрдХ рджреЗрд╢реА рдПрдкреАрдЖрдИ рдкреНрд░рджрд╛рди рдХрд░ рд░рд╣реЗ рд╣реИрдВред

@oliviertassinari рдЕрдкрдбреЗрдЯ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдХреНрдпрд╛ рд╡рд╣ рдкреИрдЯрд░реНрди рдкрд╣рд▓реЗ рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реИ? рдХреЛрдИ рджрд╕реНрддрд╛рд╡реЗрдЬ рдЙрдкрд▓рдмреНрдз рд╣реИ?

рдПрдХ рдЖрдЦрд┐рд░реА рд╕рд╡рд╛рд▓ @oliviertassinari ред рдХреНрдпрд╛ рдореИрдВ makeStyles рдХреЛ withStyles рд╕рдВрдпреЛрдЬрди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?

рдореБрдЭреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬ рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИред рдореИрдВ рдЬреЛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдпрд╣ рд╣реИ:

const useStyles = makeStyles({
  message: {
    boxSizing: 'content-box'
  }
});

export const ComponentWithStyles = withStyles(useStyles())(MyComponent);

@andreasonny83

  • makeStyles рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд╣реБрдХ рдХреЗ рд▓рд┐рдП рд╣реИ
  • withStyles HOC рд╕рдорд╛рди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ

рдПрдХ рдпрд╛ рджреВрд╕рд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдмрд╕ makeStyles рд╣рдЯрд╛ рджреЗрдВ:

const styles = { message: {boxSizing: 'content-box', background: props => props.bg} };
export const ComponentWithStyles = withStyles(styles)(MyComponent);

Gday рд▓реЛрдЧреЛрдВ рдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдЖрдИрдбреА рдЙрдкрд░реЛрдХреНрдд рдЪрд░реНрдЪрд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдореЗрд░реЗ рд╡рд░реНрддрдорд╛рди рд╕рдорд╛рдзрд╛рди рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рддреА рд╣реИ, рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдХреА рдорджрдж рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдХреЛрдИ рдореЗрд░реЗ рд╡рд░реНрддрдорд╛рди рд╕рдорд╛рдзрд╛рди рдкрд░ рдмреЗрд╣рддрд░ рд╕рд▓рд╛рд╣ рджреЗ рд╕рдХрддрд╛ рд╣реИред рдореЗрд░реЗ рд╕рд╛рдЗрдирдЗрди рдкреЗрдЬ рдЖрдИрдбреА рдХреЗ рд▓рд┐рдП рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдкреГрд╖реНрдарднреВрдорд┐ рдЫрд╡рд┐ рдХреА рддрд░рд╣ рд▓реЗрдХрд┐рди рдЖрдИрдбреА рдЕрднреА рднреА рд╕рд╛рдордЧреНрд░реА рдпреВрдЖрдИ рдПрдкреАрдЖрдИ рдХреА рд╢рдХреНрддрд┐ рдХреЛ рдмрдирд╛рдП рд░рдЦрдирд╛ рдкрд╕рдВрдж рдХрд░рддреА рд╣реИред рдСрдердкреЗрдЬ рд╕рд┐рд░реНрдл рдкреИрд░реЗрдВрдЯ рдкреНрд░реЗрдЬреЗрдВрдЯреЗрд╢рди рд▓реЗрдпрд░ рд╣реИ рдЬреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдСрде рдШрдЯрдХреЛрдВ (рд╕рд╛рдЗрдирдЗрди, рд▓реЙрдХ, рднреВрд▓-рдкрд╛рд╕рд╡рд░реНрдб, рдкрд╛рд╕рд╡рд░реНрдб-рд░реАрд╕реЗрдЯ, рдЖрджрд┐) рдХреЛ рдмрдЪреНрдЪреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИред рдкреБрд╖реНрдЯрд┐ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкреГрд╖реНрда AuthPageContainer рдкреНрд░реЛрдк рдХреЗ рднреАрддрд░ рдПрдХ рдирдП рдкреГрд╖реНрдарднреВрдорд┐ рд▓реЛрдб рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдПрдХ рдЕрдЪреНрдЫреЗ рджреГрдврд╝рддрд╛ рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдкреНрд░реЙрдкреНрд╕ рдХреЛ рддрд╛рдЬрд╝рд╛ рдХрд░рддрд╛ рд╣реИ

// AuthPage.styles.tsx

import { Container } from "@material-ui/core";
import { ContainerProps } from "@material-ui/core/Container";
import { withStyles } from "@material-ui/core/styles";
import React from "react";

interface IAuthContainerProps extends ContainerProps {
  background: string;
}

export const AuthContainer = withStyles({
  root: props => ({
    alignItems: "center",
    backgroundImage: `url(${props.background})`,
    backgroundPosition: "50% 50%",
    backgroundRepeat: "no-repeat",
    backgroundSize: "cover",
    display: "flex",
    height: "100vh",
    justifyContent: "center",
    margin: 0,
    padding: 0,
    width: "100%"
  })
})((props: IAuthContainerProps) => <Container maxWidth={false} {...props} />);

// AuthPage.tsx

import React from "react";
import forest from "../../assets/backgrounds/forest.jpg";
import sky from "../../assets/backgrounds/sky.jpg";
import uluru from "../../assets/backgrounds/uluru.jpg";
import { AuthContainer } from "./AuthPage.styles";

const AuthPage = ({ children }) => {
  const generateBackground = () => {
    const backgrounds = [forest, sky, uluru];
    const index = Math.floor(Math.random() * backgrounds.length);
    return backgrounds[index];
  };

  return (
    <AuthContainer background={generateBackground()}>{children}</AuthContainer>
  );
};

export default AuthPage;

рдмрд╕ рдХреБрдЫ рдРрд╕рд╛ рдХрд░реЗрдВ:

// styles.js
export default theme => ({
    root: props => ({
        // some styles
    }),
    ...
});

//container.js
export default withStyles(styles)(MyComponent);

рд░рд╛рдЬреНрдп рднреА рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?

@ рд▓рдХреНрдХреА1984
рдЖрдк рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

// Component.js
<Button
    className={`
        ${classes.button} 
        ${this.state.isEnable
            ? classes.enable
            : classes.disable}
    `}
/>

рдпрд╛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп clsx https://www.npmjs.com/package/clsx рдХрд╛ рдЙрдкрдпреЛрдЧ

@caub рдЖрдкрдХрд╛ рд╕рдорд╛рдзрд╛рди рдЬреЗрдПрд╕рдПрд╕ рдЬреЗрдирд░реЗрдЯреЗрдб рдХреНрд▓рд╛рд╕рдирд╛рдо рдСрд░реНрдбрд░ рдХреЛ рдмрд░реНрдмрд╛рдж рдХрд░ рджреЗрддрд╛ рд╣реИред
рдЬреИрд╕реЗ рдпрд╣рд╛рдБ рд▓рд┐рдЦрд╛ рд╣реИ: https://github.com/mui-org/material-ui/issues/8726#issuecomment -363546636
рдореИрдВрдиреЗ рдЖрдкрдХреЗ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХрд╛ рдПрдЪрдУрд╕реА рдШрдЯрдХ (рд╕реНрдЯрд╛рдЗрд▓реНрд╕рдкреНрд░реЙрдкреНрд╕ рдХреЗ рд╕рд╛рде) рд╕рдорд╛рдзрд╛рди рдЗрд╕рдХреЗ рд╕рд╛рде рд╕реНрдЯрд╛рдЗрд▓ рдХреЗ рдХреЙрд▓ рдореЗрдВ рджреЗрд░реА рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд▓рдкреЗрдЯрд╛ рд╣реБрдЖ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдХреНрд▓рд╛рд╕рдирд╛рдо рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░рдирд╛ рд╕реАрдПрд╕рдПрд╕ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдЬреИрд╕реЗ: https://codesandbox.io/s/hocs-8uhw1?file=/index.js

рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб #0000000 рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд░рдВрдЧ: рдиреАрд▓рд╛

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

reflog picture reflog  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

iamzhouyi picture iamzhouyi  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

FranBran picture FranBran  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

mattmiddlesworth picture mattmiddlesworth  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

mb-copart picture mb-copart  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ