css는 생략합니다.
MenuContext
생성 → 이 Context는 MenuProvider에서 생성된 state와 state 함수를 자식들과 공유하기 위해 사용
export const MenuContext = createContext();
const MenuProvider = ({ children }) => {
const [menuSearch, setMenuSearch] = useState('');
const handleSearch = (searchValue) => {
setMenuSearch(searchValue);
};
return (
<MenuContext.Provider value={{ menuSearch, handleSearch }}>
{children}
</MenuContext.Provider>
);
};
export default MenuProvider;
MenuProvider
로 MenuContext
를 제공하고, MealsSummary
, MenuSearch
, AvailableMeals
컴포넌트를 렌더링MenuProvider
를 사용하여 MenuSearch
, AvailableMeals
에서 context를 사용하여 menuSearch
(사용자가 input에 입력한 메뉴 검색값) state와 handleSearch
함수를 사용할 수 있도록 함
const Meals = () => {
const DUMMY_MEALS = [
...
];
return (
<MenuProvider>
<React.Fragment>
<MealsSummary />
<MenuSearch meals={DUMMY_MEALS} />
<AvailableMeals meals={DUMMY_MEALS} />
</React.Fragment>
</MenuProvider>
);
};
export default Meals;
meneSearch
값을 가져온다.menuSearch
가 비어있지 않은 경우에, 즉 여기에 들어있는 것을 포함하는 이름으로 필터링한다.
const AvailableMeals = ({meals}) => {
const { menuSearch } = useContext(MenuContext);
const filteredMenu = menuSearch
? meals.filter((meal) =>
meal.name.toLowerCase().includes(menuSearch.toLowerCase())
)
: meals;
const mealsList = filteredMenu.map((meal) => (
<MealItem
key={meal.id}
id={meal.id}
name={meal.name}
description={meal.description}
price={meal.price}
/>
));
return (
<section className={classes.meals}>
<Card>
<ul>
{mealsList.length === 0 ? <p>너가 선택한 음식은 없다!</p> : mealsList}
</ul>
</Card>
</section>
);
};
export default AvailableMeals;
const MenuSearch =({ meals }) => {
const { handleSearch } = useContext(MenuContext);
const [autoCompleteResults, setAutoCompleteResults] = useState([]);
const handleChange = (e) => {
// 검색 입력 값에 대한 처리
const searchValue = e.target.value;
handleSearch(searchValue);
//입력 값이 없는 경우 자동완성 결과를 비워줌
if (searchValue === '') {
setAutoCompleteResults([]);
return;
}
// 검색 값에 따른 자동완성에 대한 처리
const autoCompleteValue = e.target.value;
const filteredResults = meals.filter((meal) =>
meal.name.toLowerCase().includes(autoCompleteValue.toLowerCase())
);
setAutoCompleteResults(filteredResults);
};
const handleAutoCompleteSelection = (selectedResult) => {
console.log(selectedResult);
// 자동완성 클릭 시 menuSearch에 대한 state 업데이트
handleSearch(selectedResult.name);
}
return (
<div>
<input className={classes.search} type="text" onChange={handleChange} placeholder="메뉴 검색" />
{autoCompleteResults.length > 0 && (
<ul>
{autoCompleteResults.map((result) => (
<li
className={classes.search}
key={result.id}
onClick={() => handleAutoCompleteSelection(result)}
>
{result.name}
</li>
))}
</ul>
)}
</div>
);
};
export default MenuSearch;