프론트엔드 WEB
Javascript
React
OT-리액트
React
모바일 App처럼 새로고침없이 스무스하게 웹앱을 만들어줌 대표적으로 instagram
- 장점:
- 앱처럼 만들었기 때문에 모바일앱으로 발행이 쉬움
- 앱처럼 뛰어난 UX
- 일반적인 웹사이트보다 비즈니스적 강점을 가지고 있다.
- 단점:
- 문법이 조금 어렵다
선수지식
- Javascript
- html
- css
1강 설치 및 셋팅
- Node.js를 설치(Mac)
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew update
brew install node
node -v
npm -v
brew install yarn --ignore-dependencies
yarn -v
- 폴더 생성 후 필요한 파일들을 전부 설치해주는 npx 명령어 사용 -> node js를 설치하면 사용가능핟.
npx create-react-app "Project_name"
- 만들어 놓은 프로젝트로 이동 후 미리보기 띄우기
(크롬 설치 필수)
npm start
- 추가 폴더 정보
- node_modules :라이브러리 저장소
- public : static 파일들 보관함
- src : 소스코드 보관함 (실질적으로 여기파일들로 코딩함)
- package.json : 설치한 라이브러리 목록
2강 JSX 사용법
리액트에서는 HTML 대신에 JSX를 사용하여야 한다.
- 블로그 navbar만들기 ```javascript import logo from ‘./logo.svg’; import ‘./App.css’;
function App() { return ( <div className="App">
</div> ); } export default App;
### App.css파일에서 아래코드를 삽입
```javascript
body {
font-family:
'nanumsquare';
}
.black-nav{
background: black;
width: 100%;
display: flex;
color: white;
padding: 20px;
font-weight: 600;
font-size: 20px;
}
- 데이터 바운딩
서버에서 받은 데이터 -> 자바스크립트 -> HTML로 바꾸는 데이터 바운딩을 리액트에서는 쉽게 할 수 있다
바꾸고자 하는 곳에
{ "변수명,함수 등" }
이미지 넣는법
//원하는 이미지를 import
import logo from './logo.svg';
<img src={ logo } />
// import한 이미지를 {}안에 삽입
- JSX에서 style 속성 삽입
style속성은 {} 안에 오브젝트 형식으로 넣어줘야 함
<div style= > </div>
3강 변수를 담는 새로운 방법 state
- 글 목록만들기
App.js파일에 코드 추가 삽입
<div className = "list">
<h3>{ hello }</h3>
<p>5월 11일 발행</p>
<hr/>
</div>
App.css파일에 코드 추가 사입
.list{
margin-top: 30px;
text-align: left;
padding-left: 20px;
padding-right: 20px;
}
변수를 저장할 수 있는 또 하나의 방법 state
App.js파일에 제일 상단에 import 코드 추가삽입
import React, { useState } from 'react';
// useState 내장함수 사용
useState를 사용하여 변수저장
let [글제목, 글제목변경] = useState('Hello React');
// 위 함수를 실행하면 2개의 원소를 가진 리스트를 반환 Return [a,b]
// a = 'Hello React'가 저장
// b = Hello React state를 정정해주는 함수
// 여러개의 데이터를 리스트타입으로 전달도 가능하다
State를 쓰는 이유 ?
- 웹을 app처럼 동작하게 하기 위해서
- state는 변경되면 HTML이 자동으로 렌더링이 된다.
- 일반변수는 새로고침이 되어야 렌더링이 된다.
- 바뀌지않는 부분은 변수 수시로 바뀌는 부분은 state를 사용한다.
새로고침없이 스무스하게 재렌더링이 되려면 state를 사용해야한다
App.js
import React, { useState } from 'react';
import logo from './logo.svg';
import poketmon from './test.jpg';
import './App.css';
function App() {
let [글제목, 글제목변경] = useState(['새로고침 없이','스무스하게 렌더링하려면', 'state 사용하자' ]);
return (
<div className="App">
<div className ='black-nav'>
<div style= >Test Blog</div>
</div>
<img src={ poketmon } />
<div className = "list">
<h3>{ 글제목[0] }</h3>
<p>5월 11일 발행</p>
<hr/>
</div>
<div className = "list">
<h3>{ 글제목[1] }</h3>
<p>5월 12일 발행</p>
<hr/>
</div>
<div className = "list">
<h3>{ 글제목[2] }</h3>
<p>5월 13일 발행</p>
<hr/>
</div>
</div>
);
}
export default App;
4강 리액트 버튼 핸들러 장착
WARING 메시지가 보기싫다면 App.js파일 가장 윗 부분에 다음 주석 삽입
/* eslint-disable */
- 좋아요 버튼 만들기
<span>🥰</span> 0
//span 태그를 클릭했을 시 카운터를 증가시켜야 함
onClick을 이용
<span onClick = { 함수() }>🥰</span> 0
// 함수를 정의해야 함
<span onClick = { ()=>{} }>🥰</span> 0
// 함수를 정의하기 싫을 때
Click할 때마다 카운터를 증가
state를 이용하여 카운터를 증가
state변경함수 사용
let [카운트, 카운트변경] = useState(0);
<span onClick = { ()=>{카운트변경(카운트+1)} }>🥰</span> {카운트}
// state를 변경하려면 state변경 함수를 이용한다!
App.js
/* eslint-disable */
import React, { useState } from 'react';
import logo from './logo.svg';
import poketmon from './test.jpg';
import './App.css';
function App() {
let [글제목, 글제목변경] = useState(['새로고침 없이','스무스하게 렌더링하려면', 'state 사용하자' ]);
let [카운트, 카운트변경] = useState(0);
return (
<div className="App">
<div className ='black-nav'>
<div style= >Test Blog</div>
</div>
<img src={ poketmon } />
<div className = "list">
<h3>{ 글제목[0] } <span onClick = { ()=>{카운트변경(카운트+1)} }>🥰</span> {카운트}</h3>
<p>5월 11일 발행</p>
<hr/>
</div>
<div className = "list">
<h3>{ 글제목[1] }</h3>
<p>5월 12일 발행</p>
<hr/>
</div>
<div className = "list">
<h3>{ 글제목[2] }</h3>
<p>5월 13일 발행</p>
<hr/>
</div>
</div>
);
}
export default App;
5강 원하는대로 State를 변경
- 버튼을 클릭해서 제목을 변경하는 법
함수정의
function 제목변경(){
var newArr = [...글제목]; //deep copy
newArr[0]= "변경해버리기"
글제목변경(newArr)
//직접수정이 아니라 딥카피를 이용하여 변경하면 손쉽게 변경이 가능하다. (call by reference)
// 하드코딩 방법 - > 글제목변경(글제목 ['State를 변경해서 ','글 제목을 ', '변경해보자'] )
// 사용시 초기 설정값 포멧을 그대로 넣어주는게 뽀인트입니당
}
// onClick 함수에 넣을 함수정의
App.js파일 수정
<button onClick={ 제목변경 }> 눌러주세용 </button>
//함수에 이름을 넣을때는 소괄호를 빼고 넣어줘야 함!!
순서
- state 카피본 생성 (깊은복사)
- 수정사항을 카피본에 저장
- 변경함수에 카피본 넣기
App.js
/* eslint-disable */
import React, { useState } from 'react';
import logo from './logo.svg';
import poketmon from './test.jpg';
import './App.css';
function App() {
let [글제목, 글제목변경] = useState(['새로고침 없이','스무스하게 렌더링하려면', 'state 사용하자' ]);
let [카운트, 카운트변경] = useState(0);
function 제목변경(){
var newArr = [...글제목]; //deep copy
newArr[0]= "변경해버리기"
글제목변경(newArr)
}
return (
<div className="App">
<div className ='black-nav'>
<div style= >Test Blog</div>
</div>
<img src={ poketmon } />
<div className = "list">
<button onClick={ 제목변경 }> 눌러주세용 </button>
<h3>{ 글제목[0] } <span onClick = { ()=>{카운트변경(카운트+1)} }>🥰</span> {카운트}</h3>
<p>5월 11일 발행</p>
<hr/>
</div>
<div className = "list">
<h3>{ 글제목[1] }</h3>
<p>5월 12일 발행</p>
<hr/>
</div>
<div className = "list">
<h3>{ 글제목[2] }</h3>
<p>5월 13일 발행</p>
<hr/>
</div>
</div>
);
}
export default App;