// 예제
import React from 'react';
import ReactDOM from 'react-dom/client';
const myFirstElement = <h1>Hello React!</h1>
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(myFirstElement);
JSX(Javascript XML) - 문법적 편의를 위해 개발된 자바스크립트 확장
// JSX
ReactDOM.render(
<h1 className='heading'>Hello World</h1>,
document.getElementById('content');
)
// js
ReactDOM.render(
React.createElement(
'h1',
{className:'heading'},
'Hello World'
)
)
컴포넌트는 리액트 어플리케이션의 구성 기본 단위로 element와 기능을 부품화하여 재사용 가능하게 한다.
1) 클래스형 컴포넌트
class Greeting extends React.Component{
render() {
return <h1>Hello, {this.props.name}</h1>;
}
}
2) 함수형 컴포넌트
function Greeting(props){
render() {
return <h1>Hello, {props.name}</h1>;
}
}
props - 리액트 elements에 전달되는 인수, HTML 속성을 통해 컴포넌트로 전달
// 상위 컴포넌트
<Car brand="HYUNDAI" name="SONATA"></Car>
// Car.js
function Car(props){
return <h1>I am a {props.brand} {props.name}</h1>;
}
Car 요소에 brand, name 속성 추가하고 컴포넌트 파라미터로 props를 받는다. props 안의 brand, name을 props.brand, props.name으로 접근 가능하다.
// Car.js
function Car({brand, name}){
return <h1>I am a {brand} {name}</h1>;
}
구조분해 할당을 활용하면 객체나 리스트의 요소를 바로 사용 가능하다. props안의 name을 name으로 바로 사용할 수 있다.
// 상위 컴포넌트
// state 선언
const [brand, setBrand] = useState("KIA");
const [carName, setCarName] = useState("K7");
return (
<Car brand={brand} name={carName}></Car>
);
const로 변수를 만들고 변수 이름을 중괄호 안에 넣어서 데이터를 컴포넌트에서 다른 컴포넌트로 전달할 수 있다.
// 상위 컴포넌트
const [user, setUser] = useState("길동");
function onChangeName(newName) {
setUser(newName);
}
return (
<Hello name={user} address="DAEGU" onChangeName={onChangeName} ></Hello>
);
// Hello.js
// 하위 컴포넌트
function Hello({name, address, onChangeName}) {
return (
<div>
<h1>Hello {address}에 사는 {name}</h1>
<button onClick= {function () {
{onChangeName("동길")}
}}>이름 바꾸기</button>
</div>
);
}
이벤트 핸들러를 다른 컴포넌트에서 전달받고 전달할 수 있다.
문법: ...
기존 배열 객체의 값을 복사해오는 연산자이다.
// 예제
function testSpread(){
console.log('testSpread()');
const array = [{name:'kim'},{name:'lee'},{name:'park'}];
const newArray =[...array, {name:'an'}];
console.log(array);
console.log(newArray);
}
실행결과
[...array, {name:'an'}]
는 array 배열을 모두 복사하고 array의 마지막 값 뒤에 {name: 'an'}를 추가 하겠다는 의미이다! [array..., {name:'an'}]
실행 시 배열의 맨 앞에 {name:'an'}이 추가된다. 여기서 이 새로운 배열을 newArray로 할당하는것이지 array에 추가되는게 아니다. array의 값은 변함이 없다.
Todo-List
기능 1) 할 일 목록 출력
기능 2) 할 일 추가
기능 3) 할 일 삭제
기능 4) 할 일 완료 체크 시, 취소선 출력
바닐라 자바스크립트로 구현했던 투두리스트를 리액트로 구현하였다. 할 일 추가 기능(InputItem)과 전체적인 할 일 목록(TodoList), 할 일 하나의 기능(Item)을 각각의 컴포넌트로 분리하였다.