안녕하세요

filter 기능 구현: 할 때 목록을 state로 만들 필요는 없다. 본문

유튜브컨텐츠탐색-StelLife

filter 기능 구현: 할 때 목록을 state로 만들 필요는 없다.

sakuraop 2023. 3. 11. 16:29

클릭하면 변경할 옵션을 filterOption state에 저장합니다.

  const [filterOption, setFilterOption] = useState("");

  const handleFilterOptionChange = (option) => {
    setFilterOption(option);
  };
// ...
        <div className="filter">
          <div onClick={() => handleFilterOptionChange("")}>전체</div>
          <div onClick={() => handleFilterOptionChange("option1")}>option1</div>
          <div onClick={() => handleFilterOptionChange("option2")}>option2</div>
        </div>

 

옵션이 변경되면 렌더링할 리스트를 filter 기능을 이용해 구현합니다.

  const filteredVideos = uploadedVideos.filter((video) => {
    if (filterOption === "") {
      return true;
    }
    return video.title.includes(filterOption) || video.description.includes(filterOption);
  });

=> if (filterOption ==="") 일 때는 전체 목록을 반환하고

선택된 option이 있을 때는 filterOption 조건에 따른 목록을 반환합니다. 

 

여기서 크게 깨달은 것은 리스트로 보여줄 목록을 반드시 state로 만들 필요가 없다는 것입니다.

 

 

const NewClip = () => {
  const [uploadedVideos, setUploadedVideos] = useState([]);
  const [filterOption, setFilterOption] = useState("");

  const handleFilterOptionChange = (option) => {
    setFilterOption(option);
  };

  const filteredVideos = uploadedVideos.filter((video) => {
    if (filterOption === "") {
      return true;
    }
    return video.title.includes(filterOption) || video.description.includes(filterOption);
  });

  return (
    <div className="new">
      <div className="title">
        <h2>제목</h2>
        <div className="filter">
          <div onClick={() => handleFilterOptionChange("")}>전체</div>
          <div onClick={() => handleFilterOptionChange("option1")}>option1</div>
          <div onClick={() => handleFilterOptionChange("option2")}>option2</div>
        </div>
      </div>
      <div className="list">
        <ul>
           {filteredVideos.map((video) => {
              const { videoId, channelId, channelTitle, publishedAt, thumbnailsUrl, title, channelThumbnailUrl, description } = video;
              return (
                <li className="clip" key={videoId}>
                // ...
                </li>
              );
            })
          )}
        </ul>
      </div>
    </div>
  );
};

export default NewClip;