es6 destructoring
const [a, b] = [1, 2] 이면
const a = 1
const b = 2 가 된다.
state
1. 변수 대신 쓰는 데이터 저장공간
2. useState()를 이용하여 만들어야 한다.
3. 문자, 숫자, 배열(Array), object 다 저장가능
4. 자주 바뀌는, 중요한 데이터를 state로 저장해서 사용
state를 쓰는 이유?
1. 웹이 App처럼 동작하게 만들기 위해
2. state가 변경되면 새로고침 없이도 HTML이 자동으로 재렌더링이 됨
state를 변경하려면?
object state, Array 데이터 수정방법
1. 변경함수 사용, 변경함수(대체할 데이터)
const [value, setValue] = useState();
에서
두번째 인자인 setValue가 state 변경함수이다. 여기선 이 함수를 통해 value 값을 변경할 수 있다.
예제) []의 첫번째 요소 바꾸기
const [value, setValue] = useState([]);
function 함수이름(){
let new_value = [...value]; >> 딥카피
new_value[0] = '변경할 값이름'
setValue(new_value);
}
리액트를 쓰는 큰 이유 중 하나!
- 이름의 첫 글자는 대문자로 한다.
- return문 안에 있는 태그는 하나로 묶어야 한다.
- function App() 도 일종의 컴포넌트.
{ } 중괄호 안에 if문은 작동하지 않는다.
대신, 삼항연산자를 사용한다.
{
1 < 3
? console.log('참')
: console.log('거짓')
}
위와 같이
조건식 ? 참일 경우 코드 : 거짓일 경우 코드
로 구성된다.
모달창 on,off도 state 데이터를 이용한다.
let [modal, modal변경] = useState(false);
<button onClick={ () => {modal변경(!modal)} }>스위치</button>
{ modal === true ? <Modal /> : null } // 삼항연산자 사용
난 무얼 놓쳤는가?
modal변경()의 인자에 !를 쓰는 것 자체를 생각을 못했다.
로직을 보면 첫 페이지 로드시엔 modal이 false 상태라 null 값을 가진다.
스위치 버튼을 클릭하면 modal변경 함수에 의해 modal이 !false가 되므로 true로 바뀐다.
{ } 중괄호 안에는 for와 같은 반복문을 사용할 수 없다.
그래서 중괄호 안에서 사용이 가능한 map을 쓴다. 이는 반복문이라고 하기 보단
배열에 붙일 수 있는 일종의 내장함수!
var 어레이 = [2,3,4];
어레이.map(function(a){
return a * 10 (주고싶은 값) // [20, 30, 40] 리턴
});
어떻게 씁니까?
{ 반복할데이터.map(() => { return <HTML> } )}
이렇게 써봤습니다
{
a.map((아무거나) => {
return (
<h2>
{ 아무거나 }
</h2>
)
})
}
props로 자식컴포넌트에 state를 전해주고 싶을 땐 이렇게
1. 데이터를 보내고 싶은 자식컴포넌트로 가서 <자식컴포넌트 작명={전송할 state} />
2. 자식컴포넌트에서 파라미터에 props(이름은 마음대로)를 입력
3. 자식컴포넌트에서 사용하고 싶은 곳에 props.작명[0] 이런 식으로 사용
이렇게 써봤습니다
let[글제목, 글제목변경] = useState(['제목 정하는 중', '뭐로 하지', '이걸로 할까']);
<button onClick={ () => {modal변경(!modal)} }>스위치</button>
// 1. 데이터를 Modal로 보냅니다. 작명센스부족에 글제목 state를 담습니다.
{ modal === true ? <Modal 작명센스부족={글제목} /> : null }
.
.
.
// 2. props를 인자로 받아오고
function Modal(props) {
console.log(props.작명센스부족)
return (
<div className="modal">
// 3. props.작명센스부족 은 3개의 배열을 가져옵니다. ( 위의 글제목 3개 )
<h2>{props.작명센스부족[0]}</h2>
// 첫번째 요소인 '제목 정하는 중'이 출력되겠네요~~~!
<p>날짜</p>
<p>상세내용</p>
</div>
)
}
글을 state에 저장하기
답안
div className="publish">
<input type="text" placeholder="Hello World" onChange={ (e) => {입력값변경(e.target.value)} }/>
<button onClick={()=>{
let new_글제목 = [...글제목];
new_글제목.unshift(입력값);
글제목변경(new_글제목)
}}>저장</button>
</div>
내가 쓴 답
<div className="publish">
<input type="text" placeholder="Hello World" onChange={ (e) => {입력값변경(e.target.value)} }/>
<button onClick={()=>{
let add_글제목 = [...글제목];
add_글제목 = [...글제목, {입력값}];
글제목변경(add_글제목);
}}>저장</button>
</div>
뭘 잘못했나
1. 변수는 중괄호를 써야한다는 사실 때문에 배열안에서 {입력값}을 쓰고 있었다. (여기서 입력값은 input 값)
2. Objects are not valid as a React child 라고 분명히 콘솔에 찍혀있는데 또 영어가 무섭다고 검색을 안했다.
이는 객체는 React 자식으로 유효하지 않다는 말이다.
3. 중괄호 빼주니 정상적으로 작동한다. 😂
4. 순서를 바꿔 add=글제목 = [입력값, ...글제목]으로 해도 unshift(입력값)과 같게 작용한다.