728x90
๋ฐ˜์‘ํ˜•
๋ฐ˜์‘ํ˜•

๐Ÿ–ฅ๏ธ  ThemeProvider ?

์ง€์ •๋œ ๋””์ž์ธ ์‹œ์Šคํ…œ์„ ๋ชจ๋“  ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ !?

๊ทธ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ThemeProvider์ด๋‹ค.

React ์ปดํฌ๋„ŒํŠธ์—์„œ ํ…Œ๋งˆ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ์—ญํ• ์ด๋ผ๊ณ  ํ•œ๋‹ค. ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ๊ณตํ†ต theme์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ƒ‰์ƒ๊ฐ’์€ props๋ฅผ ํ†ตํ•ด ์ „๋‹ฌํ•œ๋‹ค.

 

 

๐Ÿ–ฅ๏ธ  ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ• ๊นŒ?

1. theme ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ , ํ•ด๋‹น ํŒŒ์ผ์— ์ƒ‰์ƒ์„ ์ง€์ •ํ•œ๋‹ค.

๋‹ค์Œ์€ ๋‚ด๊ฐ€ ์ง€์ •ํ•œ theme ์ƒ‰์ƒ์ด๋‹ค. 

// styles/theme.js

const theme = {
  colors: {
    background: "#121212",
    text: "#ececec",
    primary: "#63e6be",
    primary2: "#62E6BE",
    white1: "#F1F3F5",
    white: "#FFFFFF",
    unSelected: "#ACACAC",
    secondBlack: "#1E1E1E",
    divider: "#2A2A2A"
  },
};

export default theme;

 

 

2. import ํ•˜๊ธฐ

๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ํŒŒ์ผ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ƒ๋‹จ์— import ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

import { ThemeProvider } from "styled-components";
import theme from "../../styles/theme";

 

 

3. App.js์— ์‚ฌ์šฉํ•˜๊ธฐ

import theme from "./styles/theme";
import Router from "./router/Router";

function App() {
  return (
    <ThemeProvider theme={theme}>
      <GlobalStyle />
      <Router />
    </ThemeProvider>
  );
}

export default App;

์ด๋ ‡๊ฒŒ ์ƒ์„ฑํ•œ ๊ฐ์ฒด๋ฅผ ThemeProvider์˜ props๋กœ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค !!

 

 

4. ์‹ค์ œ ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ

background-color: ${theme.colors.background};

 

 

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด, theme ํŒŒ์ผ์— ์žˆ๋Š” ์ƒ‰์ƒ๋“ค์„ ๋‹ค๋ฅธ ํŒŒ์ผ์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค !!

 

 

 

 

728x90
๋ฐ˜์‘ํ˜•
728x90
๋ฐ˜์‘ํ˜•
๋ฐ˜์‘ํ˜•

์ด์ „์— react์—์„œ ์ œ๊ณตํ•˜๋Š” dropdown ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปค์Šคํ…€ ํ•œ ์ ์ด ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ์ด๋ฒˆ์— ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š” ๋“œ๋กญ๋‹ค์šด์€ ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ปค์Šคํ…€ํ•ด์„œ๋Š” ํ•  ์ˆ˜ ์—†์—ˆ๋‹ค.

์•ฝ 20๋ถ„์ •๋„ ํ•ด๋ณด๊ณ  ์•ˆ๋˜๋‹ˆ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์ฐพ์•„๋ณด๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค.

 

๋‚ด๊ฐ€ ํ•˜๊ณ  ์‹ถ์€ ๊ฑด, ์•„์ด์ฝ˜์„ ๋ˆŒ๋ €์„ ๋•Œ ๋“œ๋กญ๋ฐ•์Šค๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฒƒ์ด์—ˆ๋Š”๋ฐ ์ด๋Ÿฌํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐพ์•„๋ดค์œผ๋‚˜, ๊ตฌ๋…์„ ํ•˜๊ฑฐ๋‚˜ ๋ˆ์„ ๋‚ด์•ผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์ด์—ˆ๋‹ค.

 

๊ณ ๋ฏผ ๋์— ๊ทธ๋ƒฅ ๋งŒ๋“ค๊ธฐ๋กœ ํ–ˆ๋‹ค.

 

๋Œ€๋žต์ ์ธ ์ƒ๊ฐ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

1. ์•„์ด์ฝ˜ ๋ฒ„ํŠผ์„ ์ƒ์„ฑํ•œ๋‹ค.
2. ๋ฒ„ํŠผ์„ ํด๋ฆญ ํ–ˆ์„ ๋•Œ dropdown์„ ๋ณด์—ฌ์ค€๋‹ค.
3. dropdown ์ปจํ…Œ์ด๋„ˆ ์•ˆ์— ๊ฐ list์— ๋ผ์šฐํ„ฐ๋ฅผ ์—ฐ๊ฒฐํ•ด ์›ํ•˜๋Š” ํŽ˜์ด์ง€๋กœ ์ด๋™์‹œํ‚จ๋‹ค.

 

1. ์•„์ด์ฝ˜ ๋ฒ„ํŠผ ์ƒ์„ฑํ•˜๊ธฐ

์ด๋ถ€๋ถ„์€ ์™„์ „ํ•œ ui ์˜์—ญ์ด๊ธฐ์— ๊ทธ๋ƒฅ ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•œ ์•„์ด์ฝ˜ ๋ฒ„ํŠผ ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด๋‘๊ฒ ๋‹ค.

<ProfileButton
          onClick={toggleDropdown}
          style={{ backgroundColor: "transparent" }}
        >
         {/*  */}
          <AccountCircleIcon
            sx={{
              fontSize: "30px",
              color: "white",
              paddingTop: "5px",
              paddingLeft: "20px",
              paddingRight: "80px",
            }}
          />
</ProfileButton>
const ProfileButton = styled.button`
  text-align: center;
  background-color: ${theme.colors.background};
  color: ${theme.colors.white1};
  border-color: transparent;
  width: 35px;
  height: 35px;
  margin-right: 130px;
`;

 

2. ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ dropdown ๋ณด์—ฌ์ฃผ๊ธฐ

2-1. ์ƒํƒœ ๊ด€๋ฆฌ

์ด๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ƒํƒœ๊ด€๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š” useEffect๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

๋ฒ„ํŠผ์ด ๋ˆŒ๋ ธ๋Š”์ง€, ์•ˆ๋ˆŒ๋ ธ๋Š”์ง€์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ํ™”๋ฉด ์ƒํƒœ๋ฅผ ๋ณด์—ฌ์ค˜์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

const [isDropdownOpen, setIsDropdownOpen] = useState(false);

 

์ด๋ฅผ ์œ„ํ•ด ๋จผ์ € false๋กœ ์ดˆ๊ธฐํ™” ๋œ isDropdownOpen ์ด๋ผ๋Š” ์ƒํƒœ ๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜์˜€๋‹ค.

์ด ๋ณ€์ˆ˜๋Š” dropdown์ด ์—ด๋ ค ์žˆ๋Š”์ง€, ๋‹ซํ˜€ ์žˆ๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์˜ˆ์ƒํ–ˆ๋“ฏ, false๋Š” ๋‹ซํžŒ ์ƒํƒœ์ด๊ณ , true๋Š” ์—ด๋ฆฐ ์ƒํƒœ์ด๋‹ค.

๋‹ค์Œ์œผ๋กœ setIsDropdownOpen์ด๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ์—ฐ๊ฒฐํ–ˆ๋Š”๋ฐ, ์ด ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด isDropdownOpen์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

const ref = useRef(null);

 

useRef๋Š” ๋‚˜๋„ ์•„์ง ๊ณต๋ถ€๋ฅผ ๋” ํ•ด๋ด์•ผ ํ•˜๊ฒ ์ง€๋งŒ, DOM์— ์ง์ ‘ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค๊ณ  ํ•œ๋‹ค. DOM์— ์ ‘๊ทผํ•ด์„œ ๋ฌด์—‡์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ–ˆ๋‹ค. ์ฐพ์•„๋ณด๋‹ˆ, ์–ด๋–ค ์ž…๋ ฅ ํ•„๋“œ์— ์ž๋™์œผ๋กœ ํฌ์ปค์Šค๋ฅผ ๋งž์ถ”๊ฑฐ๋‚˜, ์–ด๋–ค ์š”์†Œ์˜ ํฌ๊ธฐ ํ˜น์€ ์œ„์น˜๋ฅผ ์•Œ์•„๋‚ด์•ผ ํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‚˜๋Š” ๋ฒ„ํŠผ์„ ๋‹ค์‹œ ํด๋ฆญํ•˜๊ฑฐ๋‚˜, ์™ธ๋ถ€ ๋ฐ”ํƒ•์„ ํด๋ฆญํ•˜๋ฉด ๋“œ๋กญ๋ฐ•์Šค๊ฐ€ ๋‹ซํžˆ๊ฒŒ ํ•˜๊ณ  ์‹ถ์—ˆ๋‹ค. 

์ด ref๋ฅผ ์‚ฌ์šฉํ•œ ์ž์„ธํ•œ ์ฝ”๋“œ๋Š” 2-2๊ฐ€ ๋  ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋ถ€๋ถ„์—์„œ ๋” ๋‹ค๋ฃฐ ์˜ˆ์ •์ด๋‹ค.

 

 

const toggleDropdown = () => {
  setIsDropdownOpen(!isDropdownOpen);
};

 

์ด ์ฝ”๋“œ๋Š” ํ•จ์ˆ˜์˜ dropDown์ด ์—ด๋ ค ์žˆ์œผ๋ฉด ๋‹ซ๊ณ , ๋‹ซํ˜€์žˆ์œผ๋ฉด ์—ด๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

์ด ํ•จ์ˆ˜๋Š” ์•„์ด์ฝ˜์„ ํด๋ฆญํ–ˆ์„ ๋•Œ ์‹คํ–‰ํ•ด์•ผ ํ•œ๋‹ค.

 

 

2-2. ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ

๋‹ค์Œ์œผ๋กœ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

์•ž์„œ ์‚ด์ง ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด, ๋“œ๋กญ๋ฐ•์Šค ์™ธ๋ถ€์˜ ์˜์—ญ์„ ํด๋ฆญํ•˜๋ฉด ๋“œ๋กญ๋ฐ•์Šค๊ฐ€ ๋‹ซํžˆ๊ฒŒ ํ•˜๊ณ  ์‹ถ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

useEffect(() => {
    const handleClickOutside = (event) => {
      if (ref.current && !ref.current.contains(event.target)) {
        setIsDropdownOpen(false);
      }
    };

    document.addEventListener("mousedown", handleClickOutside);
    return () => {
      document.removeEventListener("mousedown", handleClickOutside);
    };
  }, [ref]);

 

์ •๋ฆฌํ•˜๋ฉด, ๋ฌด์–ธ๊ฐ€๋ฅผ ํด๋ฆญํ–ˆ์„ ๋•Œ dropDown ์™ธ๋ถ€์˜ ๊ฒƒ์ธ์ง€๋ฅผ ํ™•์ธํ•œ๋‹ค. ๋งŒ์•ฝ ์™ธ๋ถ€์˜ ๊ฒƒ์ด๋ผ๋ฉด 

ref.current.contains(event.target) ๋Š” false๊ฐ€ ๋œ๋‹ค.

๊ทธ๋ž˜์„œ ์™ธ๋ถ€๋ผ๋ฉด, dropDown์„ ๋‹ซ๊ฒŒ ๋œ๋‹ค.

 

3. ๋“œ๋กญ๋‹ค์šด ๋งŒ๋“ค๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ

<DropdownContainer ref={ref}>
	{/* ์•„์ด์ฝ˜ ๋ฒ„ํŠผ */}
        <ProfileButton
          onClick={toggleDropdown}
          style={{ backgroundColor: "transparent" }}
        >
        {/* ์—ฌ๊ธฐ์— ์‚ฌ์šฉํ•  ์•„์ด์ฝ˜์„ ๋„ฃ์–ด์ค€๋‹ค. */}
          <AccountCircleIcon
            sx={{
              fontSize: "30px",
              color: "white",
              paddingTop: "5px",
              paddingLeft: "20px",
              paddingRight: "80px",
            }}
          />
        </ProfileButton>
        
        {/* ๋“œ๋กญ๋ฐ•์Šค๊ฐ€ ์—ด๋ ค ์žˆ์„ ๋•Œ StyledDropdown ๋ณด์—ฌ์ฃผ๊ธฐ */}
        {isDropdownOpen && (
          <StyledDropdown>
            <ul style={{display: "flex", flexDirection: "column"}}>
              <DropdownTextStyle href="/myPage">๋‚ด ๋ฒจ๋กœ๊ทธ</DropdownTextStyle>
              <DropdownTextStyle href="/notFound">์ž„์‹œ ๊ธ€</DropdownTextStyle>
              <DropdownTextStyle href="/notFound">์ฝ๊ธฐ ๋ชฉ๋ก</DropdownTextStyle>
              <DropdownTextStyle href="/notFound">์„ค์ •</DropdownTextStyle>
              <DropdownTextStyle href="/notFound">๋กœ๊ทธ์•„์›ƒ</DropdownTextStyle>
            </ul>
          </StyledDropdown>
        )}
</DropdownContainer>

 

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด, ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋“œ๋กญ๋‹ค์šด ๋ฐ•์Šค๋ฅผ ์ง์ ‘ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค !!

 

๊ฒฐ๊ณผ

-> ํ”„๋กœํ•„ ์•„์ด์ฝ˜ ์„ ํƒํ–ˆ์„ ๋•Œ

 

-> ๋“œ๋กญ๋‹ค์šด์— ์žˆ๋Š” ๋ฉ”๋‰ด ํ˜ธ๋ฒ„ ์‹œ

 

 

 

 

728x90
๋ฐ˜์‘ํ˜•

'๐Ÿ–ฅ๏ธ react' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[react] ThemeProvider ์‚ฌ์šฉํ•˜๊ธฐ  (0) 2024.01.20
[react] react-dropdown ์ปค์Šคํ…€ ํ•˜๊ธฐ  (0) 2024.01.15
[react] markdown editor, viewer ๊ตฌํ˜„ํ•˜๊ธฐ  (2) 2023.01.29
[react] useEffect()  (0) 2022.12.27
styled components  (0) 2022.12.27
728x90
๋ฐ˜์‘ํ˜•
๋ฐ˜์‘ํ˜•
728x90

react์—์„œ ๋“œ๋กญ๋ฐ•์Šค ๋ฒ„ํŠผ ๋งŒ๋“ค๊ธฐ

์–ด์ฉŒ๋‹ค ํ•˜๊ฒŒ ๋˜์—ˆ๋ƒ๋ฉด,

์ตœ๊ทผ ํ•™๊ต์—์„œ ๋ฐฉํ•™ ์ค‘ ์ง„ํ–‰ํ•˜๋Š” ์›น ์„œ๋น„์Šค ์บ ํ”„์— ์ฐธ์—ฌํ•˜๊ณ  ์žˆ๋‹ค.

๊ฐœ๋ฐœ ์–ธ์–ด, ํˆด ๋“ฑ์„ ์ž์œ ๋กญ๊ฒŒ ์„ ํƒํ•  ์ˆ˜ ์žˆ๊ธฐ์— ๋‚˜๋Š” ํ”„๋ก ํŠธ๋Š” ๋ฆฌ์•กํŠธ๋กœ ๊ฐœ๋ฐœํ•˜๊ฒ ๋‹ค ๊ฒฐ์ •ํ•˜์˜€๋‹ค.

 

ํ˜„์žฌ ์ง์ ‘ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ธฐํšํ•˜์—ฌ ์ƒˆ๋กœ์šด ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ณ , ์‹ค์ œ ์žˆ๋Š” ์„œ๋น„์Šค๋ฅผ ํด๋ก ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

๋™์•„๋ฆฌ๋ฅผ ํ†ตํ•ด ๊ธฐํš์˜ ๊ณผ์ •์ด ์–ผ๋งˆ๋‚˜ ์–ด๋ ต๊ณ  ํž˜๋“ ์ง€๋ฅผ ์•Œ๊ณ  ์žˆ์—ˆ๊ธฐ์— ๋‚˜๋Š” ํด๋ก ์ฝ”๋”ฉ์„ ์„ ํƒํ•˜์˜€๋‹ค.

 

์ด๋ฒˆ ์บ ํ”„์—์„œ์˜ ๋ชฉํ‘œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์›น ์„œ๋น„์Šค๊ฐ€ ๋งŒ๋“ค์–ด์ง€๋Š” ์ „์ฒด์ ์ธ ๊ณผ์ •์„ ์ตํžˆ๋Š” ๊ฒƒ. (ํ”„๋ก ํŠธ๋ถ€ํ„ฐ ์„œ๋ฒ„๊นŒ์ง€)

 

์ด๋ฅผ ์œ„ํ•ด Velog๋ฅผ ํด๋ก ์ฝ”๋”ฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜์˜€๋‹ค.

 

์„œ๋ก ์ด ๊ธธ์—ˆ๋Š”๋ฐ, ํด๋ก ์ฝ”๋”ฉ์„ ํ•˜๋‹ค๋ณด๋‹ˆ ๋“œ๋กญ๋ฐ•์Šค๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•  ์ผ์ด ์žˆ์—ˆ๋‹ค.

์‚ฌ์šฉํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋””์ž์ธ๋„ ์ปค์Šคํ…€ํ•˜๋Š” ๊ณผ์ •์ด ํ•„์š”ํ–ˆ๋‹ค.

 

 

1. react-dropdown ์„ค์น˜ํ•˜๊ธฐ

 

ํ„ฐ๋ฏธ๋„์— ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•ด์ค€๋‹ค.

// npm์œผ๋กœ ์„ค์น˜ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋œ๋‹ค.
$ npm install react-dropdown

// yarn์œผ๋กœ ์„ค์น˜ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋œ๋‹ค.
$ yarn add react-dropdown

https://www.npmjs.com/package/react-dropdown

 

react-dropdown

React dropdown component. Latest version: 1.11.0, last published: a year ago. Start using react-dropdown in your project by running `npm i react-dropdown`. There are 148 other projects in the npm registry using react-dropdown.

www.npmjs.com

( ์ž์„ธํžˆ ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด ์œ„ ์‚ฌ์ดํŠธ ์ฐธ๊ณ ํ•˜๊ธฐ )

 

 

2. ์ƒ๋‹จ์— import ํ•ด์ฃผ๊ธฐ

 

์„ค์น˜๊ฐ€ ์™„๋ฃŒ ๋˜์—ˆ๋‹ค๋ฉด, ํŒŒ์ผ ์ƒ๋‹จ์— ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•˜์—ฌ import ํ•ด์ค€๋‹ค.

์„ค์น˜๊ฐ€ ์ž˜ ๋˜์—ˆ๋‹ค๋ฉด, ์•„๋ฌด๋Ÿฐ ์—๋Ÿฌ ์—†์ด import๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

import Dropdown from 'react-dropdown';
import "react-dropdown/style.css";

๋‘ ๊ฐ€์ง€๋ฅผ ๋ชจ๋‘ import ํ•ด์ค˜์•ผ ํ•œ๋‹ค !

 

์ด๋ ‡๊ฒŒ import๊ฐ€ ์ž˜ ๋˜์—ˆ๋‹ค๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฝ”๋“œ ๋‚ด์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

const options = [
  'one', 'two', 'three'
];
const defaultOption = options[0];
<Dropdown options={options} onChange={this._onSelect} value={defaultOption} placeholder="Select an option" />;

(์œ„ ์ฝ”๋“œ๋Š” ๊ณต์‹ ๋ฌธ์„œ์— ๋‚˜์˜จ ์˜ˆ์ œ์ด๋‹ค !)

 

 

3. ์ปค์Šคํ…€ ํ•˜๊ธฐ !!

์œ„ ์ด๋ฏธ์ง€๋Š” ๋‚ด๊ฐ€ ์ปค์Šคํ…€ํ•ด์„œ ๋งŒ๋“  ๊ฒฐ๊ณผ๋ฌผ์ด๋‹ค.

 

์ปค์Šคํ…€์„ ํ•˜์ง€ ์•Š์œผ๋ฉด, ๊ธฐ๋ณธ ๋””์ž์ธ์œผ๋กœ ๋ณด์—ฌ์ง„๋‹ค.

๊ทธ๋Ÿผ ์–ด๋–ป๊ฒŒ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ปค์Šคํ…€ ํ•˜์˜€๋Š”์ง€ ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณด์ž !!

 

 

3-1. ๋“œ๋กญ๋ฐ•์Šค ์ž์ฒด๋ฅผ ์ปค์Šคํ…€ํ•˜๋ ค๋ฉด,

 

์—ฌ๊ธฐ์—์„œ ๋“œ๋กญ๋ฐ•์Šค ์ž์ฒด๋ž€, ์•„๋ž˜์™€ ๊ฐ™์€ ์ด๋ฏธ์ง€์ด๋‹ค. ์ฆ‰, ๋ฐ•์Šค๊ฐ€ ์—ด๋ฆฌ์ง€ ์•Š์€, ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š์•˜์„ ๋•Œ ๋ณด์—ฌ์ง€๋Š” ๋ถ€๋ถ„์ด๋‹ค.

ํ˜„์žฌ ๋‚ด๊ฐ€ ์ค€ ์ปค์Šคํ…€์€, ๋ฐฐ๊ฒฝ์ƒ‰, ํฐํŠธ ํฌ๊ธฐ, ๋ฐ•์Šค border-radius, ๋†’์ด, ๋„ˆ๋น„๊ฐ€ ์žˆ๋‹ค.

์ด๋Ÿฌํ•œ ์†์„ฑ๋“ค์„ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•˜๋ฉด ๋œ๋‹ค.

์•— ์ฐธ๊ณ ๋กœ ๋‚˜๋Š” styled component๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

const StyledDropdown = styled(Dropdown)`
  .Dropdown-control {
    background-color: ${theme.colors.secondBlack};
    color: white;
    border-radius: 5px;
    border-color: transparent;
    width: 110px;
    height: 32px;
    font-size: 13px;
  }
`;

์ด๋ ‡๊ฒŒ .Dropdown-control์„ ๊ฐ€์ ธ์™€ ํ•ด๋‹น ์†์„ฑ์— ์ ‘๊ทผํ•ด ์ˆ˜์ •ํ•˜๋ฉด ๋œ๋‹ค.

 

 

3-2. ๋“œ๋กญ๋ฐ•์Šค๋ฅผ ์—ด์—ˆ์„ ๋•Œ ๋ณด์—ฌ์ง€๋Š” ๋ฉ”๋‰ด๋ฅผ ์ปค์Šคํ…€ ํ•˜๋ ค๋ฉด,

 

๋“œ๋กญ๋ฐ•์Šค๋ฅผ ํด๋ฆญํ•˜์—ฌ ์—ด๋ฆฌ๋Š” ๋ฉ”๋‰ด๋“ค์„ ์ปค์Šคํ…€ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ?

 

์ด๋ ‡๊ฒŒ ๋‚˜๋Š” ๋ฉ”๋‰ด์˜ ๋ฐฐ๊ฒฝ ์ƒ‰, ํฐํŠธ ํฌ๊ธฐ, ํฐํŠธ ์ƒ‰ ๋“ฑ์„ ์ง€์ •ํ•˜์˜€๋‹ค.

๋“œ๋กญ๋ฐ•์Šค ๋ฉ”๋‰ด๋ฅผ ์ปค์Šคํ…€ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•˜๋ฉด ๋œ๋‹ค.

.Dropdown-menu {
    background-color: ${theme.colors.secondBlack};
    color: white;
    font-size: 13px;
  }

์ด๋ ‡๊ฒŒ .Dropdown-menu์— ์ ‘๊ทผํ•˜์—ฌ ํ•ด๋‹น ์†์„ฑ๋“ค์„ ์ปค์Šคํ…€ํ•˜๋ฉด ๋œ๋‹ค.

 

 

3-3. ์„ ํƒ๋œ ์˜ต์…˜์„ ์ปค์Šคํ…€ํ•˜๋ ค๋ฉด,

 

๋‚ด๊ฐ€ ์„ ํƒํ•œ ์˜ต์…˜์€ ๋‹ค๋ฅด๊ฒŒ ๋ณด์—ฌ์ ธ์•ผ ํ•œ๋‹ค. 3-2์—์„œ์˜ ์‚ฌ์ง„์„ ๋ณด๋ฉด, ๋‚ด๊ฐ€ ์„ ํƒํ•œ '์ด๋ฒˆ ์ฃผ'๋Š” ์ƒ‰์ƒ์ด ๋‹ค๋ฅด๊ฒŒ ํ‘œ์‹œ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด์ฒ˜๋Ÿผ ์„ ํƒํ•œ ์˜ต์…˜์— ๋Œ€ํ•œ ์†์„ฑ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋œ๋‹ค.

.Dropdown-option.is-selected {
    color: ${theme.colors.primary};
    background-color: ${theme.colors.secondBlack};
    font-size: 13px;
  }

์ด๋ ‡๊ฒŒ .Dropdown-option.is-selected์— ์ ‘๊ทผํ•˜์—ฌ ์„ ํƒํ•œ ์˜ต์…˜์— ๋Œ€ํ•œ ๋””์ž์ธ์„ ์ปค์Šคํ…€ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

3-4. ๋งˆ์ง€๋ง‰์œผ๋กœ, ๋‚˜๋จธ์ง€ ์˜ต์…˜๋“ค์„ ์ปค์Šคํ…€ํ•˜๋ ค๋ฉด,

์ด ๋ถ€๋ถ„์€ 3-2 ๋ถ€๋ถ„์—์„œ ์ด๋ฏธ ์„ค์ •ํ•ด์ฃผ์—ˆ๋‹ค ์ƒ๊ฐํ–ˆ์œผ๋‚˜, ๋”ฐ๋กœ ๋˜ ํ•ด์ค˜์•ผ ์ ์šฉ์ด ๋˜์—ˆ๋‹ค.

3-2, 3-4 ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์ฃผ์„์ฒ˜๋ฆฌํ•˜๋ฉด ์ด๋ ‡๊ฒŒ ๋œ๋‹ค..

์„ ํƒ๋œ ์˜ต์…˜์ด ์•„๋‹Œ ๋‚˜๋จธ์ง€ ์˜ต์…˜๋“ค์„ ์ปค์Šคํ…€ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•˜์˜€๋‹ค.

.Dropdown-option {
    color: ${theme.colors.white};
    font-size: 13px;
  }

์ด๋ ‡๊ฒŒ .Dropdown-option์— ์ ‘๊ทผํ•˜์—ฌ ํ•ด๋‹น ์†์„ฑ๋“ค์„ ์„ค์ •ํ•ด์ฃผ์—ˆ๋‹ค.

 

 

4. ์ •๋ฆฌํ•˜๋ฉด,

 

์ด๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‚˜๋Š” styled component๋ฅผ ์‚ฌ์šฉํ•˜์˜€๊ธฐ์— ์ด๋ ‡๊ฒŒ ๋ฐฑํ‹ฑ ์•ˆ์— ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค.

const StyledDropdown = styled(Dropdown)`
  .Dropdown-control {
    background-color: ${theme.colors.secondBlack};
    color: white;
    border-radius: 5px;
    border-color: transparent;
    width: 110px;
    height: 32px;
    font-size: 13px;
  }
  .Dropdown-menu {
    background-color: ${theme.colors.secondBlack};
    color: white;
    font-size: 13px;
  }
  .Dropdown-option.is-selected {
    color: ${theme.colors.primary};
    background-color: ${theme.colors.secondBlack};
    font-size: 13px;
  }
  .Dropdown-option {
    color: ${theme.colors.white};
    font-size: 13px;
  }
`;

์‹ค์ œ ์ด ์Šคํƒ€์ผ์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ˜ธ์ถœํ•˜๋ฉด ๋œ๋‹ค.

<StyledDropdown options={options} value={defaultOption} />

 

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณตํ•ด์ฃผ๋Š” dropdown์„ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋””์ž์ธ๋Œ€๋กœ ์ปค์Šคํ…€ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

728x90
๋ฐ˜์‘ํ˜•
728x90
๋ฐ˜์‘ํ˜•

 

728x90

 

๋ฆฌ์—‘ํŠธ.. js, html, css ์ด ์ค‘ ๊ทธ ์–ด๋Š ๊ฒƒ๋„ ๋ฐฐ์šด ์ , ์ ‘ํ•œ ์  ์—†์—ˆ์ง€๋งŒ... ๊ต‰์žฅํžˆ ์งง์€ ์‹œ๊ฐ„์— ๋ฆฌ์—‘ํŠธ๋ฅผ ๊ณต๋ถ€ํ•ด์•ผ๋งŒ ํ–ˆ๋‹ค.

์ฃผ์–ด์ง„ ์‹œ๊ฐ„์— js๋ถ€ํ„ฐ ๋ฐฐ์šฐ๊ณ , ์ฐจ๊ทผ์ฐจ๊ทผ ๊ฐ•์˜๋ฅผ ๋“ค์œผ๋ฉฐ ๊ณต๋ถ€ํ–ˆ๋‹ค.

ํ•˜์ง€๋งŒ.... ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๊ณ , ์‹ค์ „์— ์‚ฌ์šฉํ•˜๊ธฐ์—๋Š” ์ž์‹ ๊ฐ๊ณผ ์ง€์‹์ด ํ„ฑ์—†์ด ๋ถ€์กฑํ–ˆ๋‹ค.

 

์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ๋Œ์•„๋ณด๋ฉด ๊ฑฐ์˜ ์‹ค์ „์— ๋ถ€๋”ชํžˆ๋ฉฐ ๋ฐฐ์› ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

 

๊ทธ ์ค‘ ๋ฆฌ์—‘ํŠธ๋กœ ๋งˆํฌ๋‹ค์šด ์—๋””ํ„ฐ์™€ ๋ทฐ์–ด ๊ตฌํ˜„ํ•˜๋Š” ๋ถ€๋ถ„์„ ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

๋„ˆ๋ฌด๋‚˜ ๋‹คํ–‰ํžˆ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ํฌ์ŠคํŒ…์„ ํ•ด๋‘์—ˆ๊ณ , ๋„ˆ๋ฌด๋‚˜ ํŽธ๋ฆฌํ•œ ํŒจํ‚ค์ง€๊ฐ€ ์žˆ์—ˆ๊ธฐ์— ์•„์ฃผ ์‰ฝ๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

๋ฌผ๋ก  ๋ทฐ์–ด๋ฅผ ํ•˜๋Š” ๊ฒƒ์— ์žˆ์–ด ์•„์ฃผ ์˜ค๋žœ ์‹œ๊ฐ„ ์‚ฝ์งˆ์„ ํ–ˆ๋‹ค๋Š” ๊ฒƒ...์€ ์žŠ์ง€ ๋ชปํ•  ๊ฒƒ ๊ฐ™๋‹ค...ํ•˜ํ•˜

 

1. install

npm i @uiw/react-md-editor

 

2. import

import MDEditor from '@uiw/react-md-editor';

 

3. editor ์‚ฌ์šฉํ•˜๊ธฐ

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

<div className="markarea">
	<div data-color-mode="light">
		<MDEditor height={865} value={mdinfo} onChange={setMD} />
	</div>
</div>

editor ์‚ฌ์šฉ ๊ฒฐ๊ณผ!!

 

 

4. viewer ์‚ฌ์šฉํ•˜๊ธฐ

์‚ฌ์‹ค ์ด ๋ถ€๋ถ„์—์„œ ์‚ฝ์งˆ์„ ๊ฝค ์˜ค๋ž˜ํ–ˆ๋‹ค... ํ•ด๋‹น ํŒจํ‚ค์ง€์— ๋ทฐ์–ด๊ฐ€ ๊ฐ™์ด ์žˆ์—ˆ๋Š”๋ฐ ๊ทธ๊ฑธ ๋ณด์ง€ ๋ชปํ•˜๊ณ  ์ž๊พธ ๋‹ค๋ฅธ viewer ํŒจํ‚ค์ง€๋ฅผ ์ฐพ์•„ ์ ์šฉํ•ด๋ดค๋˜ ๊ฒƒ.... ๊ทธ๋ ‡๋‹ค๋ณด๋‹ˆ ๋งˆํฌ๋‹ค์šด์ด ์ œ๋Œ€๋กœ ๋ณด์—ฌ์ง€์ง€ ์•Š์•˜๋‹ค...

์ด๋ ‡๊ฒŒ .Markdown์„ ์‚ฌ์šฉํ•˜๊ณ , source์— ๋ณด์—ฌ์ฃผ๊ณ  ์‹ถ์€ ๋งˆํฌ๋‹ค์šด String์„ ๊ฐ€์ ธ์˜ค๋ฉด ๋œ๋‹ค!!!

<div className="markdownDiv" data-color-mode="light" style={{padding:15}}>
	<MDEditor.Markdown
		style={{ padding: 10 }}
		source={mkdStr}
    />
</div>

๋งˆํฌ๋‹ค์šด ๋ทฐ์–ด ๊ฒฐ๊ณผ!!

 

์ด๋ ‡๊ฒŒ ์ฒซ ์›น ๊ฒฝํ—˜์ด์ž ๋ฆฌ์—‘ํŠธ ๊ฒฝํ—˜์„ ์„ฑ๊ณต์ ์œผ๋กœ ๋งˆ๋ฌด๋ฆฌํ–ˆ๋‹ค!!!

๋งŽ์€ ์šฐ์—ฌ๊ณก์ ˆ์ด ์žˆ์—ˆ์ง€๋งŒ.. ํŒ€์›๋“ค์ด ์—†์—ˆ๋‹ค๋ฉด.......์ •๋ง....๋‚œ ์•„๋ฌด๊ฒƒ๋„ ํ•  ์ˆ˜ ์—†์—ˆ์„๊ฑฐ๋‹ค...

 

๋ฆฌ์—‘ํŠธ ์กฐ๊ธˆ ๋” ์นœํ•ด์ ธ๋ณด์ž๊ตฌ.. ๋‚ด๊ฐ€ ์ž˜ ํ• ๊ฒŒ...๐Ÿฅน

 

 

 

๋ฐ˜์‘ํ˜•

 

728x90
๋ฐ˜์‘ํ˜•
728x90
๋ฐ˜์‘ํ˜•
728x90

state

props

.

.

 

ํŠน์ • ์ฝ”๋“œ๋“ค์ด ์ฒซ ๋ฒˆ์งธ component render์—์„œ๋งŒ ์‹คํ–‰๋˜๊ฒŒ ํ•˜์ž.

์ฒ˜์Œ ํ•œ ๋ฒˆ๋งŒ..!!

๋‚˜์ค‘์—๋Š” ์ƒํƒœ๊ฐ€ ๋ณ€ํ•ด๋„ ์‹คํ–‰๋˜์ง€ ์•Š๋„๋ก.

์šฐ๋ฆฌ๊ฐ€ state๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ ๋ชจ๋“  code๊ฐ€ ๋‹ค์‹œ ์‹คํ–‰๋œ๋‹ค. 

ํ•˜์ง€๋งŒ ๊ทธ๋Ÿด ํ•„์š”๊ฐ€ ์—†์„ ๊ฒฝ์šฐ!! ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ?

useEffect๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ด useEffect๋Š” ๋‘ ๊ฐœ์˜ argument๋ฅผ ๊ฐ€์ง€๋Š”๋ฐ, ์ฒซ ๋ฒˆ์งธ๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋”ฑ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์€ ์ฝ”๋“œ์ด๋‹ค.

ex) useEffect(function1, [])

๋‘๋ฒˆ์งธ๋Š” ... ๋งˆ๋ฒ•๊ฐ™๋‹ค....?

 

๊ฒฐ๊ตญ, useEffect์— ๋Œ€ํ•ด ๋ฐฐ์› ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ๊ณ„์† ์‹คํ–‰๋˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๊ฒƒ. 

ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰ํ•ด๋„ ๋˜๋Š” ๊ฒƒ๋“ค์„ ๋‹ค๋ฃจ๋Š” ํ•จ์ˆ˜์ด๋‹ค.

 

๋‘ ๋ฒˆ์งธ argument๋Š”..

์ด๋Ÿด ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ํŠน์ •ํ•œ ๋ถ€๋ถ„์ด ๋ณ€ํ–ˆ์„ ๋•Œ๋งŒ ๋‹ค์‹œ ์ฐํžˆ๋„๋ก ํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ!

์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฒ€์ƒ‰ ์ฐฝ์—์„œ ๋ฌธ์ž๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ , ๊ฒ€์ƒ‰ ์•„์ด์ฝ˜์„ ๋ˆ„๋ฅธ๋‹ค๋ฉด ๊ฐ™์€ ๋‹จ์–ด๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ๊ทธ ์ƒํƒœ์—์„œ ๋ฒ„ํŠผ์„ ์—ฌ๋Ÿฌ๋ฒˆ ํด๋ฆญํ•˜๋ฉด ํด๋ฆญ ํ•  ๋•Œ๋งˆ๋‹ค ์ƒํƒœ๊ฐ€ ๋ณ€ํ•œ๋‹ค. ์ฆ‰, ํ…์ŠคํŠธ ํ•„๋“œ๋Š” ๋ณ€ํ•˜์ง€ ์•Š์ง€๋งŒ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €๊ธฐ ๋•Œ๋ฌธ์— ๊ณ„์† ์ฐ์–ด๋‚ด๋Š” ๊ฒƒ์ด๋‹ค.

๋ฒ„ํŠผ์„ ๋ˆ„๋ฆ„์œผ๋กœ์จ counter๊ฐ€ ๋ณ€ํ™”ํ•  ๋•Œ๋„ ์˜ํ™”๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

์ด ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค.

useEffect(() => {
 console.log("SEARCH FOR", keyword); //keyword๊ฐ€ ๋ณ€ํ™”ํ•  ๋•Œ๋งŒ ์‹คํ–‰๋œ๋‹ค.
}, [keyword]);

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด keyword๊ฐ€ ๋ณ€ํ™”ํ•  ๋•Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ๊ฑฐ๋ผ๊ณ  react.js์—๊ฒŒ ์•Œ๋ ค์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

 

์šฐ๋ฆฌ๊ฐ€ ๋‘ ๋ฒˆ์งธ argument๋ฅผ []๋กœ ๋น„์›Œ๋’€์„ ๋•Œ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋๋˜ ์ด์œ ๋Š” ๋น„์–ด์žˆ์œผ๋ฏ€๋กœ ์ง€์ผœ๋ณผ ๋ณ€ํ™”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ฆ‰, ๋‘ ๋ฒˆ์งธ argument๋ฅผ ์ฑ„์šฐ๋ฉด, 'ํ•ด๋‹น argument๊ฐ€ ๋ณ€ํ™”ํ•˜๋Š”์ง€ ์ง€์ผœ๋ด์ค˜' ๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค.

 


๋ณต์Šต!!!!

๋ฆฌ์—‘ํŠธ์—์„œ๋Š” ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์˜ฌ ๋•Œ๋งˆ๋‹ค UI๋ฅผ refresh ํ•œ๋‹ค๋Š” ํŠน์ง•์ด ์žˆ๋‹ค.

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ ํ•˜์ง€ ์•Š์•„๋„ ๋˜๋ฏ€๋กœ ํŽธํ•˜๋‹ค.

ํ•˜์ง€๋งŒ! ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์€ ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ, ํ˜น์€ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ! ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ•˜๋Š”๊ฐ€!!

์ด ๋•Œ useEffect๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.
์ด ํ•จ์ˆ˜๋Š” ๋‘ ๊ฐœ์˜ argument๋ฅผ ๊ฐ–๋Š”๋ฐ,

์ฒซ ๋ฒˆ์งธ argument๋Š” ์šฐ๋ฆฌ๊ฐ€ ์‹คํ–‰์‹œํ‚ค๊ณ  ์‹ถ์€ ์ฝ”๋“œ์ด๊ณ ,

๋‘ ๋ฒˆ์งธ argument๋Š” dependencies๋ผ๊ณ  ๋ถˆ๋ฆฐ๋‹ค. ์ด๋Š” react.js๊ฐ€ ์ง€์ผœ๋ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด๊ฒƒ์ด ๋ณ€ํ™”ํ•  ๋•Œ ์ฒซ ๋ฒˆ์งธ argument๋ฅผ refresh ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. 

 ๋‘ ๋ฒˆ์งธ argument๋Š” array์ด๋ฏ€๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ component๋ฅผ ๋„ฃ์–ด๋„ ๋œ๋‹ค.

 

๊ฒฐ๋ก 

useEffect๋Š” ์›ํ•˜๋Š” state์ด ๋ณ€ํ•  ๋•Œ๋งŒ ์›ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค!!

react.js๋Š” ๋ณ€ํ™”๊ฐ€ ์žˆ์„ ๋•Œ๋งˆ๋‹ค refresh ํ•˜๋Š”๋ฐ, useEffect๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์›ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ refresh ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

[ ํ•„์ˆ˜๋Š” ์•„๋‹ˆ์ง€๋งŒ, ์ž์ฃผ ์“ฐ์ด๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ]

Cleanup function

์ด ํ•จ์ˆ˜๋Š” ๊ทธ๋ƒฅ ํ•จ์ˆ˜์ธ๋ฐ, ์šฐ๋ฆฌ์˜ component๊ฐ€ destroy๋  ๋•Œ ๋ญ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

Cleanup function์€ ๋”ฐ๋กœ ์ด ์ด๋ฆ„์˜ ํ•จ์ˆ˜๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ useEffect์—์„œ component๊ฐ€ ์—†์–ด์งˆ ๋•Œ ๋ฌด์–ธ๊ฐ€๋ฅผ returnํ•˜๋Š” ๊ฒƒ.

์ด๋Š” component๊ฐ€ ์—†์–ด์งˆ ๋•Œ ์–ด๋–ค ๋ถ„์„ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋‚ด๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด ์–ธ์ œ component๊ฐ€ create ๋๋Š”์ง€, ์–ธ์ œ destroy ๋๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

function Hello() {
 function byFn() {
  console.log("bye :(");
 }
 function hiFn() {
  console.log("created :)");
  return byFn; // React.js๊ฐ€ hiFn์„ ์‹คํ–‰ํ•˜๊ณ , hiFn์ด ํŒŒ๊ดด๋  ๋•Œ byFn์„ ์‹คํ–‰ํ•œ๋‹ค.
 }
 useEffect(hiFn, []);
 return <h1>Hello</h1>;
}

 

๋ฌผ๋ก  ๋ฌธ์ž ๊ทธ๋Œ€๋กœ ์ ์„ ์ˆ˜๋„ ์žˆ๋‹ค.

function Hello() {
 useEffect(() => {
  console.log("hi :)");
  return () => console.log("bye :(");
 }, []);

 useEffect(function () {
  console.log("hi :)");
  return function() {
   console.log("bye :(");
  };
 }, []);
 return <h1>Hello</h1>;
}

 

728x90
๋ฐ˜์‘ํ˜•

+ Recent posts