React
[React] CDN방식 넣기, React기초
euge
2023. 3. 2. 16:39
CDN방식
React JS를 사용하기 위한 준비
JSX : script안에서 작성
html비슷하지만 html은 아님, 단독태그끝에 /넣어야함) React에서 html 태그처럼 사용
두개 이상의 요소를 랜더링하려면 div로 감싼다.
img, br, hr등 단독태그 끝에 /슬래시를 꼭 넣는다.
ReactDom.render() : JSX요소나 컴포넌트를 마운트요소에 출력
ReactDOM.render(
JSX요소 또는 <컴포넌트 />, 마운트요소
);
<!doctype html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>리액트</title>
<style>
#wrap{border: 10px dashed black; padding: 10px;}
.s1{color: blueviolet;}
</style>
<script src="https://unpkg.com/react@17/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom@17/umd/react-dom.production.min.js"></script>
<script src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
</head>
<body>
<div id="wrap"></div>
<script type="text/babel">
let i =7;
ReactDOM.render(
<div>
<h1>제목</h1>
<h2>안녕{i}</h2>
<img src="" alt="" />
<p class="s1">안녕하세요.</p>
</div>
,
document.querySelector("#wrap") // 출력될 위치(요소)
);
</script>
</body>
</html>
Component 컴포넌트.
컴포넌트 정의, 컴포넌트명은 대문자로 시작해야한다.(파스칼표기법)
class 컴포넌트명 extends React.Component {
render(){
return JSX작성
}
}
ReactDOM.render(
<컴포넌트명 />, 마운트대상요소
);
<!doctype html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>리액트</title>
<style>
#wrap{border: 10px dashed black; padding: 10px;}
.room{border: 20px solid hotpink; padding: 20px; margin: 10px;}
.kitchen{border: 20px solid rgb(182, 255, 87); padding: 20px; margin: 10px;}
.living{border: 20px solid rgb(128, 105, 255); padding: 20px; margin: 10px;}
</style>
<script src="https://unpkg.com/react@17/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom@17/umd/react-dom.production.min.js"></script>
<script src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
</head>
<body>
<div id="wrap">
</div>
<script type="text/babel">
class Room extends React.Component {
render(){
return <div className="room">
<h1>방</h1>
<p>방입니다.</p>
</div>
}
}
class Kitchen extends React.Component {
render(){
return <div className="kitchen">
<h1>부엌</h1>
<p>부엌입니다.</p>
</div>
}
}
class Living extends React.Component {
render(){
return <div className="living">
<h1>거실</h1>
<p>거실입니다.</p>
</div>
}
}
ReactDOM.render(
<div>
<Room />
<Kitchen />
<Living />
</div>
,
document.querySelector("#wrap")
);
</script>
</body>
</html>
<!doctype html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>리액트</title>
<style>
*{margin: 0; padding: 0;}
ul{list-style: none;}
#wrap{border:20px;}
.Header {border:20px solid #0cc; margin:10px;}
.Contents {
margin: 10px auto;
border:20px solid rgb(67, 126, 255);
max-width:1200px;
}
.Footer {border:20px solid rgb(255, 183, 247); margin:10px;}
.group{display: flex; flex-wrap: wrap;}
.Box{
width:50%;
margin:10px 0;
border:10px solid orange;
box-sizing: border-box;
}
.Box img{width:100%;}
</style>
<script src="https://unpkg.com/react@17/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom@17/umd/react-dom.production.min.js"></script>
<script src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
</head>
<body>
<div id="wrap">
</div>
<script type="text/babel">
class Header extends React.Component {
render(){
return <header className="Header">
<h1>LOGO</h1>
<Gnb />
</header>
}
}
class Gnb extends React.Component {
render(){
return <nav className="Gnb">
<ul>
<li>메뉴1</li>
<li>메뉴2</li>
<li>메뉴3</li>
</ul>
</nav>
}
}
class Contents extends React.Component {
render(){
return <section className="Contents">
<h2>컨텐츠</h2>
<div className="group">
<Box name="박스1" img="images/insta1.jpg" />
<Box name="박스2" img="images/insta2.jpg"/>
<Box name="박스3" img="images/insta3.jpg"/>
<Box name="박스4" img="images/insta1.jpg"/>
</div>
</section>
}
}
class Box extends React.Component {
render(){
return <div className="Box">
<p>{this.props.name}</p>
<img src={ this.props.img }/>
</div>
}
}
class Footer extends React.Component {
render(){
return <footer className="Footer">
Footer
</footer>
}
}
ReactDOM.render(
<div>
<Header></Header>
<Contents></Contents>
<Footer></Footer>
</div>,
document.querySelector("#wrap")
);
</script>
</body>
</html>
Props 속성
props는 properties를 줄인 표현으로 부모 컴포넌트로부터 물려받는 속성이다. 클래스 컴포넌트에서 props에 접근하기 위해서는 this 키워드를 사용하면 된다.이 props값은 해당 컴포넌트를 불러와서 사용하는 부모 컴포넌트에서만 설정할 수 있다.부모 컴포넌트에서 전달하는 props가 바뀌면 자동으로 업데이트된다.
{this.props.속성명}
class AA extends React.Component {
render(){
return <p>안녕하세요 { this.props.속성명 }</p>
}
}
ReactDOM.render(
<div>
<AA 속성명="값"></AA>
</div>,
document.querySelector("#wrap")
);
<!doctype html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>리액트</title>
<style>
#wrap{border: 10px dashed black; padding: 10px;}
.room{border: 20px solid hotpink; padding: 20px; margin: 10px;}
</style>
<script src="https://unpkg.com/react@17/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom@17/umd/react-dom.production.min.js"></script>
<script src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
</head>
<body>
<div id="wrap"></div>
<script type="text/babel">
class Room extends React.Component {
render(){
return <div className="room">
<h1>{this.props.num}번 방</h1>
<p>{this.props.name}방입니다.</p>
</div>
}
}
ReactDOM.render(
<div>
<Room name="철수" num="01"></Room>
<Room name="영희" num="02"></Room>
<Room name="민준" num="03"></Room>
</div>
,
document.querySelector("#wrap")
);
</script>
</body>
</html>
{this.props.children}
class Room extends React.Component {
render(){
return <div className="room">
<h1>방</h1>
<p>{this.props.children}방입니다.</p>
</div>
}
}
ReactDOM.render(
<div>
<Room>철수</Room>
<Room>영희</Room>
<Room>민준</Room>
</div>
,
document.querySelector("#wrap")
);
class Room extends React.Component {
render(){
return <div className="room">
<h1>{this.props.tit}</h1>
<p>{this.props.children}</p>
</div>
}
}
ReactDOM.render(
<div>
<Room tit="방1">철수입니다.</Room>
<Room tit="방2">영희입니다.</Room>
<Room tit="방3">민준입니다.</Room>
</div>
,
document.querySelector("#wrap")
);
State 스테이트.
State : 리액트에서 사용할 데이터 저장 (변수 비슷한 건데 변수는 아님.)
constructor(props){ // constructor함수안에 있는 것이 가장 먼저 실행된다.
super(props);
this.state = { 변수명:변수값 }
}
<!doctype html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>리액트</title>
<style>
</style>
<script src="https://unpkg.com/react@17/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom@17/umd/react-dom.production.min.js"></script>
<script src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
</head>
<body>
<div id="wrap"> </div>
<script type="text/babel">
class Counter extends React.Component {
constructor(props){
super(props);
this.state = {
a:7,
b:5,
k:"안녕"
}
}
render(){
return(
<h1>안녕{this.state.a}</h1>
);
}
}
ReactDOM.render(
<div>
<Counter />
</div>,
document.querySelector("#wrap")
);
</script>
</body>
</html>
react에서 온클릭 실행방법 1 // 직접 함수생성
<button onClick={()=>{alert(333);}}>버튼</button>
react에서 온클릭 실행방법 2 // 생성된 함수 실행
AA(){
alert("안녕하세요");
}
<button onClick={ this.AA }>버튼</button>
this.state = {a:0} // 초기값
this.setState({a: this.state.a +1}) // 변경값 // 1을 증
this.함수명 =this.함수명.bind(this); //스테이트 값이 변경될 경우 함수에 this를 바인딩시켜야한다.
-----생략-----
<script type="text/babel">
class Counter extends React.Component {
constructor(props){
super(props);
this.state = {a:0}
this.AA =this.AA.bind(this); //스테이트 값이 변경될 경우 함수에 thiuis를 바인딩시켜야한다.
}
AA(){
this.setState({ a: this.state.a + 1 }) //a값을 1증가
}
render(){
return(
<div>
<h1>카운터{this.state.a}</h1>
<button onClick={this.AA}>버튼</button>
</div>
);
}
}
ReactDOM.render(
<div>
<Counter />
</div>,
document.querySelector("#wrap")
);
</script>
</body>
</html>
클래스형 => State O
함수형 => State X ---> useState