Today Sangmin Learned
article thumbnail
728x90

초기세팅에서 이전에 해뒀던 관련용어 태그 작업을 리팩토링을 진행했다.

기능은 값을 적고 엔터를 누르거나(+콤마, 스페이스바) 버튼을 클릭했을 때 배열에 들어가게 되며, 입력했을 때 이미 배열에 있는 값이라면 추가되지 않게끔 하는 작업이다.

 

원래 바닐라 자바스크립트에서 진행했던 것을 CRA에서 진행을 하게 되었는데, 우선 예전에 해뒀던 것을 토대로 다시 진행했다.

import React, { useState } from "react";
import "./App.css";

const TermRelated = () => {
  const [relatedTerms, setRelatedTerms] = useState([]);
  const [inputTerm, setInputTerm] = useState("");
  const [id, setId] = useState(0);

  const onChange = (e) => setInputTerm(e.target.value);

  const onClick = () => {
    const trimmedInputTerm = inputTerm
      .trim()
      .replace(/[^ㄱ-힣a-zA-Z0-9+#]/gi, "");
    if (!trimmedInputTerm) {
      return;
    }
    const nextRelatedTerms = relatedTerms.concat({
      id: id,
      text: inputTerm.trim().replace(/[^ㄱ-힣a-zA-Z0-9+#]/gi, ""),
    });

    setRelatedTerms(nextRelatedTerms);
    setInputTerm("");
    setId(id + 1);

    console.log(typeof nextRelatedTerms);
    console.log(trimmedInputTerm);
    console.log(nextRelatedTerms);
  };

  const onKeyPress = (e) => {
    if (
      (e.charCode === 188 || e.charCode === 13 || e.charCode === 32) &&
      e.target.value
    ) {
      onClick();
    }
  };

  const onRemove = (id) => {
    const nextRelatedTerms = relatedTerms.filter(
      (relatedTerms) => relatedTerms.id !== id
    );
    setRelatedTerms(nextRelatedTerms);
  };

  const relatedTermsList = relatedTerms.map((relatedTerms) => (
    <li key={relatedTerms.id}>
      {relatedTerms.text}
      <button onClick={() => onRemove(relatedTerms.id)}>X</button>
    </li>
  ));
  return (
    <>
      <input
        value={inputTerm}
        onChange={onChange}
        onKeyPress={onKeyPress}
        maxLength="15"
      />
      <button onClick={onClick}>추가</button>
      <ul id="list_terms">{relatedTermsList}</ul>
    </>
  );
};

export default TermRelated;

지금.. concat으로 모은 배열의 text요소에 접근해야되는데, 그걸 못하고 있다. 근데 금방 해결할 수 있을 것 같다.

해결했다.

  const onClick = () => {
    for (let i = 0; i < relatedTerms.length; i++) {
      if (relatedTerms[i].text === trimmedInputTerm) {
        alert("중복");
        setInputTerm("");
        return;
      }
    }
    const termsArray = relatedTerms.concat({
      id: id,
      text: inputTerm.trim().replace(/[^ㄱ-힣a-zA-Z0-9+#]/gi, ""),
    });
    setRelatedTerms(termsArray);
    setInputTerm("");
    setId(id + 1);
  };

배열 내 딕셔너리 형태로 되어있으므로, 우선 relatedTerms[i]에 접근한 뒤 .text로 딕셔너리 안에 있는 값과 지금 내가 input으로 쓴 값을 비교해서 같을 경우 중복 처리를 하고 아무 일도 일어나지 않게 하였다.

 

 

우선 JS + CRA로 하고, 끝내면 타이핑해서 TS + CRA로 바꿔야겠다. 여기서 더 되면 TS + Next로도 바꿔봐야지,, 근데 이거 보고 있는 거 거의 1년은 된 것 같다. 그때는 그냥 코드 복붙하기 바빴는데, 지금은 그래도 생각이라는 걸 좀 하는구나 하고 느꼈다.

'today i learned' 카테고리의 다른 글

today i learned 7/31  (0) 2021.07.31
today i learned 7/30  (0) 2021.07.30
today i learned 7/29  (0) 2021.07.29
today i learned 7/28  (0) 2021.07.28
today i learned 7/27  (0) 2021.07.27
profile

Today Sangmin Learned

@steadily-worked

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!