React Custom Component(2) πŸ“

forhreverΒ·2023λ…„ 2μ›” 22일
0

과제 - React Custom Component πŸ“

4. Tag

input κΈ°λŠ₯ κ΅¬ν˜„

  • input 창에 ν…μŠ€νŠΈλ₯Ό μž…λ ₯ ν›„ Enter ν‚€λ₯Ό λˆ„λ₯΄λ©΄ νƒœκ·Έκ°€ μΆ”κ°€λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€. 마우슀 클릭이 μ•„λ‹Œ Enter ν‚€λ₯Ό 톡해 νƒœκ·Έκ°€ μΆ”κ°€λ˜λ„λ‘ ν•˜λ©°, Enter ν‚€κ°€ 눌리면 νƒœκ·Έλ₯Ό μΆ”κ°€ν•˜λŠ” addTags λ©”μ„œλ“œκ°€ μ‹€ν–‰λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.
  • addTags λ©”μ„œλ“œλŠ” 기본적으둜 νƒœκ·Έλ₯Ό μΆ”κ°€ν•˜λŠ” κΈ°λŠ₯ 이외에 μ•„λž˜ μ„Έ 가지 κΈ°λŠ₯도 μˆ˜ν–‰ν•  수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.
  • 이미 μž…λ ₯λ˜μ–΄ μžˆλŠ” νƒœκ·ΈμΈμ§€ κ²€μ‚¬ν•˜μ—¬ 이미 μž…λ ₯λ˜μ–΄ μžˆλ‹€λ©΄ μΆ”κ°€ν•˜μ§€ 말아야 ν•©λ‹ˆλ‹€.
  • 아무것도 μž…λ ₯ν•˜μ§€ μ•Šμ€ μƒνƒœμ—μ„œλŠ” Enter ν‚€λ₯Ό λˆŒλŸ¬λ„ addTags λ©”μ„œλ“œκ°€ μ‹€ν–‰λ˜μ§€ μ•Šμ•„μ•Ό ν•©λ‹ˆλ‹€.
  • νƒœκ·Έκ°€ μΆ”κ°€λ˜κ³  λ‚˜λ©΄ input 창이 λΉ„μ›Œμ Έμ•Ό ν•©λ‹ˆλ‹€.

μ‚­μ œ κΈ°λŠ₯ κ΅¬ν˜„

  • 기본적으둜 tags λ°°μ—΄ μ•ˆμ˜ λͺ¨λ“  νƒœκ·Έλ“€μ΄ 화면에 보여야 ν•©λ‹ˆλ‹€.
  • νƒœκ·Έ 이름 μ˜†μ— μ‚­μ œ μ•„μ΄μ½˜(x)이 ν‘œμ‹œλ˜λ„λ‘ ν•˜κ³ , μ•„μ΄μ½˜μ„ ν΄λ¦­ν•˜λ©΄ ν•΄λ‹Ή νƒœκ·Έλ₯Ό μ‚­μ œν•˜λŠ” removeTags λ©”μ„œλ“œκ°€ μ‹€ν–‰λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.
  • removeTags λ©”μ„œλ“œκ°€ μ‚­μ œ μ•„μ΄μ½˜(x)이 눌린 νƒœκ·Έλ₯Ό μ‚­μ œν•˜λ„λ‘ removeTags λ©”μ„œλ“œλ₯Ό μ™„μ„±ν•΄μ•Ό ν•©λ‹ˆλ‹€.

Tag κΈ°λŠ₯ κ΅¬ν˜„ μ½”λ“œ

export const Tag = () => {
  const initialTags = ['CodeStates', 'kimcoding'];
  const [tags, setTags] = useState(initialTags);
  const removeTags = (indexToRemove) => {
    // TODO : νƒœκ·Έλ₯Ό μ‚­μ œν•˜λŠ” λ©”μ†Œλ“œλ₯Ό μ™„μ„±ν•˜μ„Έμš”.
    const filter = tags.filter ( (el, index) => index !== indexToRemove);
    setTags(filter);
  };
  const addTags = (event) => {
    // TODO : tags 배열에 μƒˆλ‘œμš΄ νƒœκ·Έλ₯Ό μΆ”κ°€ν•˜λŠ” λ©”μ†Œλ“œλ₯Ό μ™„μ„±ν•˜μ„Έμš”.
    // 이 λ©”μ†Œλ“œλŠ” νƒœκ·Έ μΆ”κ°€ 외에도 μ•„λž˜ 3 가지 κΈ°λŠ₯을 μˆ˜ν–‰ν•  수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.
    // - 이미 μž…λ ₯λ˜μ–΄ μžˆλŠ” νƒœκ·ΈμΈμ§€ κ²€μ‚¬ν•˜μ—¬ 이미 μžˆλŠ” νƒœκ·ΈλΌλ©΄ μΆ”κ°€ν•˜μ§€ 말기
    // - 아무것도 μž…λ ₯ν•˜μ§€ μ•Šμ€ 채 Enter ν‚€ μž…λ ₯μ‹œ λ©”μ†Œλ“œ μ‹€ν–‰ν•˜μ§€ 말기
    // - νƒœκ·Έκ°€ μΆ”κ°€λ˜λ©΄ input μ°½ λΉ„μš°κΈ°
    const inputVal = event.target.value;
    if(event.key === "Enter" && inputVal !== '' && !tags.includes(inputVal)) {
      setTags([...tags, inputVal]);
      event.target.value = '';
    }
  };
  return (
    <>
      <TagsInput>
        <ul id="tags">
          {tags.map((tag, index) => (
            <li key={index} className="tag">
              <span className="tag-title">{tag}</span>
              <span className="tag-close-icon" onClick={ () => removeTags(index)} > x
                {/* TODO :  tag-close-icon이 tag-title 였λ₯Έμͺ½μ— x 둜 ν‘œμ‹œλ˜λ„λ‘ ν•˜κ³ ,
                            μ‚­μ œ μ•„μ΄μ½˜μ„ click ν–ˆμ„ λ•Œ removeTags λ©”μ†Œλ“œκ°€ μ‹€ν–‰λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€. */}
              </span>
            </li>
          ))}
        </ul>
        {/* ν‚€λ³΄λ“œμ˜ Enter 킀에 μ˜ν•΄ addTags λ©”μ†Œλ“œκ°€ μ‹€ν–‰λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€. */}
        <input
          className="tag-input"
          type="text"
          onKeyUp={(e) => addTags(e)}
          placeholder="Press enter to add tags"
        />
      </TagsInput>
    </>
  );
};


1. λ¦¬μ•‘νŠΈμ—μ„œμ˜ 이벀트 핸듀링 πŸ‘†

이벀트 ν•Έλ“€λŸ¬ : μ–΄λ–€ μ΄λ²€νŠΈκ°€ λ°œμƒν–ˆμ„ λ•Œ ν•΄λ‹Ή 이벀트λ₯Ό μ²˜λ¦¬ν•˜λŠ” ν•¨μˆ˜λ₯Ό λ§ν•©λ‹ˆλ‹€. λ˜λŠ” μ΄λ²€νŠΈκ°€ λ°œμƒν•˜λŠ” 것을 계속 λ“£κ³  μžˆλ‹€λŠ” 의미둜 이벀트 λ¦¬μŠ€λ„ˆλΌκ³  λΆ€λ₯΄κΈ°λ„ ν•©λ‹ˆλ‹€.

<button onClick = {activate}> Activate </button> 

λ²„νŠΌμ΄λ‚˜ (a) tagλ₯Ό ν†΅ν•œ 링크 이동 λ“±κ³Ό 같이 주둜 μ‚¬μš©μžμ˜ 행동에 따라 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ λ°˜μ‘ν•΄μ•Ό ν•  λ•Œ 자주 μ‚¬μš©ν•˜λŠ” μ΄λ²€νŠΈμž…λ‹ˆλ‹€.

// ν•¨μˆ˜ μ •μ˜ν•˜κΈ°

return (
  <div>
	...
    <button onClick={() => alert(name)}>Button</button>
	...
  </div>
  );
};

// ν•¨μˆ˜ 자체λ₯Ό μ „λ‹¬ν•˜κΈ°

const handleClick = () => {
  alert(name);
};

return (
  <div>
      ...
    <button onClick={handleClick}>Button</button>
      ...
  </div>
  );
};

2. λ¦¬μŠ€νŠΈμ™€ ν‚€ πŸ”‘

(좜처 : μ†Œν”Œμ˜ 처음 λ§Œλ‚œ λ¦¬μ•‘νŠΈ)

λ¦¬μŠ€νŠΈλŠ” 우리말둜 λͺ©λ‘μ΄λΌλŠ” 뜻, 리슀트λ₯Ό μœ„ν•΄ μ‚¬μš©ν•˜λŠ” μžλ£Œκ΅¬μ‘°λŠ” λ°°μ—΄.
컴퓨터 ν”„λ‘œκ·Έλž˜λ°μ—μ„œλŠ” 같은 μ•„μ΄ν…œμ„ μˆœμ„œλŒ€λ‘œ λͺ¨μ•„놓은 것이 λ¦¬μŠ€νŠΈμ— ν•΄λ‹Ή.
배열은 μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λ³€μˆ˜λ‚˜ 객체λ₯Ό ν•˜λ‚˜μ˜ λ³€μˆ˜λ‘œ 묢어놓은 것.

ν‚€λŠ” μ˜λ‹¨μ–΄λ‘œ μ—΄μ‡ λΌλŠ” 의미, μ—΄μ‡ λŠ” λͺ¨λ‘ 각자 κ³ μœ ν•˜λ‹€.
ν”„λ‘œκ·Έλž˜λ°μ—μ„œμ˜ ν‚€λŠ” 각 κ°μ²΄λ‚˜ μ•„μ΄ν…œμ„ ꡬ뢄할 수 μžˆλŠ” κ³ μœ ν•œ κ°’.

λ¦¬μ•‘νŠΈμ—μ„œ μ•„μ΄ν…œμ„ κ΅¬λΆ„ν•˜κΈ° μœ„ν•œ κ³ μœ ν•œ λ¬Έμžμ—΄, λ¦¬μ•‘νŠΈμ—μ„œμ˜ ν‚€μ˜ 값은 λ¦¬μŠ€νŠΈμ— μžˆλŠ” μ—˜λ¦¬λ¨ΌνŠΈ μ‚¬μ΄μ—λ§Œ κ³ μœ ν•œ 값이면 λ©λ‹ˆλ‹€.

1. ν‚€κ°’μœΌλ‘œ 숫자의 값을 μ‚¬μš©ν•œ 것

const numbers = [1, 2, 3, 4, 5];
const listItems = numbers.map((number) =>
            <li key = {number.toString()}>
                  {number}
            </li>
   );

μ΄λ ‡κ²Œ ν•˜λ©΄ μ§€κΈˆμ²˜λŸΌ numbers λ°°μ—΄μ˜ μˆ«μžλ“€μ΄ μ€‘λ³΅λ˜μ§€ μ•ŠλŠ” κ²½μš°μ—λŠ” μ •μƒμ μœΌλ‘œ μž‘λ™ν•˜μ§€λ§Œ, λ§Œμ•½ numbers 배열에 μ€‘λ³΅λœ μˆ«μžκ°€ λ“€μ–΄μžˆλ‹€λ©΄ 킀값도 μ€‘λ³΅λ˜μ§€ λ•Œλ¬Έμ— κ³ μœ ν•΄μ•Ό ν•œλ‹€λŠ” ν‚€κ°’μ˜ 쑰건이 μΆ©μ‘±λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ 경우 μ‹€ν–‰ν•΄ 보면 킀값이 μ€‘λ³΅λœλ‹€λŠ” κ²½κ³  λ©”μ‹œμ§€κ°€ 좜λ ₯λ©λ‹ˆλ‹€.

2. ν‚€κ°’μœΌλ‘œ idλ₯Ό μ‚¬μš©ν•œ 것

const todoItems = todos.map((todo) =>
            <li key = {todo.id}>
                  {todo.text}
            </li>
   );

id의 의미 μžμ²΄κ°€ κ³ μœ ν•œ κ°’μ΄λΌλŠ” 것이기 λ•Œλ¬Έμ— ν‚€κ°’μœΌλ‘œ μ‚¬μš©ν•˜κΈ°μ— μ ν•©ν•˜λ‹€. μ΄λ ‡κ²Œ idκ°€ μžˆλŠ” κ²½μš°μ—λŠ” 보톡 이 id 값을 ν‚€κ°’μœΌλ‘œ μ‚¬μš©ν•˜κ²Œ λ©λ‹ˆλ‹€.

3. ν‚€κ°’μœΌλ‘œ 인덱슀λ₯Ό μ‚¬μš©ν•œ 것

const todoItems = todos.map((todo, index) => 
            <li key = {index}>
                  {todo.text}
            </li>
   );

이 방법은 map() ν•¨μˆ˜μ—μ„œ λ‘λ²ˆμ§Έ νŒŒλΌλ―Έν„°λ‘œ μ œκ³΅ν•΄ μ£ΌλŠ” 인덱슀 값을 ν‚€κ°’μœΌλ‘œ μ‚¬μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 이 μΈλ±μŠ€λŠ” λ°°μ—΄ λ‚΄μ—μ„œ ν˜„μž¬ μ•„μ΄ν…œμ˜ 인덱슀λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€. 인덱슀 값도 κ³ μœ ν•œ 값이기 λ•Œλ¬Έμ— ν‚€κ°’μœΌλ‘œ μ‚¬μš©ν•΄λ„ λ©λ‹ˆλ‹€. ν•˜μ§€λ§Œ λ°°μ—΄μ—μ„œ μ•„μ΄ν…œμ˜ μˆœμ„œκ°€ λ°”λ€” 수 μžˆλŠ” κ²½μš°μ—λŠ” ν‚€κ°’μœΌλ‘œ 인덱슀λ₯Ό μ‚¬μš©ν•˜λŠ” 것을 ꢌμž₯ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ„±λŠ₯에 뢀정적인 영ν–₯을 끼칠 수 있고 μ»΄ν¬λ„ŒνŠΈμ˜ state와 κ΄€λ ¨ν•˜μ—¬ 문제λ₯Ό μΌμœΌν‚¬ 수 도 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€. 참고둜 λ¦¬μ•‘νŠΈμ—μ„œλŠ” ν‚€λ₯Ό λͺ…μ‹œμ μœΌλ‘œ λ„£μ–΄ 주지 μ•ŠμœΌλ©΄ 이 인덱슀 값을 ν‚€κ°’μœΌλ‘œ μ‚¬μš©ν•©λ‹ˆλ‹€.


였늘 ν•™μŠ΅μ„ 마치고 λ‚˜μ„œ, πŸ“–

]μ˜€λŠ˜μ€ μ–΄μ œ ν•˜μ§€ λͺ»ν–ˆλ˜ Tag κ΅¬ν˜„μ„ λ§ˆμ € ν•˜κ³  λ‚œ ν›„, μ–΄λ“œλ°΄μŠ€ autocompleteλ₯Ό 해보렀고 μ‹œλ„ν–ˆμ§€λ§Œ μ‹€νŒ¨ν–ˆλ‹€. μΆ”κ°€μ μœΌλ‘œ μ˜€ν›„ 개인 ν•™μŠ΅ μ‹œκ°„μ— λ§ˆμ € ν•΄λ³Ό μ˜ˆμ •μ΄λ‹€. Tag κ΅¬ν˜„ λΈ”λ‘œκΉ…μ„ ν•˜κ³  λ‚œ ν›„ μ‹œκ°„μ΄ 남아 λ¦¬μ•‘νŠΈ 책에 리슀트, 킀에 λŒ€ν•œ 자료λ₯Ό 보고 κ³΅λΆ€ν•˜λ©° λΈ”λ‘œκΉ…ν•˜μ˜€λ‹€. κ³Όμ œμ—μ„œ κ΅¬ν˜„ν–ˆλ˜ <li key ~> 뢀뢄을 더 곡뢀해 보고 μ‹Άμ—ˆκΈ° λ•Œλ¬Έμ΄λ‹€. 그리고 개인 ν•™μŠ΅ μ‹œκ°„μ— λ―Έλ‹ˆ ν”„λ‘œμ νŠΈλ₯Ό ν•˜λ‚˜ λ§Œλ“€μ–΄λ³΄λ €κ³  μ‹œμž‘ν–ˆλ‹€. λΈ”λ‘œκ·Έ λ§Œλ“€κΈ°μ΄λ©° 'λ¦¬μ•‘νŠΈλ₯Ό λ‹€λ£¨λŠ” 기술' μ±… λ§ˆμ§€λ§‰μ— ν”„λ‘œμ νŠΈ μ„€λͺ…이 μžˆμ–΄μ„œ κ·Έκ±° λ³΄λ©΄μ„œ λ§Œλ“€μ–΄ λ³Ό μ˜ˆμ •μ΄λ‹€.

profile
개발자 μ„±μž₯ 계단 μ˜¬λΌκ°€κΈ°

0개의 λŒ“κΈ€