일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- IOS
- effect
- image
- keyframes
- jQuery
- 비전공 개발자
- 애니메이션
- MAC
- html5
- 비전공자
- ipad
- 백엔드
- xcode
- javascript
- react
- button
- 자바스크립트
- HTML
- 개발자
- CSS
- iOS 개발자
- front-end
- 프론트엔드
- SWIFT
- php
- 풀스택
- iPhone
- hover
- css3
- Animation
- Today
- Total
비전공자 개발일기
React 본문
import logo from './logo.svg';
import './App.css';
function App() {
let posts = "강남 고기 맛집";
function fnc() {
return 100
}
return (
<div className="App">
<div className="black-nav">
<div className={posts} style={{color: "#0000ff", fontSize: "30px"}}>개발 Blog</div>
</div>
<img src={logo} />
<h4>{posts+fnc()}</h4>
</div>
);
}
export default App;
1. class 명 작성 -> className
2. 데이터 바인딩(Javascript data를 html에 넣는것) 하는 법
-> {변수명, 함수, 스타일 속성 값, 이미지 경로 등}
3. JSX에서 style 속성 사용 -> style = {object 자료형으로 만든 스타일}
ex) <div className={posts} style={{color: "#0000ff", fontSize: "30px"}}>개발 Blog</div>
1) 속성명 -> camelCase로 작성
2) 속성값 -> 문자열로 값 부여 (' ' or " " or ` ` )
4. state
import React, {useState} from 'react';
...
// Javascript ES6 Destructuring
// let [a, b] = [10, 100]
// => let a = 10 / let b = 100
let [글제목, 글제목변경] = useState('남자 코트 추천');
// useState(저장할 데이터(문자열, 배열, 객체 등)) => [데이터1, 데이터2]
// 데이터1 = 실제 저장할 데이터
// 데이터2 = 변수에 저장할 데이터를 변경시킬 함수
※ 변수말고 state에 데이터 저장해서 사용하는 이유
-> 변수가 변경될 때 자동으로 관련된 HTML을 재렌더링되게 만들기 위함
-> 자주 변하는 데이터들을 저장하는 것이 좋은 관습
5. 변수 미사용과 같은 에러 미표시 방법 -> /* eslint-disable */
6. JSX 이벤트 -> <div onClick={실행할 함수}>
function App(){
let [ 따봉, 따봉변경 ] = useState(0);
return (
<HTML 많은 곳>
<h3> { 글제목[0] } <span onClick={ ()=>{ 따봉변경(따봉 + 1) } } >👍</span> { 따봉 }</h3>
</HTML 많은 곳>
)
}
7. state(UI의 현재 상태를 보관하는 저장소역할) 변경
state = ~ 와 같은 직접 조작은 불가능
state 변경함수 사용
- 수정하고 싶은 state의 deep/shallow 카피본을 하나 생성
- 복사본 수정
- 복사본을 state 변경함수()에 넣기
function 제목바꾸기() {
//var newArray = 글제목;
// error -> 자바스크립트 내에서 array나 object 자료형은 = 등호로 복사하면
각각 별개의 자료형이 생성되는게 아니라 값을 공유(Javascript reference data type)
let new Array = [... 글제목];
newArray[0] = '여자코트 추천';
글제목변경( newArray );
}
// 글 제목이라는 state를 직접 수정하는 것을 불가능
// 복사본 생성
// 복사본 newArray에 저장
// newArray의 0번째 데이터 변경
// 글제목변경 함수에 newArray 할당
/* eslint-disable */
import { useState } from "react";
import "./App.css";
function App() {
let [글제목, 글제목변경함수] = useState(["남자 코트 추천", "강남 우동 맛집", "리액트 독학" ]);
let [따봉, 따봉변경] = useState(0);
function 제목바꾸기() {
let newArray = [...글제목];
newArray = newArray.sort();
글제목변경함수(newArray);
}
return (
<div className="App">
<div className="black-nav">
<div>개발 Blog</div>
</div>
<button onClick={제목바꾸기}>Button</button>
<div className="list">
<h3>{글제목[0]}<span onClick={() => {따봉변경(따봉+1)}}>👍</span> {따봉} </h3>
<p>2월 17일 발행</p>
<hr />
</div>
<div className="list">
<h3>{글제목[1]}</h3>
<p>2월 17일 발행</p>
<hr />
</div>
<div className="list">
<h3>{글제목[2]}</h3>
<p>2월 17일 발행</p>
<hr />
</div>
</div>
);
}
export default App;
spread 연산자(ES6): 「...」 -> 배열 / 객체 자료형 왼쪽에 붙여서 사용 -> 대괄호 / 중괄호 제거
let data1 = [1,2,3];
let data2 = data1;
// 같은 값을 공유 (업데이트도 같이 일어남)
let data1 = [1,2,3];
let data2 = [...data1];
// 독립적인 array 복사본 생성(deep copy)
8. component : 긴 HTML을 한 단어로 치환해서 넣을 수 있는 문법
사용방법
- 함수 생성
- return( ) -> 괄호 안에 원하는 HTML 넣기
- 원하는 곳에서 <함수명 />(<함수명></함수명>) 넣기
특징
- Component 이름 -> 영어대문자로 시작하기
- return 안에 태그들이 평행하게 여러 개 있는 건 불가능
- 여러 평행한 태그들을 <div> 또는 <>(fragments)로 묶어서 사용
사용 (함수 문법 사용 경우와 유사)
- 반복해서 출현하는 HTML 덩어리
- 내용이 자주 변경될 것 같은 HTML 부분
단점
- props 이용
function App (){
return (
<div>
HTML 잔뜩있는 곳
...
<Modal></Modal>
</div>
)
}
function Modal(){
return (
<div className="modal">
<h2>제목</h2>
<p>날짜</p>
<p>상세내용</p>
</div>
)
}
// 사용 불가
...
return (
<div></div>
<div></div>
)
// 사용 가능 1
...
return (
<div>
<div></div>
<div></div>
</div>
)
// 사용 가능 2
...
return (
<>
<div></div>
<div></div>
<>
)
function Modal(){
return (
<div className="modal">
<h2>제목</h2>
<p>날짜</p>
<p>상세내용</p>
<다른컴포넌트></다른컴포넌트>
</div>
)
}
function 다른컴포넌트(){
return ( <div> 안녕 </div> )
}
9. 조건에 따른 실행 -> { } 안에 삼항연산자
React에서 클릭 시, 보이는 UI 만드는 법
- UI가 보이는 / 보이지 않는 상태 정보를 state로 만들기(true/ false)
- state가 true일 때만 UI를 보여주는 if문 사용
- 기능 개발
function App (){
return (
<div>
HTML 잔뜩있는 곳
{
1 < 3
? <Modal />
: null
}
</div>
)
}
// 버튼 클릭시 열고 닫히는 modal 생성
function App (){
let [modal, modal변경] = useState(false);
return (
<div>
<button onClick={ ()=>{ modal변경(!modal) } }> 열고닫는버튼 </button>
{
modal === true
? <Modal />
: null
}
</div>
)
}
10. 반복문 -> {배열.map()}
function App (){
return (
<div>
HTML 잔뜩있는 곳
...
{ 글제목.map(function(a){
return (
<div className="list">
<h3>{ a }</h3>
<p>2월 18일 발행</p>
<hr />
</div>
}) }
</div>
)
}
function App (){
function 반복된UI(){
var 어레이 = [];
for (var i = 0; i < 3; i++) {
어레이.push(<div>안녕</div>)
}
return 어레이
}
return (
<div>
HTML 잔뜩있는 곳
{ 반복된UI() }
</div>
)
}
11. props -> 컴포넌트간 자료 전달법
사용법
- <자식컴포넌트 전송할이름 = {state명} />
- 자식 컴포넌트를 선언하는 function 안에 parameter로 props를 추가
- props 전달 가능 갯수는 무한
- props라는 parameter안에는 전송한 모든 props data가 있음 -> 원하는 것만 골라서 사용하면 됨
- 전송할이름 = {state명} 또는 전송할 이름 = "텍스트" 둘 다 가능
function App (){
let [글제목, 글제목변경] = useState(['남자코트 추천', '강남 우동맛집', '파이썬독학']);
let [누른제목, 누른제목변경] = useState(0);
return (
<div>
...
{ 글제목.map(function(a, i){
return (
<div className="list">
<h3 onClick={ ()=>{ 누른제목변경(i) } }>{ a } <span>👍</span> </h3>
<p>2월 18일 발행</p>
<hr />
</div>
}) }
<Modal 글제목={글제목} 누른제목={누른제목}></Modal>
</div>
)
}
function Modal(props){
return (
<div className="modal">
<h2>제목 { props.글제목[props.누른제목] }</h2>
<p>날짜</p>
<p>상세내용</p>
</div>
)
}
12. 사용자가 input에 입력한 데이터를 state로 저장
function App (){
let [입력값, 입력값변경] = useState('');
return (
<div>
HTML 잔뜩있는 곳...
<input onChange={ (e)=>{ 입력값변경(e.target.value) } />
</div>
)
}
13. map을 쓰면 콘솔창에 에러가 뜨는 이유 -> key = { }가 없기 때문
function App (){
return (
<div>
...
{ 글제목.map(function(a, i){
return (
<div className="list" key={i}>
<h3 onClick={ ()=>{ 누른제목변경(i) } }>{ a } <span>👍</span> </h3>
<p>2월 18일 발행</p>
<hr />
</div>
}) }
</div>
)
}
14. 글발행 기능 추가
원리: 입력된 값을 변수(서버, 데이터베이스)에 저장 후 이벤트 발생시 화면에 출력!
function App (){
let [글제목, 글제목변경] = useState(['남자코트추천', '강남우동맛집', '파이썬독학']);
let [입력값, 입력값변경] = useState('');
return (
<div>
HTML 잔뜩 있는 곳
<div className="publish">
<input onChange={ (e)=>{ 입력값변경(e.target.value) } } />
<button onClick={ ()=>{
let arrayCopy = [...글제목];
arrayCopy.unshift(입력값);
글제목변경( arrayCopy )
}}>저장</button>
</div>
</div>
)
}
15. class를 이용한 react 문법
- class: 데이터 / 함수를 보관하는 덩어리
- extends: 덩어리를 만들 때 오른쪽의 성질을 물려 받겠다는 의미
- extends []: [ ] =컴포넌트 성질을 갖고 있는 덩어리
- constructor(): 변수와 함수가 가득한 class 덩어리를 만들 때 새로운 것들을 넣는 공간
- super(): extends 했던 덩어리에 있던 변수들을 그대로 물려받겠다는 의미
class Profile extends React.Component {
constructor(){
super();
this.state = { name : 'Kim', age : 30 }
}
render(){
return (
<div>
<h3> 저는 { this.state.name } 입니다 </h3>
</div>
)
}
}
------------------------------------------------------------------------
이름 변경
class Profile extends React.Component {
constructor(){
super();
this.state = { name : 'Kim', age : 30 }
}
render(){
return (
<div>
<h3> 저는 { this.state.name } 입니다 </h3>
<button onClick={ ()=>{ this.setState( {name : 'Park'} ) } }> 버튼 </button>
</div>
)
}
}
------------------------------------------------------------------------
커스텀 함수로 이름 변경
// 1
class Profile extends React.Component {
constructor(){
super();
this.state = { name : 'Kim', age : 30 }
}
changeName = () => {
this.setState( {name : 'Park'} )
}
render(){
return (
<div>
<h3> 저는 { this.state.name } 입니다 </h3>
<button onClick={ this.changeName }> 버튼 </button>
</div>
)
}
}
// 2
class Profile extends React.Component {
constructor(){
super();
this.state = { name : 'Kim', age : 30 }
}
changeName() {
this.setState( {name : 'Park'} )
}
render(){
return (
<div>
<h3> 저는 { this.state.name } 입니다 </h3>
<button onClick={ this.changeName.bind(this) }> 버튼 </button>
</div>
)
}
}
※ Arrow function(내부의 this 키워드 값을 변화시키지 않고 싶을 때 사용) vs function() {}
-> Arrow function의 경우 안에 있는 this값을 재정의해주지 않기 때문에, 바깥에 있던 this의 값을 그대로 끌고와서 사용하지만, function() {} 의 경우 this값이 새롭게 변화함
16. react-Bootstrap -> 버전에 주의하면서 사용
※ React Bootstrap에서 코드 복사 붙여넣기 할때, Component명 import
https://react-bootstrap-v4.netlify.app/
메인화면 Get started -> Installation(버전 확인) -> (동일한 페이지 내) CDN 링크를 public 내 index.html에 추가 후 사용
<link
rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/css/bootstrap.min.css"
integrity="sha384-B0vP5xmATw1+K9KRQjQERJvTumQW0nPEzvF6L/Z6nronJ3oUOFUFpCjEUQouq2+l"
crossorigin="anonymous"
/>
17. import / export
// export
(data.js 파일)
var 중요데이터 = 'Kim';
export default 중요데이터;
// 변수명, 함수명, 자료형 전부 배출 가능
(data.js 파일)
var name1 = 'Kim';
var name2 = 'Park';
export { name1, name2 }
// 2개 이상 배출 시 사용
// import
(App.js 파일)
import 중요데이터 from './data.js';
(App.js 파일)
import { name1, name2 } from './data.js';
// 2개 이상 배출한 것을 사용할 때에는 배출한 것 그대로 사용
18. 같은 컴포넌트라도 다른 값을 전송받을 수 있음
function App(){
let [shoes, shoes변경] = useState(Data);
return (
<div className="App">
<Navbar></Navbar> (그 사이트에 있던 navbar 예제 어쩌구)
<Jumbotron></Jumbotron> (그 사이트에 있던 jumbotron 예제 어쩌구)
<div className="container">
<div className="row">
<Card shoes={shoes[0]} />
<Card shoes={shoes[1]} />
<Card shoes={shoes[2]} />
</div>
</div>
</div>
)
}
function Card(props){
return (
<div className="col-md-4">
<img src="https://codingapple1.github.io/shop/shoes1.jpg" width="100%" />
<h4>{ props.shoes.title }</h4>
<p>{ props.shoes.content } & { props.shoes.price }</p>
</div>
)
}
19. react-router
yarn add react-router-dom
npm install react-router-dom
import { BrowserRouter } from 'react-router-dom';
ReactDOM.render(
<React.StrictMode>
<BrowserRouter>(<HashRouther>)
<App/>
</BrowserRouter>(</HashRouter>
</React.StrictMode>
document.getElementById('root')
);
-> HashRouter = 사이트 방문시 URL 맨 뒤에 /#/이 붙은채로 시작
-> BrowserRouter = 기본
(App.js)
import 많은 곳;
import { Link, Route, Switch } from 'react-router-dom';
function App(){
return (
<div>
HTML 잔뜩있는 곳
<Route path="/">
<div>메인페이지인데요</div>
</Route>
<Route path="/detail">
<div>상세페이지인데요</div>
</Route>
</div>
)
}
<Route path="/어쩌구" component={Card} ></Route>
(<Route path="/어쩌구"> <Card/> </Route>)
-> 위의 두 줄로도 표현 가능
<Route exact path="/">
<div>메인페이지에요</div>
</Route>
20. React - Link, Switch
(App.js 파일)
function App(){
return (
<div>
<Navbar>
<Nav.Link> <Link to="/">Home</Link> </Nav.Link>
<Nav.Link> <Link to="/detail">Detail</Link> </Nav.Link>
</Navbar>
<나머지HTML/>
</div>
)
}
useHistory(hook)
(Detail.js 파일)
import React from 'react';
import { useHistory } from 'react-router-dom';
function Detail(){
let history = useHistory();
return (
<div className="container">
<div className="row">
<div className="col-md-6">
<img src="https://codingapple1.github.io/shop/shoes1.jpg" width="100%" />
</div>
<div className="col-md-6 mt-4">
<h4 className="pt-5">상품명</h4>
<p>상품설명</p>
<p>120000원</p>
<button className="btn btn-danger">주문하기</button>
<button className="btn btn-danger">뒤로가기</button>
</div>
</div>
</div>
)
};
export default Detail
Switch: Route들을 전부 보여주지 말고 한번에 하나만 보는 것
(App.js 파일)
function App(){
return (
<div>
<나머지HTML/>
<Switch>
<Route exact path="/">
어쩌구
</Route>
<Route path="/detail">
<Detail/>
</Route>
<Route path="/:id">
<div>새로 만든 route입니다</div>
</Route>
</Switch>
</div>
)
}
21. useParams
(Detail.js 파일)
import React from 'react';
import { useHistory, useParams } from 'react-router-dom';
function Detail(props){
let { id } = useParams();
return (
<div className="container">
<div className="row">
<div className="col-md-6">
<img src="https://codingapple1.github.io/shop/shoes1.jpg" width="100%" />
</div>
<div className="col-md-6 mt-4">
<h4 className="pt-5">{props.shoes[id].title}</h4>
<p>{props.shoes[id].content}</p>
<p>{props.shoes[id].price}원</p>
<button className="btn btn-danger">주문하기</button>
</div>
</div>
</div>
)
};
export default Detail
22. styled-component
yarn add styled-components
npm install styled-components
import styled from 'styled-components'
import React, { useState } from 'react';
import styled from 'styled-components';
let 박스 = styled.div`
padding : 20px;
`;
let 제목 = styled.h4`
font-size : 25px;
color : ${ props => props.색상 };
`;
function Detail(){
return (
<div>
<HTML 많은 곳/>
<박스>
<제목 색상="blue">안녕하세요1</제목>
<제목 색상={'red'}>안녕하세요2</제목>
</박스>
</div>
)
}
23. SASS(SCSS): css를 변수, 반복문, 함수 등 사용 가능하게
$변수명 : 집어넣을 값;
yarn add node-sass
npm install node-sass
(Detail.scss 파일)
.red {
color : red;
}
(Detail.scss)
$메인칼라 : #ff0000;
.red {
color : $메인칼라;
}
@import './경로'
@import './어쩌구.css';
body {
margin : 0;
}
div {
box-sizing : border-box;
}
nesting
보통의 css
div.container h4 {
color : blue;
}
div.container p {
color : green;
}
SASS(SCSS)
div.container {
h4 {
color : blue;
}
p {
color : green;
}
}
extends
(Detail.scss 파일)
.my-alert {
background : #eeeeee;
padding : 15px;
border-radius : 5px;
max-width : 500px;
width : 100%;
margin : auto;
}
.my-alert2 {
@extend .my-alert;
background : yellow;
}
.my-alert p {
margin-bottom : 0;
}
@mixin / @include : 함수 사용을 위한 문법
사용시, 함수를 먼저 작성한 후 밑에서 사용해야함(순차적)
(Detail.scss 파일)
@mixin 함수() {
background : #eeeeee;
padding : 15px;
border-radius : 5px;
max-width : 500px;
width : 100%;
margin : auto;
}
.my-alert {
@include 함수()
}
.my-alert p {
margin-bottom : 0;
}
24. <Nav.Link> 안에 <Link> 사용 시 발생하는 warning 해결
<Nav.Link><Link to="/"> Home </Link></Nav.Link> 이 부분을
<Nav.Link as={Link} to="/"> Home </Nav.Link> 로 수정
25. Component의 Lifecycle Hook
class Detail2 extends React.Component {
componentDidMount(){
//Detail2 컴포넌트가 Mount 되고나서 실행할 코드
}
componentWillUnmount(){
//Detail2 컴포넌트가 Unmount 되기전에 실행할 코드
}
}
import React, {useState, useEffect} from 'react';
function Detail(){
useEffect(()=>{
//코드를 적습니다 여기
});
return (
<HTML많은곳/>
)
}
(Detail.js 파일)
function Detail(){
let [ alert, alert변경 ] = useState(true);
useEffect(()=>{
let 타이머 = setTimeout(()=>{ alert변경(false) }, 2000);
return () => {clearTimeout(타이머)};
}, [ alert ]); // alert라는 이름의 state가 변경이 될 때만 업데이트하고 실행 만약 []만 있다면, 컴포넌트가 업데이트 될때 절대 실행되지 않음(컴포넌트 로드시, 딱 한번만 실행하기 위한 방법)
return (
<HTML많은곳/>
{
alert === true
? (<div className="my-alert2">
<p>재고가 얼마 남지 않았습니다</p>
</div>)
: null
}
)
}
setTimeout 함수를 사용한다면 반드시 clearTimeout도 같이 사용할 것
26. Ajax = 서버에 새로고침없이 요청을 할 수 있게 도와주는 자바스크립트 코드
서버: 누군가 요청을 하면 데이터를 가져다주는 프로그램
요청: get(데이터, 웹 페이지 같은걸 읽고 싶을 떄 서버에 보내는 요청), post(데이터를 서버로 보내고 싶을 때 서버에 보내는 요청), ...
사용 방법
1. JQuery Ajax
2. Axios
3. fetch()
yarn add axios
npm install axios
----------------------------------------------------------
import 많은곳;
import axios from 'axios';
function App(){
return (
<HTML많은곳/>
<button className="btn btn-primary" onClick={()=>{
axios.get('GET요청할URL');
.then(()=>{ 요청성공시실행할코드 })
.catch(()=>{ 요청실패시실행할코드 })
}}>더보기</button>
)
}
27. [...a, ...b]
- a의 기존 state의 데이터를 괄호 벗겨서 여기에 넣고,
- b라는 ajax 성공시 받아오는 데이터도 괄호 벗겨서 여기에 넣기
- 이 둘을 모두 [ ]로 감싸서 array(object)로 만들기
'React & React Native' 카테고리의 다른 글
React Native - Hello World 출력 및 환경 설정 (0) | 2022.01.09 |
---|---|
React vs React Native (0) | 2021.12.28 |
mini blog with React (0) | 2021.12.26 |
React - Basic (0) | 2021.09.20 |
React (0) | 2021.08.15 |