Material-UI의 withStyles에서 지정하는 stylesCreator에서 부모로부터 props로 받은 값을 동적으로 적응시키는 HOC

Can withStyles pass props to styles object?

Material-UI의 style의 커스텀에 관해서는, 이 기사가 간결하고 알기 쉽기 때문에 여러가지 설명은 할애.
material-ui의 외형을 조정하는 3가지 방법

setup
npx create-react-app my-app
cd my-app
yarn add @material-ui/core
touch src/button.jsx 
yarn start

초기 기본 설정

src/button.jsx
import React, { Component } from "react";
import { withStyles } from "@material-ui/core/styles";
import Button from "@material-ui/core/Button";

const styles = theme => ({});

const ExtendButton = props => {
  const { children } = props;
  return <Button variant="contained">{children}</Button>;
};

export default withStyles(styles)(ExtendButton);

src/App.js
import React, { Component } from "react";
import Button from "./button";

class App extends Component {
  render() {
    return (
      <div>
        <Button>Hello World</Button>
      </div>
    );
  }
}

export default App;



다음은 기본 설정을 해킹

src/button.jsx
const styles = theme => ({
  contained: {
    backgroundColor: "green"
  }
});

const ExtendButton = props => {
  const { classes, children } = props;

  return (
    <Button
      variant="contained"
      classes={{
        contained: classes.contained
      }}
    >
      {children}
    </Button>
  );
};



그렇다면 사람은 그렇게됩니다.

src/App.js
 return (
      <div>
        <Button backgroundColor="green">Hello World</Button>
        <Button backgroundColor="red">Hello World</Button>
        <Button backgroundColor="blue">Hello World</Button>
      </div>
    );

그런 때는 HOC의 차례

이번 메이드 HOC를 만들어 갑니다
touch src/withStylesProps.jsx

src/withStylesProps.jsx
import { withStyles } from "@material-ui/core/styles";
import * as React from "react";

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

export default withStylesProps;

결국 이런 느낌

src/App.js
import React, { Component } from "react";
import Button from "./button";

class App extends Component {
  render() {
    return (
      <div>
        <Button backgroundColor="green">Hello World</Button>
        <Button backgroundColor="red">Hello World</Button>
        <Button backgroundColor="blue">Hello World</Button>
      </div>
    );
  }
}

export default App;

src/button.jsx
import React, { Component } from "react";
import withStylesProps from "./withStylesProps";
import Button from "@material-ui/core/Button";

const styles = props => ({
  contained: {
    backgroundColor: props.backgroundColor
  }
});

const ExtendButton = props => {
  const { classes, children } = props;

  return (
    <Button
      variant="contained"
      classes={{
        contained: classes.contained
      }}
    >
      {children}
    </Button>
  );
};

export default withStylesProps(styles)(ExtendButton);



「...theme을 계승할 수 있는 것도 준비하는 편이 네」

좋은 웹페이지 즐겨찾기