2021. 10. 15. 01:10ㆍ작업/React
1번 첫번째 커밋 정답
//index.js
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
ReactDOM.render(
<React.StrictMode>
<App />
</React.StrictMode>,
document.querySelector('#root')
);
// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();
//App.js
import logo from './logo.svg';
import './App.css';
function ArticleTag() {
return (
<article>
<h2>안녕</h2>
Hello,WEB
</article>
)
}
function App() {
return (
<div>
<header></header>
<nav>
<ol>
<li><a href="1.html">html</a></li>
<li><a href="2.html">css</a></li>
</ol>
</nav>
<ArticleTag></ArticleTag>
</div>
);
}
export default App;
2번 컴포넌트화 정답
//App.js
import logo from './logo.svg';
import './App.css';
function Article() {
return (
<article>
<h2>안녕</h2>
Hello,WEB
</article>
)
}
function Nav() {
return (
<nav>
<ol>
<li><a href="1.html">html</a></li>
<li><a href="2.html">css</a></li>
</ol>
</nav>
);
}
function Header() {
return <header><a href="index.html">WEB</a></header>;
}
function App() {
return (
<div>
<Header></Header>
<Nav></Nav>
<Article></Article>
</div>
);
}
export default App;
3번 Article에 props를 적용해서 보다 쓸모있는 콤포넌트 만들기 정답
//App.js
import logo from './logo.svg';
import './App.css';
function Article(myprops) {
return (
//안녕 대신 원하는 title과 body를 입력받고 싶다. props사용
<article>
<h2>{myprops.title}</h2>
{myprops.body}
</article>
)
}
function Nav() {
return (
<nav>
<ol>
<li><a href="1.html">html</a></li>
<li><a href="2.html">css</a></li>
</ol>
</nav>
);
}
function Header() {
return <header><a href="index.html">WEB</a></header>;
}
function App() {
return (
//아까 Article 만들 때 props값 넣어준 거 태그에서 입력해준다.
<div>
<Header></Header>
<Nav></Nav>
<Article title="HTML" body="HTML is..."></Article>
<Article title="CSS" body="CSS is..."></Article>
</div>
);
}
export default App;
잠깐, 컴포넌트 정의할 때 넣는 인자 props에 대해 궁금증이 생겨 정리를 하고 간다.
https://velog.io/@lilys2/React-PropsStateEventHook-%EC%A0%95%EB%A6%AC
[React] Props,State,Event,Hook 정리
211008 온라인 강의 복습 내용입니다. 리액트에서 props와 state를 적절한 event와 hook을 이용해서 다룰 수 있습니다.
velog.io
동료 분의 글을 참고하였다.
Props
- 컴포넌트에 원하는 값을 넘겨줄 때 사용한다.
- num,str,obj,func,array 등 자바스크립트의 요소라면 제한이 없다.
- 컴포넌트의 재사용성을 위해 사용한다.
- 읽기 전용이라 값 변경이 불가하다.
- 값을 변경하고자 하면 newProps를 생성해서 사용해야 한다.
1. 기본 props를 활용한 컴포넌트 만들기
//App.js
import Info from "./Info";
import "./App.css";
function App() {
return (
<div className="App">
<Info memberName="아이유" />
</div>
);
}
export default App;
//Info.js
import React from "react";
function Info(props) {
const memberName = props.memberName;
return <h1>멤버 이름은 {memberName}입니다.</h1>;
}
//위 h1태그에서 {memberName}으로 중괄호를 친 이유는 변수이기 때문이다.
//태그상에서 변수를 text로 출력할 때는 저렇게 중괄호를 쳐주는 것 같다.
export default Info;
결과> 멤버 이름은 아이유입니다.
2. 객체 props 받고 연산하기
object를 props로 넘겨주면 .을 통해 object의 속성에 접근하여 값을 불러올 수 있다.
props로 넣은 member 객체의 .name, .age, .role 에 접근했다.
//Member.js
import React from "react";
// 아까와 다르게 props자리에 중괄호가 들어갔다.
// 변수나 그런 의미는 아니고 object를 넣으라는 뜻인 것 같다.
function Member({ member }) {
let isAdult = member.age >= 20 ? "성인" : "미성년자";
return (
<>
<p>
멤버의 이름은 {member.name}이고 현재 {isAdult} 입니다.멤버의 이름은 {member.name}이고 포지션은 {member.role}이며, 현재{" "}
{isAdult} 입니다.
</p>
</>
);
}
export default Member;
//App.js
import Info from "./Info";
import "./App.css";
import Member from "./Member";
function App() {
const member1 = {
name: "박시은",
age: "21",
role: "메인 보컬",
};
const member2 = {
name: "김채영",
age: "20",
role: "리드 보컬",
};
const member3 = {
name: "장재이",
age: "17",
role: "서브 보컬",
};
return (
<div className="App">
<Member member={member1} />
<Member member={member2} />
<Member member={member3} />
</div>
);
}
//여기서의 중괄호는 변수(const) member1을 가지고 오라는 뜻
export default App;
4번 Header를 컴포넌트화 정답
import logo from './logo.svg';
import './App.css';
function Article(myprops) {
return (
//안녕 대신 원하는 title과 body를 입력받고 싶다. props사용
<article>
<h2>{myprops.title}</h2>
{myprops.body}
</article>
)
}
function Nav() {
return (
<nav>
<ol>
<li><a href="1.html">html</a></li>
<li><a href="2.html">css</a></li>
</ol>
</nav>
);
}
function Header(myprops) {
return <header><a href="index.html">{myprops.title}</a></header>;
}
function App() {
return (
//아까 Article 만들 때 props값 넣어준 거 태그에서 입력해준다.
<div>
<Header title='WEB'></Header>
<Nav></Nav>
<Article title="HTML" body="HTML is..."></Article>
<Article title="CSS" body="CSS is..."></Article>
</div>
);
}
export default App;
5번 복합적인 데이터를 반복문 이용해서 복수의 태그를 생성하기
정답
![](https://blog.kakaocdn.net/dn/MVGyj/btriaUhuToz/Kak38qUGBQqNIA3G5A42p1/img.png)
![](https://blog.kakaocdn.net/dn/bQAIZu/btrh7xVhHGl/dGWuGCFB2Jstz9IGdp8uZ1/img.png)
6번 링크화
정답
7번 사용자 정의 이벤트를 구현하는 방법
![](https://blog.kakaocdn.net/dn/9ldHc/btricEeaKnO/VKVaNi9HlXz3jOKwvSGKJ0/img.png)
![](https://blog.kakaocdn.net/dn/bpf87f/btrh6JuoE2n/ktSfA0TckI3GeIzuk2Jcx0/img.png)
다만 헷갈리는 것.. 내가 만든 게 onSelect,myHandler이냐? 아니면 myHandler만이냐??
onSelect가 원래 있는 함수인지 헷갈림..
8번 네비게이션을 위한 select 이벤트 기능 구현
정답
9번 상태를 도입해서 컴포넌트를 다시 랜더링 할 수 있게 되었다! READ 모드와 WELCOME 모드 대박
정답
10번 네비게이션에서 선택한 글을 표시할 수 있게 되었다
정답
11번 CREATE UI를 출력하기 위한 이벤트 구현
정답
일단 Let's Create가 있어야 하므로 Control 태그를 만든다.
![](https://blog.kakaocdn.net/dn/boydbZ/btripGCLTDB/3M9jQQBIZGRnUY0rZkfRXk/img.png)
![](https://blog.kakaocdn.net/dn/bVe8jc/btripwUstWH/B2U0BrNbu2GgwqKqVjduqk/img.png)
![](https://blog.kakaocdn.net/dn/lVijW/btripE52Mba/MiTGsC3k9PLNO3ta7jwix0/img.png)
CREATE 모드이면 article 부분을 Create태그로 작성한다. onCreate prop으로 인한 createHandler로 인해 topics에 title과 body를 추가하고, Create모드일 때만 Create 화면이 생긴다. 그리고 일단 다시 READ모드로 전환해놓는다.
![](https://blog.kakaocdn.net/dn/cm5fn4/btrimHQrNMO/4fdxhJBAJHE9S3ii5YgAhk/img.png)
그럼 이제 Create 화면이 생겼을 것이다. Create 태그를 보자.
![](https://blog.kakaocdn.net/dn/eAkc0f/btrinQsz40L/uTdVf9SdyRqLViZYof2rkK/img.png)
Create태그의 return을 보면 Create라는 제목과 title,body를 입력할 수 있는 input과 input인데 좀 크게 생긴 textarea태그, 제출부분인 input이 포함되어 있다. (참고로 여기서 form의 자식태그 중 type='submit'인 애가 제출 버튼이다.)
걔를 누르면 onSubmit prop의 이벤트로 submitHandler가 실행된다. form태그의 기본 제공되는 속성이다.
submitHandler는 Create의 onCreate prop으로 input으로 받은(ev.target.어쩌구) title과 body를 전달해준다.
![](https://blog.kakaocdn.net/dn/kNyUz/btrinAwwL0L/3Ei3gIBSgbx3kVt0VBPPak/img.png)
그럼 이제 READ모드니까 아까로 다시 돌아와서 title에 title을 넣고 body에 body를 넣은 {articleComp}로 본문을 출력해보인다.
![](https://blog.kakaocdn.net/dn/bpJQc4/btriiu5BITC/Ph88GqdzBJ6qvH7Z2jx4H1/img.png)
![](https://blog.kakaocdn.net/dn/bFe3ir/btrin09AnhX/nkagLKCKAAP739Kg4ojAD1/img.png)
12번 DELETE를 구현
정답
![](https://blog.kakaocdn.net/dn/bxIKYJ/btrimIaOP0X/qVF5Kq1CALHEVYYw9xmJKK/img.png)
![](https://blog.kakaocdn.net/dn/LlU3t/btriopO8g1F/Th7k8gH6xVoNyS1sPumhV0/img.png)
![](https://blog.kakaocdn.net/dn/93SGj/btrim5cN5KW/w4rPiTZkt6EKVhwudFpyXk/img.png)
참고로 <p><input type="text" name='title' defaultValue='a' /></p> 이렇게 하면 사용자가 치기 전에 input 태그의 defaultValue 가 a로 떠있다는 말이다.
13번 Update 구현
정답
![](https://blog.kakaocdn.net/dn/S17g1/btriRLLcA6H/NRdrX9oae5k6vIQRzHzGvk/img.png)
![](https://blog.kakaocdn.net/dn/bvunrN/btriQ6IPTU7/5S4mU1SgkTwvtNT1y9hcl1/img.png)
![](https://blog.kakaocdn.net/dn/2L7le/btriSKkKJek/kVikRGfQQzj2zJS2kQlinK/img.png)
![](https://blog.kakaocdn.net/dn/vfTbO/btriKxUKWXS/sYQmNzIy74jRraSM9a8ijk/img.png)
'작업 > React' 카테고리의 다른 글
(시험용) 21.10.16 4주차 복습 - 10.14일차 (0) | 2021.10.16 |
---|---|
(시험용) 21.10.16 4주차 복습 - 10.13일차 (0) | 2021.10.16 |
21.10.16 useParams란? (0) | 2021.10.16 |
21.10.16 useEffect란? (0) | 2021.10.16 |
21.10.13 4주차 리엑트 - Welcome Homepage와 Login page만들기 로그인 페이지 예제 (0) | 2021.10.13 |