최근 검색한 keyword를 Searchinput아래에 표시되도록 만들고, 해당 영역에 표시된 특정 키워드를 누르면 그 키워드로 검색이 일어나도록 만듭니다. 단, 가장 최근에 검색한 5개의 키워드만 노출되도록 합니다.
구현해보기
// SearchInput 컴포넌트 하위에 배치
class KeywordHistory {
$keywordHistory = null;
data = null;
constructor({ $target, onSearch }) {
const $KeywordHistory = document.createElement('ul');
this.$KeywordHistory = $KeywordHistory;
this.$KeywordHistory.className = 'KeywordHistory';
$target.appendChild(this.$KeywordHistory);
this.data = [
'아',
'고양이',
'cat',
];
this.onSearch = onSearch;
this.render();
}
render() {
this.$KeywordHistory.innerHTML = this.data
.map(
keyword => `
<li><button>${keyword}</button></li>
`
).join('');
this.$KeywordHistory.querySelectorAll('li button').forEach(
($item, index) => {
$item.addEventListener('click', () => {
console.log(this.data[index]);
this.onSearch(this.data[index]);
});
});
init() {
let dummy = [
'아',
'고양이',
'cat',
];
this.setState(dummy);
}
setState(nextData) {
this.data = nextData;
this.render();
}
let dummy 부분을 로컬에서 가지고 오면 됨
데이터를 split 통해서 배열로 바꿔준다.
저장하는 부분은 searchinput 컴포넌트에서 작성
어떤시점에 작성을 할까 = 결과를 요청하는 시점, enter 하는 시점
keyup 은 한글일때 2번 요청하는 enter 오류가 난다. (keypress 사용)
처음에 null 값이 오는걸 방지하기 위해서 삼항연산자 적용
수정해야 될 부분
페이지를 새로고침해도 마지막 검색 결과 화면이 유지되도록 처리하기
render() {
this.$searchResult.innerHTML = this.data
.map(
(cat, index) => `
<li class="item" data-index=${index}>
<img src="https://via.placeholder.com/200*300" data-src=${cat.url} alt=${cat.name} />
</li>
`
)
.join("");
// 이미지를 로드한다.
item.target.querySelector('img').src = item.target.querySelector('img').dataset.src;