[React] πŸ”κ²€μƒ‰ κΈ°λŠ₯ κ΅¬ν˜„ν•˜κΈ°

μ΄λ‹€μ˜Β·2024λ…„ 7μ›” 4일

React

λͺ©λ‘ 보기
13/31

πŸ” 검색기λŠ₯

  • 동물 λ¦¬μŠ€νŠΈμ—μ„œ 검색어와 λ§žλŠ” λ™λ¬Όλ§Œ 화면에 필터링 되게 ν•˜κΈ°
    검색어와 μΌμΉ˜ν•˜λŠ” 동물 μš”μ†Œλ§Œ 필터링 ν•΄μ£Όκ³ , ν•„ν„°λ§λœ λ‚΄μš©μ„ λ Œλ”λ§

πŸ” μ „μ²΄μ½”λ“œ

//App.jsx

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

// 1. 리슀트 λ§Œλ“€κΈ°
// 2. 검색어에 맞게 동물을 ν•„ν„°λ§ν•˜κΈ°

function App() {
  const items = ["κ°•μ•„μ§€", "고양이", "토끼", "μ›μˆ­μ΄", "νŒλ‹€"]; //동물 리슀트
  const [animals, setAnimals] = useState(""); //μ‚¬μš©μžκ°€ μž…λ ₯ν•œ λ‚΄μš©
  const [search, setSearch] = useState(items); //검색어에 λŒ€ν•œ ν•„ν„°λ‚΄μš©

  useEffect(() => {
    if (animals === "") { //μ‚¬μš©μžκ°€ μž…λ ₯ν•œ 데이터가 λΉ„μ–΄μžˆλ‹€λ©΄ (null 적어도 λœλ‹€)
      setSearch(items); // μ „μ²΄λ¦¬μŠ€νŠΈ λ Œλ”λ§ 
    } else {
      setSearch(items.filter((animal) => animal.includes(animals))); //μ•„λž˜ μ„€λͺ… μ°Έκ³ 
    }
  }, [animals]); //μ‚¬μš©μžκ°€ μž…λ ₯ν•œ 값이 λ³€κ²½ 될 λ•Œλ§Œ λ¦¬λ Œλ”λ§λ¨ 

  const onChange = (e) => {
    setAnimals(e.target.value); 
  };

  return (
    <div className="App">
      <h3>검색 κΈ°λŠ₯</h3>
      <input
        type="text"
        placeholder="검색어λ₯Ό μž…λ ₯ν•˜μ„Έμš”"
        onChange={onChange}
      />
      <ul>
        {search.map((animal) => (
          <li key={animal}>{animal}</li>
        ))}
      </ul>
    </div>
  );
}

export default App;

κΈ°λŠ₯을 κ΅¬ν˜„ν•  λ•ŒλŠ” μ½”λ“œλ₯Ό λ°”λ‘œ μž‘μ„±ν•˜λŠ” 것보닀 κ΅¬ν˜„ ν•  μˆœμ„œλ‚˜ λ‚΄μš©μ„ κΈ€λ‘œ λ¨Όμ € μž‘μ„±ν•΄λ³΄κ³ , 흐름을 νŒŒμ•…ν•œ λ‹€μŒμ— μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ„œ λ§Œλ“œλŠ” 게 더 νŽΈν•˜κ²Œ κ΅¬ν˜„ν•  수 μžˆλ‹€

πŸ’‘ 검색기λŠ₯ λ‚΄μš© 정리

  1. 리슀트 λ§Œλ“€κΈ°
  2. 검색어에 맞게 동물을 ν•„ν„°λ§ν•˜κΈ°

πŸ’‘ 이해가 ν•„μš”ν–ˆλ˜ λΆ€λΆ„

  • 동물 리슀트λ₯Ό μƒμˆ˜λ‘œ items 배열을 λ§Œλ“€μ—ˆλ‹€ μ΄λ•Œ μ£Όμ˜ν•  점은 items의 λ°μ΄ν„°λŠ” 고정이 λ˜μ–΄μžˆμ–΄μ•Ό ν•œλ‹€. 값이 λ³€κ²½λ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— useStateλ₯Ό μ“°λŠ” 게 μ•„λ‹ˆλΌ constλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

  • items 배열은 λ‚˜μ—΄λ˜μ–΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— map ν•¨μˆ˜λ₯Ό μ‚¬μš©ν–ˆλ‹€ map으둜 λ°˜λ³΅μƒμ„±μ„ ν•  λ•Œμ—λŠ” 무쑰건 map을 돌릴 값이 λ°°μ—΄μ΄μ—¬μ•Όλ§Œ ν•œλ‹€ map λŒλ¦¬λŠ” μš”μ†Œμ˜ μ΄ˆκΈ°κ°’μ΄
    ❗배열이 아닐 κ²½μš°μ—λŠ” 였λ₯˜κ°€ λ‚œλ‹€.❗

  • items둜 λ°˜λ³΅μƒμ„±μ„ ν•˜μ§€ μ•Šμ€ μ΄μœ λŠ” μ•žμ—μ„œ λ§ν•œ 것과 λ‚΄μš©μ΄ λ™μΌν•˜λ‹€. items의 배열은 고정값이닀. 데이터가 변경이 되면 μ•ˆ 되기 λ•Œλ¬Έμ— search에 μ΄ˆκΈ°κ°’μ„ items둜 λ„£μ–΄μ€˜μ„œ μ‚¬μš©ν–ˆλ‹€

// items 배열에 animals(μ‚¬μš©μžκ°€ μž…λ ₯ν•œ λ™λ¬Όλ“€λ§Œ) 필터링
setSharch(items.filter((animal) => animal.includes(animals)));

μœ„μ— μ½”λ“œλ₯Ό μ„€λͺ…ν•˜μžλ©΄ search μ΄ˆκΈ°κ°’μ—λŠ” items 즉 동물 전체 λ¦¬μŠ€νŠΈκ°€ μžˆλ‹€. 동물 λ¦¬μŠ€νŠΈμ—μ„œ 검색어와 μΌμΉ˜ν•˜λŠ” κ²ƒλ§Œ 필터링을 ν•˜κ²Œ ν•˜λ €λ©΄ search의 값을 λ³€κ²½ν•΄μ„œ 화면에 λ Œλ”λ§ 되게 ν•΄μ•Όν•œλ‹€. κ·Έλž˜μ„œ μƒνƒœλ³€ν™”ν•¨μˆ˜μΈ setSearchλ₯Ό μ‚¬μš©ν•΄μ„œ itemsλ₯Ό 필터링 ν•˜λŠ” 것이닀.
필터링 λ˜λŠ” 쑰건은 animal(λ™λ¬Όλ¦¬μŠ€νŠΈ)μ—μ„œ 검색어와 μΌμΉ˜ν•˜λŠ” λ™λ¬Όλ“€λ§Œ search의 κ°’μœΌλ‘œ 섀정해놓고, ν•„ν„°λ§μ΄λœ λ™λ¬Όλ¦¬μŠ€νŠΈλ₯Ό λ Œλ”λ§λ˜κ²Œ ν•΄μ£ΌλŠ” 것이닀.

짧게 μš”μ•½ν•˜μžλ©΄ 검색어와 μΌμΉ˜ν•˜λŠ” 동물 μš”μ†Œλ§Œ 필터링 ν•΄μ£Όκ³ , ν•„ν„°λ§λœ λ‚΄μš©μ„ λ Œλ”λ§ ν•΄μ£ΌλŠ” 것이닀.

βž• includes()λž€? κ΄„ν˜Έμ•ˆμ— λ“€μ–΄μžˆλŠ” 것이 λ°°μ—΄μ•ˆμ— μžˆλŠ” μ§€ μ—†λŠ” μ§€ Boolean 즉 true/false둜 μ•Œλ €μ€€λ‹€. μ € μ½”λ“œμ—μ„œ μ•Œμˆ˜ μžˆλŠ” 것은 animal은 κ³§ items이기 λ•Œλ¬Έμ— itmesμ•ˆμ—μ„œ μ‚¬μš©μžκ°€ μž‘μ„±ν•œ 데이터가 μžˆλŠ” μ§€ μ—†λŠ” μ§€ μ°Ύμ•„μ£ΌλŠ” 것을 μ•Œ 수 μžˆλ‹€.


2024-09-09 검색기λŠ₯ μΆ”κ°€ λ‚΄μš©

검색 κΈ°λŠ₯ κ΅¬ν˜„ν•˜λŠ” 것을 μ•ˆ 보고 λ‹€μ‹œ λ§Œλ“€μ–΄ λ΄€λ‹€. μ˜λ„ν•˜μ§„ μ•Šμ•˜μ§€λ§Œ λ‹€μ‹œ λ§Œλ“€κ³  λ³΄λ‹ˆ μœ„μ— μ½”λ“œλž‘ 거의 λ˜‘κ°™μ•„μ„œ μΆ”κ°€λœ λ‚΄μš©λ§Œ 적을것이닀.
μΆ”κ°€λœ λ‚΄μš©μ€ λŒ€λ¬Έμž, μ†Œλ¬Έμž ꡬ뢄 없이 검색 ν•„ν„°κ°€ μž˜λ˜λŠ” μ§€ 확인해보고 μ‹Άμ–΄μ„œ listμ•ˆμ— item듀을 λŒ€λ¬Έμžμ™€ μ†Œλ¬Έμžλ₯Ό μ„žμ–΄μ„œ λ„£μ—ˆλ‹€.

toLowerCase()

ν•΄λ‹Ή λ¬Έμžμ—΄μ„ μ†Œλ¬Έμžλ‘œ λ³€ν™˜ν•΄μ„œ λ°˜ν™˜ν•˜λŠ” λ©”μ„œλ“œμ΄λ‹€. 이 λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•œ μ΄μœ λŠ” list에 λŒ€λ¬Έμžμ™€ μ†Œλ¬Έμžκ°€ μ„žμ—¬ μžˆμ„ 경우, λŒ€μ†Œλ¬Έμž ꡬ뢄 없이 ν•„ν„°λ§λœ 검색 κ²°κ³Όλ₯Ό λ³΄κ³ μ‹Άμ–΄μ„œμ΄λ‹€.

μž‘λ™ν•˜λŠ” μ›λ¦¬λŠ” λ¦¬μŠ€νŠΈμ— μžˆλŠ” λ¬Έμžμ—΄μ„ 검색할 λ•Œλ§ˆλ‹€ μ†Œλ¬Έμžλ‘œ λ³€κ²½ν•΄μ„œ λ°˜ν™˜ν•˜λ©΄ μ‚¬μš©μžκ°€ 아무리 λŒ€μ†Œλ¬Έμžλ₯Ό ꡬ뢄없이 적어도 검색 κΈ°λŠ₯이 μΌκ΄€λ˜κ²Œ 잘 μž‘λ™λ˜λŠ” 것을 μ•Œ 수 μžˆλ‹€.

검색 ν•„ν„° μΆ”κ°€λœ μ½”λ“œ

function App() {
  const searchList = [
    "Life Cycle",
    "event bubbling",
    "μ •κ·œν‘œν˜„μ‹",
    "Git",
    "검색기λŠ₯",
  ];
  const [searchListCopy, setSearchListCopy] = useState(searchList);
  const [searchInput, setSearchInput] = useState("");

  useEffect(() => {
    if (searchInput === "") {
      setSearchListCopy(searchList);
    } else {
      const lowerCaseInput = searchInput.toLowerCase();
      setSearchListCopy(
        searchList.filter((filteredItem) =>
          filteredItem.toLowerCase().includes(lowerCaseInput)
        )
      );
    }
  }, [searchInput]);

  return (
    //...μƒλž΅
  );
}

export default App;

0개의 λŒ“κΈ€