지난 map()
메서드를 실습해봤던 몬스터 카드에서 이번엔 filter()
메서드 까지 실습해봤다.
먼저 SearchBox
컴포넌트를 만들고 <input />
태그를 만들어 검색창을 만든다.
//SearchBox 컴포넌트에서 onChange 이벤트에 props로 이벤트핸들러를 전달받는다.
class SearchBox extends Component {
render(){
return (
<input
className="search"
type="search"
placeholder="검색어 입력"
onChange={this.props.handleChange} />
)
}
}
//SearchBox에 props로 넘겨줄 이벤트핸들러 메서드 정의
handleChange = (e) => {
this.setState({
userInput : e.target.value
})
}
// App의 render() 부분
render() {
const { monsters, userInput } = this.state;
const filteredData = monsters.filter((data)=>{
return data.name.toLowerCase().includes(userInput);
})
//SearchBox에서 입력된 데이터가 App의 userInput에 저장된다.
//userInput데이터가 몬스터 name에 포함되어있을때 해당 객체(데이터)를 리턴하는 filter 정의
return (
<div className='App'>
<h1>컴포넌트 재사용 연습!</h1>
<SearchBox handleChange={this.handleChange} />
<CardList monsters={filteredData} />
</div>
);
}
}
소문자 'd' 만 쳤지만 대소문자 구분없이 name에 d를 포함한 카드들이 전부 filter되어 나온다.
filter()
안에서 data.name.toLowerCase()
를 적용했기 때문!
App → SearchBox → App → CardList → Card → App
<SearchBox handleChange={this.handleChange}>
처럼 props로 전달해준다.<input onChange={this.props.handleChange}>
처럼 input
태그에 이벤트핸들러를 props로 받는다.input
태그에 onChange 이벤트가 발생(데이터가 입력되면) App의 state에 userInput에 저장된다.