codestates / codestates/underTheSea

[✍️ Dev Log] 송다영 / 2022-01-18


Open
#124 0 comments 0 reactions 1 assignee Claimed by @songdayoung1 View on GitHub
Bare Minimum Client Sprint 2 Sprint 3
Dominant language
JavaScript
Stars
0
Forks
5
PR merge metrics
No merged PRs in 30d

Description

### 오늘은 어떻게 프로젝트에 기여했나요?

- Searching.js 의 검색창 구현하기
- 헤더의 검색을 누르면 검색창과 기본 물고기 정보 카드 6개가 보여지고 검색에 따라 상태가 변경된다.
- 처음의 구현은 하나의 물고기 정보를 받아와서 검색할 수 있게 하였는데 사용자 입장에서 사용하기에는
물고기의 이름이 다소 어렵고 어떤 걸 검색해야할지 모를 것 같아 자동완성을 추가하고자 하였다.

### 오늘의 프로젝트에서 힘든 점은 무엇인가요?

- JS로 자동완성을 구현하고자 하였는데 filter된 자동완성의 이름을 전부 다 검색되어져서 한 마리의 물고기 정보를 가져오는 Api를
Back-end에게 요청하고 수정하였으나 가독성이 떨어졌다.
- 그 이후에 datalist 태그를 알게 되었고 검색한 물고기 정보를 map으로 돌려 사용자가 사용하기 쉬운 자동완성 기능과 검색창을 구현하였다.
(따로 자동완성의 dropdown 컨테이너를 안만들어도 된다.)

```js
---> 처음의 코드 Search.js

const [search, setSearch] = useState(); //인풋 창에 들어갈 검색 text
const [fish, setFish] = useState([]); // 검색 전 기본적으로 보여주는 6개의 추천 물고기
const [options, setOptions] = useState([]); // 60개의 물고기 이름리스트
const [filteredOptions, setFilteredOptions] = useState([]); //매칭된 물고기 이름
const [fish2, setFish2] = useState([]); // 60개의 물고기 정보리스트
const [filteredOptions2, setFilteredOptions2] = useState([]); //매칭된 물고기 정보
//==================================================================
const [currentFish, setCurrentFIsh] = useState(false); //추천, 현재 상태
const [selected, setSelected] = useState(-1);
const [hasText, setHasText] = useState(false); //인풋값 유무를 확인

......(중간 생략)

// 인풋 드랍다운 ===========================================================

const handleInputChange = (event) => {
const { value } = event.target;
if (value.includes("\\")) return;

// input에 텍스트가 있는지 없는지 확인하는 코드
value ? setHasText(true) : setHasText(false);
setSearch(value);

// dropdown을 위한 기능
const filterRegex = new RegExp(value, "i");

const resultOptions = options.filter((option) => option.match(filterRegex));
const testOptions = fish2.filter((fish) =>
fish.fish_name.match(filterRegex)
);

setFilteredOptions2(testOptions); //인풋창 안에서 작성된 물고기 이름과 매치하는 정보를 보여준다.
setFilteredOptions(resultOptions); // 인풋창 안에서 작성된 문자가 포함되어 있는 물고기의 이름만 보여준다.
};

const handleDropDownClick = (clickedOption) => {
setSearch(clickedOption);

const resultOptions = options.filter((option) => option === clickedOption);
// console.log(resultOptions, "=========");
setOptions(resultOptions);
};

const handleDeleteButtonClick = () => {
setSearch("");
};

const handleKeyUp = (event) => {
// eslint-disable-next-line

if (
event.getModifierState("Fn") ||
event.getModifierState("Hyper") ||
event.getModifierState("OS") ||
event.getModifierState("Super") ||
event.getModifierState("Win")
)
return;
if (
event.getModifierState("Control") +
event.getModifierState("Alt") +
event.getModifierState("Meta") >
1
)
return;
if (hasText) {
if (event.code === "ArrowDown" && options.length - 1 > selected) {
setSelected(selected + 1);
}
if (event.code === "ArrowUp" && selected >= 0) {
setSelected(selected - 1);
}
if (event.code === "Enter" && selected >= 0) {
handleDropDownClick(options[selected]);
setSelected(-1);
}
}
};

return (




×


Search

{hasText ? (

) : null}
)

//변경된 코드
// 복잡한 코드는 datalist 태그를 통해 간편하게 변경되었다.

const [fish, setFish] = useState([]); //첫 랜딩될 화면 페이지
const [allFish, setAllFish] = useState([]); // 60개의 물고기 정보값
const [filteredFish, setFilteredFish] = useState([]); //매치된 이름을 통해 정보가 필터링 되어서 들어온다. [{}{}]
//==================================================================
const [currentFish, setCurrentFIsh] = useState(false); //추천, 현재 상태
const [hasText, setHasText] = useState(false); //인풋값 유무를 확인
//==================================================================
const [input, setInput] = useState();
const [fishList, setFishList] = useState([]); //물고기 이름 리스트

...(중간 생략)

// 인풋창
const handleInputChange = (event) => {
const { value } = event.target;
if (value.includes("\\")) return;

// input에 텍스트가 있는지 없는지 확인하는 코드
value ? setHasText(true) : setHasText(false);
setInput(value); //

const matchFish = allFish.filter((fish) => fish.fish_name.match(value));
setFilteredFish(matchFish);
};

const handleDeleteButton = () => {
setInput("");
};

//리턴



×


{fishList.map((el) => (

))}



```

### 내일은 프로젝트에 기여하기 위해 무엇을 해야 하나요?

- [x] 추가적으로 애니메이션 greensock 알아보기

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.