ram2 ๐Ÿš—

[react] react-dropdown ์ปค์Šคํ…€ ํ•˜๊ธฐ ๋ณธ๋ฌธ

๐Ÿ–ฅ๏ธ react

[react] react-dropdown ์ปค์Šคํ…€ ํ•˜๊ธฐ

coram22 2024. 1. 15. 00:05
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
๋ฐ˜์‘ํ˜•