0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【React】snackbarsを親コンポーネントから子コンポーネントにメッセージを渡せるようにカスタマイズした例【Material-UI】

Last updated at Posted at 2021-08-04

カスタマイズした箇所について

MaterialUIのsnackbarsを親コンポーネントから渡されたメッセージを子コンポーネントのsnackbarsに渡して、そのメッセージを表示するような簡単なカスタマイズをしました。

なお、今回はスタンダードなCustomized snackbarsを使用しました。

実装

まず親コンポーネントの実装例です。 簡単に呼び出す箇所のみを抜き出して記載します。 buttonを押下すると、メッセージが更新されるようになっています。
Hoge.jsx
import React, {Fragment,useState} from "react";
import {CustomizedSnackbars} from "../component/MaterialUISnackber";

export const Hoge= () => {
  const [messageState,setMessage] = useState("");
  const [count,setCount] = useState(0);

  const handleClick = () => {
    setCount(count + 1);
    if(messageState === ""){
      setMessage("SNACKMESSAGE");
    }else{
      setMessage(count + "回目");
    }
  }

  return (
  <Fragment>
    <Button variant="outlined" onClick={handleClick}>
        ADDMESSAGE
     </Button>
    {
    state.message !== ""?
      <MessageWrapper>
        <CustomizedSnackbars message={state.message}/>
      </MessageWrapper>
    :
      null
    }
  </Fragment>
  )
}

こちらが肝心の子コンポーネントのsnackbarになります。
デフォルトからの主な変更点としては、
・useEffectでopenとcloseをmessageが変更された時に動作するようにしました
・messageがない時や想定していない値(undefined)が入った時に表示しないようにしました(念のため)

CustomizedSnackbars
import React, {Fragment, useEffect,useState } from 'react';
import Button from '@material-ui/core/Button';
import Snackbar from '@material-ui/core/Snackbar';
import MuiAlert from '@material-ui/lab/Alert';
import { makeStyles } from '@material-ui/core/styles';

function Alert(props) {
  return <MuiAlert elevation={6} variant="filled" {...props} />;
}

const useStyles = makeStyles((theme) => ({
  root: {
    width: '100%',
    '& > * + *': {
      marginTop: theme.spacing(2),
    },
  },
}));

export function CustomizedSnackbars({message}) {
  const classes = useStyles();
  const [open, setOpen] = useState(false);
  
  useEffect(() => {
    if(message === ""){
      setOpen(false);
    } else {
      setOpen(true);
      console.log(message)
    }
  },[message])

  const handleClose = (event, reason) => {
    if (reason === 'clickaway') {
      return;
    }

    setOpen(false);
  };

  return (
    <Fragment>
      {
      message === undefined || message === null || message === ""?
        null
      :
      <div className={classes.root}>
        <Snackbar open={open} autoHideDuration={5000} onClose={handleClose}>
          <Alert onClose={handleClose} severity={"success"}>
            {message}
          </Alert>
        </Snackbar>
        </div>
      }

    </Fragment>
  );
}

参考

https://material-ui.com/components/snackbars/#customized-snackbars

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?