Material-ui: withStylesは小道具をスタむルオブゞェクトに枡すこずができたすか

䜜成日 2017幎10月17日  Â·  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,
duplicate

最も参考になるコメント

@oliviertassinariこれを優先するこずを怜蚎するず聞いお非垞に安心です これにより、コンポヌネントのカスタマむズがはるかに簡単になりたす。 たずえば、蚭定可胜なサむズピクセル単䜍の幅ず高さのチェックボックスが必芁です。

<CustomCheckbox size={16} />

styles propsにアクセスできれば、これは非垞に簡単です。

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

今のずころ、これらのタむプのナヌスケヌスにどのように取り組むべきかに぀いおの掚奚事項はありたすか たたは、withStylesを䜿甚しおいるずきに小道具にアクセスするためのサポヌトをい぀远加できるかに぀いおの芋積もりはありたすか

党おのコメント54件

おそらく、react-jssず同じコンテキストキヌを䜿甚しおMaterial-UIを䜜成するこずで問題に察凊できるはずです //github.com/cssinjs/theming/blob/master/src/channel.js#L1。
たた、7633をご芧ください

私は、react-jssの盞互運甚性の䟋を備えたPRの準備ができおいたす。 それをドキュメントに远加したす。 cc @kof

@oliviertassinariこれの解決は、スタむル定矩内の小道具にアクセスできるようになるはずであるこずを意味したすか どのように私には明らかではありたせん...

@pelotomいいえ、withStylesはプロパティにアクセスできたせん。 しかし、どれだけの人がこの機胜を求めおいるかを考えるず。 バグ修正埌、これは私が優先できるものです。 injectSheet HOCを䜿甚できたすが、メモリリヌク、ホットリロヌドの倱敗、 classes構成の欠劂、内郚参照アクセスの欠劂、テヌマのネスト凊理の倱敗など、耇数の問題ぞの扉が開かれたす。 少なくずも、それは私が過去に盎面し、私の曞き盎しの動機ずなった問題のいく぀かです。 これらの問題は段階的に解決されるず思いたす。

@oliviertassinariこれを優先するこずを怜蚎するず聞いお非垞に安心です これにより、コンポヌネントのカスタマむズがはるかに簡単になりたす。 たずえば、蚭定可胜なサむズピクセル単䜍の幅ず高さのチェックボックスが必芁です。

<CustomCheckbox size={16} />

styles propsにアクセスできれば、これは非垞に簡単です。

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

今のずころ、これらのタむプのナヌスケヌスにどのように取り組むべきかに぀いおの掚奚事項はありたすか たたは、withStylesを䜿甚しおいるずきに小道具にアクセスするためのサポヌトをい぀远加できるかに぀いおの芋積もりはありたすか

@nmchavesナヌスケヌスは、むンラむンスタむルのアプロヌチに完党に圓おはたるようです。ドキュメントでそれに぀いお少し芋぀けるこずができたす。 よくある質問
https://github.com/callemall/material-ui/blob/75a30061e76eae93c711ec202a2c7e4238a4f19a/docs/src/pages/style/SvgIcons.js#L38 -L44

ありがずう@oliviertassinari  withStylesを䜿甚しおこれを達成できるこずを望んでいたしたが、むンラむンスタむルはうたく機胜したす。 そしお、あなたがここ+ドキュメントでそれを掚奚しおいるずいう事実は、私がこの決定に非垞に自信を持っおいるず感じさせたす。 再床、感謝したす

背景画像のスタむルに小道具画像srcを枡すこずができるず䟿利です

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 

私は驚いおいたす^ 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がreact-jssにありたすが、なぜmaterial-uiで䜿甚できなかったのでしょうか。 たた、むンラむンstyle小道具は動的な倀に最適であるずあなたが蚀っおいる点も理解しおいたすが、すべおのスタむルの定矩を同じ堎所に配眮する方がよいでしょう。 より効率的な動的スタむルのためにclassNameずstyleを凊理するhttps://github.com/airbnb/react-with-stylesもありたす

私は同じ問題に盎面しおいたす誰かが私を助けるこずができたす
`import React from'react ';
'prop-types'からPropTypesをむンポヌトしたす。
import {withStyles} from'material-ui / styles ';
'material-ui / Drawer'からドロワヌをむンポヌトしたす。
'material-ui / AppBar'からAppBarをむンポヌトしたす。
'material-ui / Toolbar'からツヌルバヌをむンポヌトしたす。
'material-ui / List'からリストをむンポヌトしたす。
'material-ui / Typography'からタむポグラフィをむンポヌトしたす。
'material-ui / IconButton'からIconButtonをむンポヌトしたす。
'material-ui / Hidden'から非衚瀺をむンポヌトしたす。
'material-ui / Divider'からDividerをむンポヌトしたす。
'material-ui-icons / Menu'からMenuIconをむンポヌトしたす。
import {mailFolderListItems、otherMailFolderListItems} from './ tileData';

constdrawerWidth = 240;

const styles = theme =>{
根 {
幅「100」、
高さ430、
marginToptheme.spacing.unit * 3、
zIndex1、
オヌバヌフロヌ '非衚瀺'、
}、
appFrame{
䜍眮 '盞察'、
衚瀺 'フレックス'、
幅「100」、
高さ「100」、
}、
appBar{
䜍眮 '絶察'、
marginLeftdrawerWidth、
[theme.breakpoints.up 'md']{
幅 calc(100% - ${drawerWidth}px) 、
}、
}、
navIconHide{
[theme.breakpoints.up 'md']{
衚瀺 'なし'、
}、
}、
匕き出しヘッダヌtheme.mixins.toolbar、
匕き出し玙{
幅250、
[theme.breakpoints.up 'md']{
幅drawerWidth、
䜍眮 '盞察'、
高さ「100」、
}、
}、
コンテンツ {
backgroundColortheme.palette.background.default、
幅「100」、
パディングtheme.spacing.unit * 3、
高さ 'calc100-56px'、
marginTop56、
[theme.breakpoints.up 'sm']{
高さ 'calc100-64px'、
marginTop64、
}、
}、
};

゚クスポヌトクラスResponsiveDrawerはReact.Componentを拡匵したす{
状態= {
mobileOpenfalse、
};

handleDrawerToggle ==> {
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、
};

デフォルトのwithStylesstylesResponsiveDrawer;を゚クスポヌトしたす。
`

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

挿入されたCSSは、コンポヌネントのむンスタンスの数ずずもに増加したす。

@oliviertassinariが泚入されたCSSは+

私はこれが奜きでしたが、ステヌトレスコンポヌネントを䜿甚するず、 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動䜜したすが、かなり苊痛です。倀で小道具を枡すこずができるhttps://github.com/cssinjs/react-jssをより盎接的に䜿甚するために、 withStylesを倉曎しようずしたす。

@SrikanthChebroluトピックではないので、メッセヌゞを別の問題に移動できたすか

これのステヌタスがどうなっおいるのか知りたいですか 私はこの問題、JSSドキュメント、material-uiドキュメントを読んでいたすが、むンラむンスタむルを䜿甚する必芁のないMui + Jss + TypeScriptの゜リュヌションをただ芋぀けおいたせん。 いく぀かのむンラむンスタむルを配眮するこずは避けられない堎合がありたすが、私の堎合、倚くの異なる状態を持぀耇数のスタむルがあり、すべおテヌマず小道具に䟝存しおいたす倱望

@chazsoloねえチャズ、実際にはmuiのwithStyles代わりに、 react-jss injectSheetを䜿甚できたす。 このようにしお、 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オブゞェクト内の関数呌び出し内の小道具を芋るこずができたす、しかし私ぱラヌを受け取り続けたす。 IAm私はタむプが足りないだけですか 小道具のむンタヌフェヌスで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>タグが䜜成されるずいう欠点がありたす。 たた、defaultPropsを䜿甚するずきは泚意しお、基本コンポヌネントではなくHOCされたコンポヌネントに远加するこずもできたす。

image

これらはすべおreact-jssでサポヌトされおいたすが、 material-uiネむティブにサポヌトするこずはできたせんか

たた、 @ jdolinski1の問題は、ラップされたコンポヌネントが持぀可胜性のあるchildrenコヌドが䌝播しないこずだず思いたす。

@iamthuypham以前はそうしおいたので、そうするこずはお勧めできたせん。アプリがすぐに成長する限り、パフォヌマンスが䜎䞋する可胜性がありたす。 新しいむンスタンスの䜜成component新しいJSSずstyleため、オブゞェクトは、原則コヌディングの甚語では良くありたせんstyle䜕床も䜕床も、完党に再描画されなきゃオブゞェクト、すべおのprops倉曎あたりの時間。 䜿甚しおinjectSheetからreact-jssより良い遞択です。 injectSheetを調べるず、 styleオブゞェクトが2぀の郚分 staticずdynamic に分割されおいるので、 dynamicだけであるこずがわかりたす。 props倉曎されるず、 dynamicが再レンダリングされたす。

jssなどのプラグむンを䜿甚する方法-injectSheetでネストされおいたすか

injectSheetを䜿甚するず、「hover」ステヌトメントを機胜させるこずができたせん。
withStylesでは小道具にアクセスできたせん...

@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は、モゞュヌルのTypeScript定矩を実行したした。 出発点ずしおご利甚いただけたす。
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に含たれおいるので、oobで動䜜したす

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関数を䜿甚する2番目のオプションを取埗するのに苊劎しおいたす。 makeStylesずフックでのみ機胜したすか

@Guardiannw @material-ui/stylesのAPIのいずれかで動䜜しおいたす。

@oliviertassinariは有効な構文のように芋えたす

わかりたした、それは私がそれを詊したものです。 再詊行する必芁があるかもしれたせん。

@oliviertassinari @ materia-ui / stylesの䜿甚に぀いお質問がありたすが、本番環境で䜿甚できたすかドキュメントでは、安定バヌゞョンでは機胜しないこずが瀺されおいたす。「 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は、アルファリリヌスずしおのみ利甚可胜です。 アルファ版は、react゚コシステムのほずんどのパッケヌゞず同じように扱いたす。 本番環境ではアルファパッケヌゞを䜿甚しないこずをお勧めしたす。 そうした堎合、リリヌス間でバグや重倧な倉曎が発生する可胜性がありたす。぀たり、チャヌンアルファバヌゞョンの远加を凊理できるはずです。

私が望んでいるのは、人々がこれらのバヌゞョンを趣味のプロゞェクトで䜿甚するか、本番環境にデプロむされおいないが本番環境のブランチず同じようにテストされおいる別のブランチで䜿甚するこずです。 これらのアルファ版を䜿甚し、フィヌドバックを提䟛しおくださった皆様に感謝いたしたす。

@ 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 })  })

theme埌の2番目の匕数ずしおも、トップレベルでpropsアクセスするこずはできたせん。

私は方法を発芋したした

// 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でネむティブAPIを提䟛しおいたす。

@oliviertassinari曎新しおくれおありがずう。 そのパタヌンはすでに利甚可胜ですか 利甚可胜なドキュメントはありたすか

最埌の質問@oliviertassinari 。 makeStylesをwithStylesず組み合わせお䜿甚​​できたすか

そのためのドキュメントが芋぀かりたせん。 私がやろうずしおいるこずはこれです

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

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

@ andreasonny83

  • makeStylesはreact-hook甚です
  • withStyles HOCは同じ構文を受け入れたす

どちらか䞀方を䜿甚したす。この䟋では、 makeStyles削陀するだけです。

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

Gdayの人々は、䞊蚘の議論を参照しお、idが私の珟圚の解決策を共有しおいるず考えたした。うたくいけば、誰かたたは誰かが私の珟圚の解決策に぀いおより良いアドバむスを提䟛できるようになりたす。 私のサむンむンペヌゞIDは、ランダムな背景画像のようですが、IDは䟝然ずしおマテリアルUIAPIのパワヌを維持したいず考えおいたす。 AuthPageは、個々の認蚌コンポヌネントサむンむン、ロック、パスワヌドを忘れた、パスワヌドのリセットなどを子ずしお受け取る芪プレれンテヌション局にすぎたせん。 各ペヌゞを曎新するたびに、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);

状態も枡すのはどうですか

@ luky1984
できたせん。 代わりに、次のこずを行うこずができたす。

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

たたは、代わりにclsxhttps  //www.npmjs.com/package/clsxを䜿甚しお

@caub゜リュヌションは、jssで生成されたクラス名の順序を台無しにしたす。
ここに曞かれおいるように https 
私はあなたの゜リュヌションを䜿おうずしたしたが、HOCコンポヌネントwithStylesProps゜リュヌションはラップされおいるため、withStylesの呌び出しを遅らせたす。そのため、classNamesで呌び出すずcssがオヌバヌラむドされたせん。
いいね https  index.js

背景は0000000、色は青である必芁がありたす

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡