Skip to content

Instantly share code, notes, and snippets.

@bennycode
Last active May 6, 2024 11:31
Show Gist options
  • Save bennycode/18164026d47a4f2f69b16eaf4dbcbae0 to your computer and use it in GitHub Desktop.
Save bennycode/18164026d47a4f2f69b16eaf4dbcbae0 to your computer and use it in GitHub Desktop.
Material UI Tricks

Add class

  render(): JSX.Element {
    const {classes, title} = this.props;
    return (
      <>
         <TextField
           className={classes.TextField}
           ...
         />
      </>
    );
  }

Merge classes

import classNames from 'classnames';

...

<FormControl className={classNames(classes.TextField, classes.Button)}>
  ...
</FormControl>
import clsx from 'clsx';

...

<FormControl className={clsx(classes.TextField, classes.Button)}>
  ...
</FormControl>

Another option would be "classcat".

Benchmarks of all three: https://github.com/lukeed/clsx/tree/v1.0.4/bench

Inline onChange Listener

<TextField
  autoComplete="off"
  className={classes.TextField}
  error={this.state.hasFailed}
  label="Passphrase"
  margin="normal"
  onChange={event => this.setState({accountApiPassphrase: event.target.value})}
  required={false}
  value={this.state.accountApiPassphrase}
  variant="outlined"
/>
      onChange={(event: React.ChangeEvent<HTMLInputElement>) => {
        updateSelection(event.target.value);
      }}

Building selects

<FormControl className={classes.TextField}>
  <InputLabel htmlFor="age-simple">Age</InputLabel>
  <Select
    value={this.state.interval}
    onChange={(event: React.ChangeEvent<{name?: string; value: unknown}>) => {
      this.setState({interval: event.target.value});
    }}
    inputProps={{
      name: 'age',
      id: 'age-simple',
    }}
  >
    <MenuItem value={10}>Ten</MenuItem>
    <MenuItem value={20}>Twenty</MenuItem>
    <MenuItem value={30}>Thirty</MenuItem>
  </Select>
</FormControl>
<TextField
  className={classes.TextField}
  label="Age"
  onChange={(event: React.ChangeEvent<HTMLInputElement>) => {
    const value = parseInt(event.target.value, 10);
    this.setState({interval: value});
  }}
  required={true}
  select={true}
  value={this.state.interval}
  variant="outlined">
  {[
    {name: 'Ten', value: 10},
    {name: 'Twenty', value: 20},
    {name: 'Thirty', value: 30},
  ].map((entry, index) => {
    return <MenuItem key={index} value={entry.value}>
      {entry.name}
    </MenuItem>
  })}
</TextField>
<br/>

Render withStyles

const JsonTextField = withStyles(styles)((props: TextFieldProps & WithStyles<typeof styles>) => {
  const {classes} = props;

  return (
    <TextField
      {...props}
      fullWidth
      multiline
      rows={4}
      rowsMax={Infinity}
      variant="outlined"
      InputProps={{
        className: classes.textArea,
      }}
    />
  );
});

Create :hover effect

const styles = (theme: Theme) =>
  createStyles({
    Toolbar: {
      '&:hover': {
        textDecoration: 'none',
      },
    }
  });

Simple component

import React from 'react';
import {WithStyles} from '@material-ui/core/styles';
import {
  createStyles,
  Theme,
  withStyles,
} from '@material-ui/core';

const styles = (theme: Theme) =>
  createStyles({
    TestDesign: {
      color: theme.palette.text.secondary,
    },
  });

interface Props extends WithStyles<typeof styles> {
  something: string;
}

interface State {
  something: string;
}

class MyPage extends React.Component<Props, State> {
  constructor(props: Props) {
    super(props);
    this.state = {
      something: 'Hello, World!'
    }
  }

  render(): JSX.Element {
    const {classes} = this.props;    
    return (<p className={classes.TestDesign}>{`${this.state.something}`}</p>)
  }
}

export default withStyles(styles)(MyPage);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment