Passing props to material UI style

后端 未结 7 461
暗喜
暗喜 2020-12-13 08:41

given card code as in here : card

how can I update the card style or any material UI style as from

    const styles = theme => ({
    card: {
           


        
相关标签:
7条回答
  • 2020-12-13 08:55

    export const renderButton = (tag, method, color) => {
      const OkButton = withStyles({
        root: {
          "color": `${color}`,
          "filter": "opacity(0.5)",
          "textShadow": "0 0 3px #24fda39a",
          "backgroundColor": "none",
          "borderRadius": "2px solid #24fda3c9",
          "outline": "none",
          "border": "2px solid #24fda3c9",
          "&:hover": {
            color: "#24fda3c9",
            border: "2px solid #24fda3c9",
            filter: "opacity(1)",
          },
          "&:active": {
            outline: "none",
          },
          "&:focus": {
            outline: "none",
          },
        },
      })(Button);
      return (
        <OkButton tag={tag} color={color} fullWidth onClick={method}>
          {tag}
        </OkButton>
      );
    };
    
    renderButton('Submit', toggleAlert, 'red')

    0 讨论(0)
  • 2020-12-13 08:58

    Solution for how to use both props and theme in material ui :

    const useStyles = props => makeStyles( theme => ({
        div: {
            width: theme.spacing(props.units || 0)  
        }
    }));
    
    export default function ComponentExample({ children, ...props }){
        const { div } = useStyles(props)();
        return (
            <div className={div}>{children}</div>
        );
    }
    
    0 讨论(0)
  • 2020-12-13 08:59

    Deleted the old answer, because it's no reason for existence.

    Here's what you want:

    import React from 'react';
    import { makeStyles } from '@material-ui/core';
    
    const useStyles = makeStyles({
        firstStyle: {
            backgroundColor: props => props.backgroundColor,
        },
        secondStyle: {
            color: props => props.color,
        },
    });
    
    const MyComponent = ({children, ...props}) =>{
        const { firstStyle, secondStyle } = useStyles(props);
        return(
            <div className={`${firstStyle} ${secondStyle}`}>
                {children}
            </div>
        )
    }
    
    export default MyComponent;
    

    Now you can use it like:

    <MyComponent color="yellow" backgroundColor="purple">
        Well done
    </MyComponent>
    

    Official Documentation

    0 讨论(0)
  • 2020-12-13 08:59

    Here the Typescript solution:

    import React from 'react';
    import { makeStyles } from '@material-ui/core/styles';
    import Button from '@material-ui/core/Button';
    import {Theme} from '@material-ui/core';
    
    export interface StyleProps {
        height: number;
    }
    
    const useStyles = makeStyles<Theme, StyleProps>(theme => ({
      root: {
        background: 'green',
        height: ({height}) => height,
      },
    }));
    
    export default function Hook() {
    
      const props = {
        height: 48
      }
    
      const classes = useStyles(props);
      return <Button className={classes.root}>Styled with Hook API</Button>;
    }
    

    If you want to play with it, try it in this CodeSandbox

    0 讨论(0)
  • 2020-12-13 09:04

    This answer was written prior to version 4.0 severely out of date!

    Seriously, if you're styling a function component, use makeStyles.

    The answer from James Tan is the best answer for version 4.x

    Anything below here is ancient:

    When you're using withStyles, you have access to the theme, but not props.

    Please note that there is an open issue on Github requesting this feature and some of the comments may point you to an alternative solution that may interest you.

    One way to change the background color of a card using props would be to set this property using inline styles. I've forked your original codesandbox with a few changes, you can view the modified version to see this in action.

    Here's what I did:

    1. Render the component with a backgroundColor prop:
    // in index.js
    if (rootElement) {
      render(<Demo backgroundColor="#f00" />, rootElement);
    }
    
    1. Use this prop to apply an inline style to the card:
        function SimpleCard(props) {
          // in demo.js
          const { classes, backgroundColor } = props;
          const bull = <span className={classes.bullet}>•</span>;
          return (
            <div>
              <Card className={classes.card} style={{ backgroundColor }}>
                <CardContent>
                  // etc
    

    Now the rendered Card component has a red (#F00) background

    Take a look at the Overrides section of the documentation for other options.

    0 讨论(0)
  • 2020-12-13 09:06

    Here's the official Material-UI demo.

    And here's a very simple example. It uses syntax similar to Styled Components:

    import React from "react";
    import { makeStyles, Button } from "@material-ui/core";
    
    const useStyles = makeStyles({
      root: {
        background: props => props.color,
        "&:hover": {
          background: props => props.hover
        }
      },
      label: { fontFamily: props => props.font }
    });
    
    export function MyButton(props) {
      const classes = useStyles(props);
      return <Button className={classes.root} classes={{ label: classes.label }}>My Button</Button>;
    }
    
    
    // and the JSX...
    <MyButton color="red" hover="blue" font="Comic Sans MS" />
    

    This demo uses makeStyles, but this feature is also available in styled and withStyles.

    This was first introduced in @material-ui/styles on Nov 3, 2018 and was included in @material-ui/core starting with version 4.

    0 讨论(0)
提交回复
热议问题