[React]props 사용하는 방법
props란?
대표적으로 자식 컴포넌트가 부모 컴포넌트의 state를 공유하기 위해서 사용할 수 있습니다.
props 사용법
- <자식컴포넌트 작명={state명}/>
- 자식컴포넌트에서 props 파라미터 추가 후에 사용
props 사용 예제
1.제목 클릭한 값을 저장하기 위한 함수를 만들어준다.
let [클릭한제목, 클릭한제목변경] = useState(0);
2.제목 클릭 이벤트를 넣어준다.
{
글제목.map(function(글,i){
return(
<div className="list">
<h4 onClick={ ()=>{클릭한제목변경(i)}}>{ 글 } <span onClick={()=>{ 따봉변경(따봉 +1)}}>👍</span> {따봉}</h4>
<p>12월 17일 발행</p>
<hr/>
</div>
)
})
}
0번째 클릭시 0번 제목, 1번째 클릭시 1번 제목을 출력. i를 새로 만들어서 차례대로 값을 부여한다.
3.자식컴포넌트에 state를 전송한다.
// 1) <자식컴포넌트 작명={state명}/>
{
modal === true
? <Modal 글제목={글제목} 클릭한제목={클릭한제목}></Modal>
: null
}
// 2)자식컴포턴트에서 props 파라미터 입력 후 사용
function Modal(props){//부모에게 전달받은 props는 여기에 다 들어있음
return(
<div className="modal">
<h2>{ props.글제목[props.누른제목]}</h2>
<p>날짜</p>
<p>상세내용</p>
</div>
)
}
전체코드
App.js
/* eslint-disabl */
import React, {useState} from 'react';
import './App.css';
function App() {
let [글제목, 글제목변경] = useState(['남자 코트 추천','강남 우동 맛집','파이썬 독학']);
let [따봉, 따봉변경] = useState(0);
let [modal, modal변경] = useState(false);
let [클릭한제목, 클릭한제목변경] = useState(0);
function 제목바꾸기(){
var newArray = [...글제목];
newArray[0] = '여자 코트 변경';
newArray[1] = '연희동 맛집 추천'
글제목변경(newArray);
}
return (
<div className="App">
<div className="black-nav">
<div>개발 Blog</div>
</div>
<button onClick={제목바꾸기}>버튼</button>
{
글제목.map(function(글,i){
return (
<div className="list">
<h3 onClick={()=>{modal변경(!modal); 클릭한제목변경(i)}}> { 글 } <span onClick={ ()=>{ 따봉변경(따봉+1)} }>👍</span>{따봉}</h3>
<p>12월 17일 발행</p>
<hr/>
</div>
)
})
}
{
modal === true
? <Modal 글제목={글제목} 클릭한제목={클릭한제목}></Modal> // 1.<자식컴포넌트 작명={state명}/>
: null
}
</div>
);
}
function Modal(props){
return(
<div className="modal">
<h2>{ props.글제목[props.클릭한제목] // 2.자식컴포넌트에서 props 파라미터 추가 후에 사용
}</h2>
<p>날짜</p>
<p>상세내용</p>
</div>
)
}
export default App;
App.css
.App {
text-align: center;
}
body {
font-family: "nanumsquare";
}
.modal {
margin-top: 20px;
padding: 20px;
background: #eee;
}
.black-nav {
background-color: black;
width: 100%;
display: flex;
color: white;
padding: 20px;
font-weight: 600;
font-size: 20px;
}
.list {
margin-top: 30px;
text-align: left;
padding-left: 20px;
padding-right: 20px;
}
.App-logo {
height: 40vmin;
pointer-events: none;
}
@media (prefers-reduced-motion: no-preference) {
.App-logo {
animation: App-logo-spin infinite 20s linear;
}
}
.App-header {
background-color: #282c34;
min-height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
font-size: calc(10px + 2vmin);
color: white;
}
.App-link {
color: #61dafb;
}
@keyframes App-logo-spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}