Today I Learned
12 TIL 리액트 박살내기!
냥냥's
2021. 9. 29. 09:13
State 관리 2
함수형 컴포넌트에서 state 관리 - useState()
새 컴포넌트를 만들어서 해볼까요? Nemo.js 파일을 만들고 시작합니다!
Nemo 컴포넌트 만들기
import React from "react";
const Nemo = (props) => {
// 반환할 리액트 요소가 없을 때는 null을 넘겨주세요! 처음 껍데기 잡으실때도 null을 넘겨주면 굳!
return null;
}
export default Nemo;
(2) App에서 <Nemo/>불러오기
// import 먼저 하고
import Nemo from "./Nemo";
...
<div className="App">
{/*컴포넌트 불러다 쓰기*/}
<Nemo/>
...
...
(3) useState()로 count를 state로 등록하자
// count에는 state 값이, setCount는 count라는 state 값을 수정하는 함수가 될거예요.
// useState(초기값): () 안에 초기값을 넣어줍니다.
const [count, setCount] = React.useState(3);
(4) 뷰를 만들고(=반환할 리액트 요소를 만들고),
const nemo_count = Array.from({ length: count }, (v, i) => i);
// 반환할 리액트 요소가 없을 때는 null을 넘겨주세요!
return (
<div className="App">
{nemo_count.map((num, idx) => {
return (
<div
key={idx}
style={{
width: "150px",
height: "150px",
backgroundColor: "#ddd",
margin: "10px",
}}
>
nemo
</div>
);
})}
<div>
<button>하나 추가</button>
<button>하나 빼기</button>
</div>
</div>
);
(5) 함수를 만들어서,
const addNemo = () => {
// setCount를 통해 count에 저장된 값을 + 1 해줍니다.
setCount(count + 1);
};
const removeNemo = () => {
// setCount를 통해 count에 저장된 값을 - 1 해줍니다.
// 이번엔 if문 대신 삼항 연산자로 해볼거예요!
setCount(count > 0 ? count - 1 : 0);
};
(6) 연결하자!
<div>
{/* 함수를 호출합니다. */}
<button onClick={addNemo}>하나 추가</button>
<button onClick={removeNemo}>하나 빼기</button>
</div>
(7) 완성본 코드
import React from "react";
const Nemo = (props) => {
// count에는 state 값이, setCount는 count라는 state 값을 수정하는 함수가 될거예요.
// useState(초기값): () 안에 초기값을 넣어줍니다.
const [count, setCount] = React.useState(3);
const addNemo = () => {
// setCount를 통해 count에 저장된 값을 + 1 해줍니다.
setCount(count + 1);
};
const removeNemo = () => {
// setCount를 통해 count에 저장된 값을 - 1 해줍니다.
// 이번엔 if문 대신 삼항 연산자로 해볼거예요!
setCount(count > 0 ? count - 1 : 0);
};
const nemo_count = Array.from({ length: count }, (v, i) => i);
// 반환할 리액트 요소가 없을 때는 null을 넘겨주세요!
return (
<div className="App">
{nemo_count.map((num, idx) => {
return (
<div
key={idx}
style={{
width: "150px",
height: "150px",
backgroundColor: "#ddd",
margin: "10px",
}}
>
nemo
</div>
);
})}
<div>
{/* 함수를 호출합니다. */}
<button onClick={addNemo}>하나 추가</button>
<button onClick={removeNemo}>하나 빼기</button>
</div>
</div>
);
};
export default Nemo;
state를 관리 (사용) 할 때에는 useState!!! 기억하기
Event Listener
클래스형 컴포넌트에서 event listener 구독하기
이벤트 리스너는 어디에 위치해야할까요? 클릭을 하건, 마우스를 올리건 DOM 요소가 있어야 이벤트가 발생하는 지 지켜볼 수 있겠죠? → 네! componentDidMount()에 넣어주면 됩니다.
일단, ref부터 잡아볼까요!
constructor(props) {
super(props);
this.state = {
count: 3, // 숫자넣기!
};
// div에 ref를 먼저 잡아줍시다.
this.div = React.createRef();
}
...
return (
<div className="App" ref={this.div}>
<Nemo/>
</div>
);
...
이제 addEventListener()를 이용해서 이벤트를 등록합니다.
hoverEvent = (e) => {
// 콘솔로 이 이벤트가 누구에게서 일어났는 지 확인할 수 있습니다.
console.log(e.target);
if(e.target.className === 'app'){
// 이벤트의 장본인의 배경 색을 바꿔볼까요?
e.target.style.background = "#eee";
}
}
componentDidMount() {
// 리액트 요소가 잘 잡혔나 확인해봅시다!
console.log(this.div);
// 마우스를 올렸을 때, 이벤트가 일어나는 지 확인해봅시다.
this.div.current.addEventListener("mouseover", this.hoverEvent);
}
- 이벤트는 꼭 컴포넌트가 사라지면 지워주세요!
componentWillUnmount() {
// 컴포넌트가 사라질 때 이벤트를 지워줍니다.
this.div.current.removeEventListener("mouseover", this.hoverEvent);
}
라우팅이란
SPA는 주소를 어떻게 옮길 수 있을까? html은 딱 하나를 가지고 있지만, SPA도 브라우저 주소창대로 다른 페이지를 보여줄 수 있어요. 이렇게 브라우저 주소에 따라 다른 페이지를 보여주는 걸 라우팅이라고 부릅니다.
SPA란
Single Page Application! 말 그대로 서버에서 주는 html이 1개 뿐인 어플리케이션이에요. 전통적인 웹사이트는 페이지를 이동할 때마다 서버에서 html, css, js(=정적자원들)을 내려준다면, SPA는 딱 한번만 정적자원을 받아옵니다.
알고리즘
function solution(s){
let answer = "";
answer = s.filter(function(v, i){
console.log(v, i)
if(s.indexOf(v) === i ) return true; //인덱스오브로 처음 등장하는 인덱스값과 현재인덱스값이 같을때만 true를 줘서 filter함수에서 true만 담게 한다.
});
return answer
}
let str = ["good","time","good","time","student"];
console.log(solution(str))