Frontend ๊ฐœ๋ฐœ์ž - hyo.loui

Project: ๐Ÿšฉcodefolio - DropDown, PostTitle / as-is to-be : 1 ๋ณธ๋ฌธ

Project

Project: ๐Ÿšฉcodefolio - DropDown, PostTitle / as-is to-be : 1

hyo.loui 2023. 2. 12. 21:39

๐ŸŽฏ๋ชฉ์  :

DropDown componenet ์ƒ์„ฑ > ๊ฐœ์„ 

PostTitle componenet ์ƒ์„ฑ


1.  DropDown Layout ๋งŒ๋“ค๊ธฐ

 

const DropDown = ({
  defaultValue,
  options,
}: DropDownProps<string | number>) => {
  const handleChange = (e: React.ChangeEvent<HTMLSelectElement>) => {
    e.preventDefault();
  };

  return (
    <Select onChange={handleChange}>
      {options.map((option) => (
        <option key={option} value={option} defaultValue={defaultValue}>
          {option}
        </option>
      ))}
    </Select>
  );
};

export default DropDown;

prop ์œผ๋กœ ์ „๋‹ฌ๋ฐ›์€ 

defaultValue / options ๋ฅผ ํ™œ์šฉํ•ด

select-box๋กœ ๋ณด์—ฌ์ฃผ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค.

 

์ฒ˜์Œ์—” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ€์ ธ์™€์„œ ํ™œ์šฉํ•˜๋ ค๊ณ  ํ–ˆ์œผ๋‚˜,

toast UI select ๋ฐ•์Šค๋Š” next๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๊ณ 

SSR ์ง€์ •์„ ์ง์ ‘ ํ•ด์ค˜์•ผํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์œผ๋กœ ํƒํ•˜์ง€ ์•Š๊ณ 

 

styled componenets ๋ฅผ ์‚ฌ์šฉํ•ด ์ง์ ‘

์Šคํƒ€์ผ์„ ์ง€์ •ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.

 

์œ„ ์ฝ”๋“œ๋ฅผ ์งœ๊ณ  ๋‚˜๋‹ˆ

์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ์žˆ์–ด์„œ ๋ถˆํŽธํ•˜๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์—

์ž ์ด ์˜ค์งˆ ์•Š๊ณ  ๋งˆ์Œ์ด ๋ฌด๊ฑฐ์› ๋‹ค.

๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ง์ ‘ ๋ฐฐ์—ด์„ options์— ์ „๋‹ฌํ•ด์ค˜์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ.

 


2. DropDown component : as-is to-be

/**
 * @example
 * <DropDown data="birth_year" />
 * <DropDown data="careerer" />
 * @TODO ์ปดํฌ๋„ŒํŠธ๋ณ„ ์Šคํƒ€์ผ ๋ถ„๋ฆฌ
 */
const DropDown = ({ data }: DropDownProps) => {
  const [selectValue, setSelectValue] = useState("");

  const options: string[] = [];
  // const thisYears = new Date();
  const years = Array.from(
    { length: new Date().getFullYear() - 1950 + 1 },
    (_, i) => {
      return new Date().getFullYear() - i;
    }
  );
  if (data === "birth_year") {
    years.forEach((year) => options.push(String(year)));
  }
  if (data === "careerer") {
    for (let i = 1; i < 20; i += 1) {
      options.push(`${i}๋…„์ฐจ`);
    }
    options.unshift("์‹ ์ž…");
    options.push("20๋…„์ฐจ ์ด์ƒ");
  }

  const handleChange = (e: React.ChangeEvent<HTMLSelectElement>) => {
    setSelectValue(e.target.value);
  };
  return (
    <Select onChange={handleChange}>
      {options.map((option) => (
        <option key={option} value={option} defaultValue={option}>
          {option}
        </option>
      ))}
    </Select>
  );
};

๊ฐœ์„ ์•ˆ์€ ์ด๋Ÿฌํ–ˆ๋‹ค.

 

๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉํ•˜๊ณ ์‹ถ์€ select box ๋‚ด์šฉ์„ ๋ฐ์ดํ„ฐ prop ์•ˆ์— ์ง€์ •ํ•ด ์ค€๋‹ค๋ฉด

๋‚ด๊ฐ€ ๋งŒ๋“  ์ปดํฌ๋„ŒํŠธ์—์„œ data ๋ฅผ ๊ตฌ๋ถ„ํ•˜์—ฌ options ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋Š”

์นœ์ ˆํ•œ ์ปดํฌ๋„ŒํŠธ ์˜€๋‹ค.

 


3. PostTitle 

const PostTitle = () => {
  const [title, setTitle] = useState("");
  const [subTitle, setSubTitle] = useState("");

  return (
    <TitleContainer>
      <TitleInput
        value={title}
        onChange={(e) => setTitle(e.target.value)}
        placeholder="ํ”„๋กœ์ ํŠธ ์ œ๋ชฉ์„ ์ž…๋ ฅํ•˜์„ธ์š”"
      />
      <SubTitleWrapper>
        <SubTitleInput
          value={subTitle}
          onChange={(e) => setSubTitle(e.target.value)}
          placeholder="์†Œ์ œ๋ชฉ์„ ์ž…๋ ฅํ•˜์„ธ์š”"
        />
      </SubTitleWrapper>
    </TitleContainer>
  );
};

export default PostTitle;

์œ„ ๋ถ€๋ถ„์€ ์ž‘์—…์ค‘์ด๋‹ค!

 

๋ณ„ ๋‚ด์šฉ ์—†์ด title๊ณผ subtitle์˜ text๋ฅผ ๋ฐ›์•„์„œ state๋กœ ๊ฐ€์ง€๊ณ ์žˆ๋Š” ๋‚ด์šฉ์ด๋‹ค.

์ถ”ํ›„ submit ์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌ ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.