//생명주기에서
componentDidMount() {
applyFirstLogic() //이 로직과
applySecondLogic() //이 로직은 전혀 상관없는 로직일 수도 있음
}
const [읽어들일 상태값, 상태값 변경 함수] = useState("상태값의 기본값");
//useState는 react의 내장 Hook이다.
import React, { useState } from 'react';
function State() {
//Hook 사용조건 : 최상위에서만 Hook 호출하기
const [color, setColor] = useState('red');
return (
<div>
<h1 style={{ color: color }}>Function Component | State</h1>
<button onClick={() => setColor('blue')}>Click</button>
</div>
);
}
export default State;
cornflowerblue
import React, { Fragment, useState, useRef } from "react";
import "./Comment.scss";
function AddComment() {
//댓글 목록을 관리하는 state
//댓글들의 id와 content가 객체 형태로 commentArray에 들어간다.
let [commentArray, setCommentArray] = useState([]);
//여기서 id는 고유한 key값이다.
const [id, setId] = useState(1);
//댓글을 작성하는 input을 선택한다.
const value = useRef();
//댓글 다는 함수
const addComment = () => {
//id값에 1을 더해서 중복되지 않게 한다.
setId(id + 1);
//commentArray에 들어갈 newComment 객체
const newComment = {
id: id,
//댓글input의 값을 가져온다.
content: value.current.value,
};
//Spread 연산자를 사용해서 commentArray에 newComment객체를 추가한다.
setCommentArray([...commentArray, newComment]);
};
return (
<Fragment>
<div className="flexContainer">
<div>
<input type="text" placeholder="댓글입력" ref={value} />
//button을 클릭하면 addComment 함수 실행
<button onClick={addComment}>게시</button>
</div>
<div className="newCommentArea">
//commentArray배열을 순환하면서 key자리에는 id를, content자리에는 content를 넣는다.
{commentArray.map((comment) => {
return (
<p key={comment.id}>
<span className="writer">writer</span>
<span className="content">{comment.content}</span>
</p>
);
})}
</div>
</div>
</Fragment>
);
}
export default AddComment;
state에서 고유한 key값이 필요한 이유
useRef()
import { useRef } from "react";
const value = useRef();
//해당 input의 값 가져오기
value.current.value
~~~
//원하는 태그에서 ref = {}
<input type="text" ref={value} />
Spread 연산자
const 배열명 = [spread한 배열, 추가할 값]
이렇게 작성하면 spread한 배열에 값을 추가할 수 있다.const arr1 = [1,2,3,4,5];
console.log(arr1); // (5) [1,2,3,4,5]
console.log(...arr1); // 1 2 3 4 5
const addNumArr = [...arr1, 6]
console.log(addNumArr); //(6) [1, 2, 3, 4, 5, 6]
const arr5 = [..."music"];
console.log(arr5); // ["m","u","s","i","c"]
function get(one,two,three){
console.log(one+two+three);
}
const arr6 = [10,20,30];
get(...arr6); //60
const arr2 = [1,2,3];
const arr3 = [4,5,6];
const arr4 = [0,...arr2,3.5,...arr3];
console.log(arr4); //(6) [0,1,2,3,3.5,4,5,6]
Array.map()
//arr의 요소들을 모두 2배로 만들어서 새로운 배열을 만들어보자.
const arr = [1,2,3,4];
const doubleArr = arr.map(x => x*2);
console.log(doubleArr); //(4) [2, 4, 6, 8]
//-----------------------------------------
//객체가 들어있는 배열에서 map을 사용해보자!
const arr = [
{key : 1,value : 10},
{key : 2,value : 20},
{key : 3,value : 30}
]
//arr배열을 순환한다.
const newArr = arr.map((obj) => {
let rObj = {};
rObj[obj.key] = obj.value;
return rObj;
});
console.log(newArr);
/*
(3) [{…}, {…}, {…}]
0: {1: 10}
1: {2: 20}
2: {3: 30}
length: 3
*/
참고) mdn-Array/map
* {
box-sizing: border-box;
}
.flexContainer {
height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
margin-top: 50px;
}
input {
width: 300px;
height: 35px;
border: 1px solid #dbdbdb {
radius: 5px;
}
&:focus {
outline: none;
}
}
button {
background-color: #dbdbdb;
margin-left: 10px;
width: 50px;
height: 35px;
cursor: pointer;
border: none {
radius: 5px;
}
}
.writer {
font: {
weight: 700;
}
margin-right: 8px;
}
결과물..
댓글 달기 과제는 처음에 손도 대지 못했다. state가 어색하다. 시간이 나는대로 이것저것 만들어보면서 익숙해져야 할 필요를 느꼈다.