Single Page Application을 만들 때 사용한다.
HTML 재사용이 편리한다.
비슷한 문법으로 앱개발 또한 가능하다.(React Native)
사실 React는 HTML, CSS, JavaScript를 이용한 웹 개발을 편리하게 해주는 도구일 뿐이다. 따라서 HTML, CSS, JavaScript의 근간은 알고 있어야 한다.
<div className="black-nav">
<h4>I'm Blog</h4>
</div>
<h4 id={post} style={{ color: "red" }, { fontSize: '16px' } }>
I'm Blog
</h4>
return (
<div></div>
<div></div>
);
import { useState } from "react";
let [title, setTitle] = useState('남자 코트 추천');
// a는 state에 보관한 자료, b는 state 변경을 도와주는 함수이다.
// let [title, setTitle]과 같은 문법은 자바스크립트에서 Destructuring이라는 문법이다.
let [a, b] = [1, 2];
let post = "강남 우동 맛집";
let [title, setTitle1] = useState(['남자 코트 추천', '강남 우동 맛집', '파이썬 독학']);
/* eslint-disable */
{/* HTML 요소를 '클릭'했을 때 자바스크립트 코드가 동작하도록 해주는 것이 onClick이다. */}
{/* 대신 onClick 안에는 항상 '함수 이름'을 넣어야 한다. */}
<h4>{title[0]} <span onClick={func}> 👍 </span> {good} </h4>
{/* 밑의 경우와 같이 함수를 바로 만들어 넣어도 상관 없다. arrow function */}
{/* <h4>{title[0]} <span onClick={() => {console.log(1)}}> 👍 </span> {good} </h4> */}
<p>{date}</p>
<h4>{title[0]} <span onClick={() => {setGood(good + 1)}}> 👍 </span> {good} </h4>
<button
onClick={() => {
let copy = [...title];
copy[0] = "여자 코트 추천";
setTitle(copy);
}}
>
Title 수정
</button>
state 동작 방식
만약 위의 코드를 다음과 같이 썼다면,
<button
onClick={() => {
let copy = title;
copy[0] = "여자 코트 추천";
setTitle(copy);
}}
>
Title 수정
</button>
let arr = [1, 2, 3];
let copy1 = arr;
let copy2 = [...arr];
console.log(arr === copy1); // true
console.log(arr === copy2); // false
<button onClick={() => {
let copy = [...title];
copy = copy.sort();
setTitle(copy);
}}>가나다순 정렬</button>
{/* Modal */}
<div className="modal">
<h4>제목</h4>
<p>날짜</p>
<p>상세 내용</p>
</div>
위의 코드를
<Modal></Modal>
이렇게 간단하게 만들어주는 것이 component이다.
function Modal() {
return (
<div className="modal">
<h4>제목</h4>
<p>날짜</p>
<p>상세 내용</p>
</div>
<div>
<h4>이렇게 병렬적으로 하면 안됨!</h4>
</div>
);
}
function Modal() {
return (
<>
<div className="modal">
<h4>제목</h4>
<p>날짜</p>
<p>상세 내용</p>
</div>
<div>
<h4>이렇게 fragment를 써서 병렬적으로 짤 수도 있다.</h4>
</div>
</>
);
}
// const로 만들면
// Modal = 123; 등 재할당하려고 하면 에러를 출력해준다.
// 에러를 잡기 쉬워서 const로 자주 사용하곤 한다.
// 밑에 처럼해도 똑같이 컴포넌트를 만들 수 있다.
const Modal = () => {
return (
<>
<div className="modal">
<h4>제목</h4>
<p>날짜</p>
<p>상세 내용</p>
</div>
<div>
<h4>이렇게 fragment를 써서 병렬적으로 짤 수도 있다.</h4>
</div>
</>
);
};
<div className="list" onClick={() => {
if (modal === false) {
setModal(true);
} else {
setModal(false);
}
}}>
<h4>{title[2]}</h4>
<p>{date}</p>
</div>
{/* Modal */}
{/* 여기는 HTML 작성 공간이라서 JavaScript의 if문 등을 쓸 수 없다. 근데 삼항 연산자는 가능하다. */}
{
modal === true ? <Modal></Modal> : null
}
<div
className="list"
onClick={() => {
setModal(!modal);
}}
>
{title.map(function (element, index) {
return (
<div className="list" key={index}>
<h4>{title[index]}</h4>
<p>{date}</p>
</div>
);
})}
function For() {
let arr = Array();
for (let i = 0; i < 3; i++) {
arr.push(<div>for문으로 HTML 반복</div>);
}
return (
<div>
{arr}
</div>
)
}
...
{/* <For></For> */}
let [good, setGood] = useState([0, 0, 0]);
...
{title.map(function (element, index) {
return (
<div className="list" key={index}>
<h4 onClick={() => setModal(!modal)}>{title[index]}</h4>
<span onClick={() => {
let newGood = [...good];
newGood[index] += 1;
setGood(newGood);
}}> 👍 </span> {good[index]}
<p>{date}</p>
</div>
);
})}
<Modal title={title}></Modal>
...
function Modal(props) {
return (
<div className="modal">
<h4>{props.title}</h4>
<p>날짜</p>
<p>상세 내용</p>
</div>
);
}
let [date, setDate] = useState("2월 17일 발행");
...
{title.map(function (element, index) {
return (
<div className="list" key={index}>
<h4 onClick={() => {
setModal(true);
setTitleIndex(index);
}}>{title[index]}</h4>
<span onClick={() => {
let newGood = [...good];
newGood[index] += 1;
setGood(newGood);
}}> 👍 </span> {good[index]}
<p>{date}</p>
</div>
);
})}
event.stopPropagation();
<input
onChange={(event) => {
// console.log(event.target);
setInputValue(event.target.value);
console.log(inputValue);
}}
></input>
/* eslint-disable */
import logo from "./logo.svg";
import "./App.css"; // src 폴더에서 App.css 파일을 사용하겠다.
import { useState } from "react";
function App() {
let post = "강남 우동 맛집";
// 바닐라 자바스크립트를 썼을 때의 방식
// document.querySelector('#temp').innerHTML = post;
let [title, setTitle] = useState([
"남자 코트 추천",
"강남 우동 맛집",
"파이썬 독학",
]);
// a는 state에 보관한 자료, b는 state 변경을 도와주는 함수이다.
let [good, setGood] = useState([0, 0, 0]);
let [modal, setModal] = useState(false);
let [titleIndex, setTitleIndex] = useState(0);
let [inputValue, setInputValue] = useState('');
let [logo, setLogo] = useState("React Blog");
let temp = new Date();
// temp = temp.getFullYear() + '년 ' + (temp.getMonth() + 1) + '월 ' + temp.getDate() + '일';
temp = temp.toLocaleString();
let [date, setDate] = useState([temp, temp, temp]);
// let [title, setTitle]과 같은 문법은 자바스크립트에서 Destructuring이라는 문법이다.
// let [a, b] = [1, 2];
return (
<div className="App">
<div className="black-nav">
{/* 사실 사이트 제목과 같은 것들은 state로 저장할 필요는 딱히 없다. 따라서 {logo}로 하기 보다는 그냥 React Blog라고 해주는 것이 오히려 좋을 수 있다. */}
<h4 style={{ color: "red", fontSize: "16px" }}>{logo}</h4>
</div>
<div className="nav-button">
<button
className="button"
onClick={() => {
let copy = [...title];
copy = copy.sort();
setTitle(copy);
}}
>
가나다순 정렬
</button>
<button
className="button"
onClick={() => {
let copy = [...title];
copy[0] = "여자 코트 추천";
setTitle(copy);
}}
>
Title 수정
</button>
</div>
{/* 단순히 중괄호 {} 안에 변수를 작성하면서, 바닐라 자바스크립트만 사용했을 때보다 더 편리하게 작성이 가능하다. */}
<h4 id="temp">{post}</h4>
{/* <div className="list"> */}
{/* 좋아요 갯수도 자주 바뀌니 state로 바꿔보자. */}
{/* HTML 요소를 '클릭'했을 때 자바스크립트 코드가 동작하도록 해주는 것이 onClick이다. */}
{/* 대신 onClick 안에는 항상 '함수 이름'을 넣어야 한다. */}
{/* <h4>
{title[0]}{" "}
<span
onClick={() => {
setGood(good + 1);
}}
>
{" "}
👍{" "}
</span>{" "}
{good}{" "}
</h4> */}
{/* 밑의 경우와 같이 함수를 바로 만들어 넣어도 상관 없다. arrow function */}
{/* <h4>{title[0]} <span onClick={() => {console.log(1)}}> 👍 </span> {good} </h4> */}
{/* <p>{date}</p> */}
{/* </div> */}
{/* <div className="list">
<h4>{title[1]}</h4>
<p>{date}</p>
</div> */}
{/* <div
className="list"
onClick={() => {
setModal(!modal);
}}
>
<h4>{title[2]}</h4>
<p>{date}</p>
</div> */}
{/* map을 활용해 HTML 반복 */}
{/* 중괄호 안에서는 for문 사용이 불가하여 map을 사용한다. */}
{title.map(function (element, index) {
return (
<div className="list" key={index}>
<h4
onClick={() => {
setModal(true);
setTitleIndex(index);
}}
>
{title[index]}
<span
onClick={(event) => {
event.stopPropagation();
let newGood = [...good];
newGood[index] += 1;
setGood(newGood);
}}
>
{" "}
👍{" "}
</span>{" "}
<span onClick={(event) => {
event.stopPropagation();
}}>{good[index]}{" "}</span>
</h4>
<p>{date[index]}</p>
<button onClick={() => {
let newTitle = [...title];
let newGood = [...good];
let newDate = [...date];
newTitle.splice(index, 1);
newGood.splice(index, 1);
newDate.splice(index, 1);
setTitle(newTitle);
setGood(newGood);
setDate(newDate);
}}>삭제</button>
</div>
);
})}
<input
onChange={(event) => {
setInputValue(event.target.value);
}}
></input>
<button onClick={() => {
if (inputValue === '') {
alert('제목을 입력해주세요.');
return;
}
let temp = new Date();
temp = temp.toLocaleString();
let newTitle = [...title];
let newGood = [...good];
let newDate = [...date];
newTitle.unshift(inputValue);
newGood.unshift(0);
newDate.unshift(temp);
setTitle(newTitle);
setGood(newGood);
setDate(newDate);
}}>글 등록</button>
{/* for문을 활용해 HTML 반복 */}
{/* <For></For> */}
{/* Modal */}
{/* 여기는 HTML 작성 공간이라서 JavaScript의 if문 등을 쓸 수 없다. 근데 삼항 연산자는 가능하다. */}
{modal === true ? (
<Modal
index={titleIndex}
setTitle={setTitle}
color="skyblue"
title={title}
></Modal>
) : null}
</div>
);
}
function Modal(props) {
return (
<div className="modal" style={{ background: props.color }}>
<h4>{props.title[props.index]}</h4>
<p>날짜</p>
<p>상세 내용</p>
<button
onClick={() => {
let newTitle = [...props.title];
newTitle[0] = "여자 코트 추천";
props.setTitle(newTitle);
}}
>
Title 수정
</button>
</div>
);
}
// function For() {
// let arr = Array();
// for (let i = 0; i < 3; i++) {
// arr.push(<div>for문으로 HTML 반복</div>);
// }
// return (
// <div>
// {arr}
// </div>
// )
// }
export default App;
function App(){
return (
<div>
HTML 잔뜩있는 곳
<Profile />
</div>
)
}
class Profile extends React.Component {
constructor(){
super();
}
render(){
return (
<div>프로필영역입니다</div>
)
}
}