๐Ÿ”ฅ ์˜ค๋Š˜ ํ•œ ์ผ

  • StudyHaza ํ”Œ์ 
    • ์Šคํ„ฐ๋”” ์ƒ์„ธํŽ˜์ด์ง€ - ๊ธฐ์ˆ ์Šคํƒ ์•„์ด์ฝ˜ ์ ์šฉ ๋ฐ ๋””์ž์ธ ์ˆ˜์ •
    • ์ปค๋ฎค๋‹ˆํ‹ฐ ์ƒ์„ธํŽ˜์ด์ง€ ์ถ”๊ฐ€
    • ์ปค๋ฎค์นด๋“œ์— ์ปค๋ฎค ์ƒ์„ธํŽ˜์ด์ง€ ์—ฐ๊ฒฐ
  • ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค Lv.0 4๋ฌธ์ œ ์™„๋ฃŒ
  • [Udemy React] Section9(Portals & Refs)

๐Ÿšจ Error Handling

๐Ÿž ๊ธฐ์ˆ ์Šคํƒ๋ช… ์•„์ด์ฝ˜ ์ถ”๊ฐ€ ๋ฐ ๋””์ž์ธ ๋ณ€๊ฒฝํ•˜๊ธฐ

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-10-22 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 1 36 09

์›๋ž˜๋Š” ์œ„์™€ ๊ฐ™์ด ๊ธฐ์ˆ  ์Šคํƒ๋ช…๋งŒ ์ถœ๋ ฅ์„ ํ–ˆ๋Š”๋ฐ ์—ฌ๊ธฐ์„œ ์•„์ด์ฝ˜๋„ ์ถ”๊ฐ€ํ•˜๊ณ , ์Šคํƒ๋ช… ๋ฐฐ๊ฒฝ์ƒ‰์„ ์•„์ด์ฝ˜ ๋ฐฐ๊ฒฝ์ƒ‰๊ณผ ๋™์ผํ•˜๊ฒŒ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์—ˆ๋”ฐ!

 
 // ์•„๋ž˜์™€ ๊ฐ™์ด ๊ธฐ์ˆ ์Šคํƒ๋ช…์— ํ•ด๋‹นํ•˜๋Š” color ์„ ์–ธ
 const stackBackgrounds = [
   { stack: "Angular", color: "#DD0031" },
   { stack: "Emotion", color: "#E19EDC" },
   { stack: "GraphQL", color: "#E10098" },
   { stack: "NextJS", color: "#000000" },
   { stack: "ReactJS", color: "#61DAFB" },
   { stack: "VueJS", color: "#4FC08D" },
 	...
 ];
 
 const ViewStudy = () => {
 	...
 
 	// ๊ธฐ์ˆ ์Šคํƒ๋ช…์— ํ•ด๋‹นํ•˜๋Š” color๋ฅผ ํ•„ํ„ฐ๋งํ•ด์„œ style์˜ background ๊ฐ’์œผ๋กœ ๋„˜๊ฒจ์คฌ๋‹ค
 	const pick = (i) => {
 	    const filtered = stackBackgrounds
 	      .filter((el) => el.stack === i)
 	      .map((el) => el.color);
 	    return filtered;
 	};
 	
 	return {
 		<DevStackList>
 		  {data.devStack &&
 		    data.devStack.map((el, idx) => {
 		      return (
 						// pick()ํ•จ์ˆ˜๋ฅผ background ๊ฐ’์— ํ• ๋‹นํ•ด์คŒ
 		        <li key={idx} style={{ background: pick(el) }}>
 		          <img ... />
 		          <div>{el}</div>
 		        </li>
 		      );
 		    })}
 		</DevStackList>
 	}
 }

โœจ ์ฝ”๋“œ๋Š” ์ข€ ๋”๋Ÿฝ์ง€๋งŒ,, ์–ด์จ‹๋“  ๊ตฌํ˜„ ๊ฒฐ๊ณผ

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-10-22 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 1 35 55

๐Ÿงš ์ƒˆ๋กญ๊ฒŒ ์•Œ๊ฒŒ ๋œ ๋‚ด์šฉ

โœ”๏ธ Portal

  • createPortal์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ์˜ HTML ๋‚ด์šฉ์„ ๋‹ค๋ฅธ ๊ณณ์œผ๋กœ ํฌํ„ธ, ์ฆ‰ ์ด๋™์‹œํ‚ฌ ์ˆ˜ ์žˆ์Œ
  • ๋‹ค๋งŒ, ๋ Œ๋”๋ง๋˜๋Š” ์‹ค์ œ DOM ์•ˆ์—์„œ๋งŒ ๊ฐ€๋Šฅ!
  • Modal์ฐฝ <div>๊ฐ€ <div id="root"></div> ์•ˆ ๋ง๊ณ  ๋ฐ–์— ์œ„์น˜ํ•˜๋Š”๊ฒŒ ๊ตฌ์กฐ์ƒ ๋” correct!
    โ‡’ ์ด๋Ÿด ๋•Œ Modal์ฐฝ์„ <div id="root"></div> ๋ฐ–์— ์œ„์น˜์‹œํ‚ค๋Š”๊ฒŒ Portal !!
<!-- index.html -->
...
<body>
	...
	<div id="backdrop-root"></div> <!-- here -->
  <div id="overlay-root"></div>  <!-- here -->
  <div id="root"></div>
</body>
// ErrorModal.js

import ReactDOM from "react-dom";
...

const Backdrop = (props) => {
  return <div className={classes.backdrop} onClick={props.onConfirm} />;
};

const ModalOverlay = (props) => {
  return (
    <Card className={classes.modal}>
      <header className={classes.header}>
        <h2>{props.title}</h2>
      </header>
      <div className={classes.content}>
        <p>{props.message}</p>
      </div>
      <footer className={classes.actions}>
        <Button onClick={props.onConfirm}>Okay</Button>
      </footer>
    </Card>
  );
};

const ErrorModal = (props) => {
  return (
    <React.Fragment>
      {ReactDOM.createPortal(
        <Backdrop onConfirm={props.onConfirm} />,
        document.getElementById("backdrop-root") // ์ปดํฌ๋„ŒํŠธ๋ฅผ ์œ„์น˜์‹œํ‚ฌ ์œ„์น˜
      )}
      {ReactDOM.createPortal(
        <ModalOverlay
          title={props.title}
          message={props.message}
          onConfirm={props.onConfirm}
        />,
        document.getElementById("overlay-root")
      )}
    </React.Fragment>
  );
};

โœ๏ธ Diary

์˜ค๋Š˜์€ ๋Šฆ์ž ๋„ ์ž๊ตฌ, ๊ตญ์ทจ์ œ ๋งˆ์ง€๋ง‰ ์˜คํ”„ ์ƒ๋‹ด๋•œ์— ์™ธ์ถœํ•˜๊ตฌ ์™”๋”๋‹ˆ ์‹œ๊ฐ„ ์ˆœ์‚ญ..
๊ณ„ํšํ–ˆ๋˜๊ฑฐ ๋‹ค ๋ชป ๋๋‚ด๊ณ , ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์ด ๋งŽ์ด ์—†๋Œœ,, ๐Ÿฅฒ

profile
FE developer

0๊ฐœ์˜ ๋Œ“๊ธ€

Powered by GraphCDN, the GraphQL CDN