npx create-react-app search_bar
practice
폴더에 위 명령어를 사용하여 search_bar
프로젝트 폴더 생성
eslint와 prettier 설정.
users
와 user
총 2개의 components
파일 작성
import { useState, useEffect } from "react";
import { Users } from "./component/users/users";
function App() {
const [users, setUsers] = useState([]);
const [searchField, setSearchField] = useState("");
const [filteredUsers, setFilteredUsers] = useState([]);
useEffect(() => {
fetch("https://jsonplaceholder.typicode.com/users")
.then((response) => response.json())
.then((users) => {
setUsers(users);
});
});
useEffect(() => {
setFilteredUsers(() =>
users.filter((user) => user.name.toLowerCase().includes(searchField.toLowerCase())
)
);
}, [searchField, users]);
return (
<div className="app">
<input
type="search"
placeholder="searchField"
onChange={(e) => setSearchField(e.target.value)}
></input>
<Users users={filteredUsers} />
</div>
);
}
export default App;
class component
를 사용하지 않고 functional component
를 사용하여 hooks
의 useState
와 useEffect
를 적용.
useEffect(() => {
fetch("https://jsonplaceholder.typicode.com/users")
.then((res) => res.json())
.then((users) => {
setUsers(users);
});
}, []);
처음 렌더링 이후에 useEffect에서 유저 데이터를 받아와 setUsers
로 users
의 상태 값을 업데이트 한다.
return (
<div className="app">
<input
type="search"
placeholder="searchField"
onChange={(e) => setSearchField(e.target.value)}
></input>
<Users users={filteredUsers} />
</div>
);
input jsx에 onChange
event를 걸어 input의 내용이 바뀔때마다 searchField 상태 값을 업데이트 한다.
useEffect(() => {
setFilteredUsers(() =>
users.filter((user) => user.name.toLowerCase().includes(searchField.toLowerCase())
)
);
}, [searchField, users]);
처음 받아 온 데이터 users의 이름 값과 input에서 업데이트 된 searchField의 값을 Array.filter
와 String.includes
를 사용하여 searchField를 포함한 내용의 새로운 배열 값을 filteredUsers에 업데이트 해준다.
return (
<div className="app">
<input
type="search"
placeholder="searchField"
onChange={(e) => setSearchField(e.target.value)}
></input>
<Users users={filteredUsers} />
</div>
);
filteredUsers의 상태 값을 Users component props로 전달한다.
import { User } from "../user/user";
export const Users = (props) => {
return (
<div>
{props.users.map((user) => (
<User key={user.id} user={user} />
))}
</div>
);
};
App에서 전달 받은 props.users는 배열 상태로 받아 Array.map
메소드를 사용하여 배열 전체 내용을 하나씩 User component props로 보내 보여준다.
export const User = (props) => {
return (
<div>
<h2>{props.user.name}</h2>
<h4>{props.user.email}</h4>
</div>
);
};
props로 받아온 user의 내용 렌더.