예>
import daum from './assets/daum.png';
< img src={daum} width="100" height="100" />
< Child key={값|변수} key2={값|변수} />
function Child(파라미터) { <== JSON으로 전달됨
}
function Child({key1, key2}) {}
function Child({key1, key2=값}) {}
< Child>
값 (문자열, JSX)
< /Child>
function Child(파라미터) { <== JSON으로 전달됨
body는 파라미터.children으로 얻음
}
function App() {
// 이벤트 함수
function go () {}
return(
// JSX
);
}
onClick={이벤트함수명}
onClick={go}
onClick={arrow 함수}
onClick={()=> go(값)}
/////////////////////////////////////
const userList = [{username:"홍길동1",age:20, address:"서울1"},
{username:"홍길동2",age:50, address:"서울2"},
{username:"홍길동3",age:60, address:"서울3"}
];
// js
var result = userList.map(function(data, idx){
console.log(data,idx);
return data;
});
var result = userList.map((data, idx)=>{
return data;
});
var result = userList.map((data, idx)=>data);
console.log(result);
///////////////////////////////////
// 컴포넌트
function Avatar({username, age, address}){
return(
<span className="Avatar">
이름:{username}, 나이:{age}, 주소:{address}
</span>
);
}
function App() {
return (
<div className="App">
<h2>1.배열의 첨자이용해서 개별접근</h2>
회원1: 이름:{userList[0].username}, 나이:{userList[0].age}, 주소:{userList[0].address}<br></br>
회원2: 이름:{userList[1].username}, 나이:{userList[1].age}, 주소:{userList[1].address}<br></br>
회원3: 이름:{userList[2].username}, 나이:{userList[2].age}, 주소:{userList[2].address}<br></br>
<h2>2.Avatar 컴포넌트 이용</h2>
회원1: <Avatar {...userList[0]} /><br></br>
회원2: <Avatar {...userList[1]} /><br></br>
회원3: <Avatar {...userList[2]} /><br></br>
<h2>3.배열의 첨자 반복</h2>
{/*
var result = userList.map(function(data, idx){
console.log(data,idx);
return data;
});
var result = userList.map((data, idx)=>{
return data;
});
var result = userList.map((data, idx)=>data);
*/}
{
userList.map((data, idx)=>{
return <div key={idx}>회원{idx+1}: 이름:{data.username}, 나이:{data.age}, 주소:{data.address}</div>
})
}
<h2>4. Avatar 반복1</h2>
{
userList.map((data, idx)=>{
return <>
<Avatar key={idx} username={data.username} age={data.age} address={data.address}/><br></br>
</>
})
}
<h2>4. Avatar 반복2</h2>
{
userList.map((data, idx)=>{
return <>
<Avatar key={idx} {...data} /><br></br>
</>
})
}
</div>
);
}
export default App;
이전에는 클래스에서만 사용할 수 있는 기능이 있었음
React 16.8 이후부터는 클래스에서만 사용했던 기능을 함수에서도 사용할 수 있도록 지원됨 ==> hooks
주의할 점은 반드시 최상위 함수 (컴포넌트) 에서만 사용 가능하고 일반 함수, 반복문, 조건문 등에서는 사용 불가
props는 자식이 변경이 가능할까? 불가능. read only 이다
state는 변경이 가능하고 변경이 되면 자동 재랜더링이 된다 ⭐
state에 저장되는 값은 JS의 모든 데이터 가능 (문자, 숫자, JSON, 배열 등)
import { useState } from 'react';
const [ 변수, set메서드 ] = useState(변수초기값);
변수를 변경하기 위해서는 반드시 set 메서드를 사용해야 된다
const [ num, setNum ] = useState(0);
const [ arr, setArr ] = useState([]);
const [ user, setUser ] = useState({id:'', pw:''};
반드시 set 메서드를 써서 값을 변경해야된다
setNum(num+1);
{ 변수 }
예> { num }
=> 가장 쉽게 복사본을 만드는 방법은 spread 연산자를 이용하는 것
import logo from './logo.svg';
import './App.css';
import { useState } from 'react';
function App() {
const [userid, setUserid] = useState('');
function handleEvent(e) {
setUserid(e.target.value);
}
return (
<div className="App">
<h1>사용자입력 태그 + state 사용</h1>
입력값 : {userid}<br></br>
아이디 : <input type="text" name="userid" value={userid} onChange={handleEvent}/>
</div>
);
}
export default App;
let xxx = useRef(기본값);
예> < input ref={xxx} />
< Child ref={xxx} />
< Child ref={xxx=>xxx} />
xxx.current 속성으로 참조 가능
https://react.dev/reference/react/forwardRef
const Child=forwardRef(
(props, ref)=> { // props와 ref를 따로 받아야 됨.
console.log(props, ref);
return (
<div className="Child">
<h2>Child컴포넌ㅌ</h2>
아이디:<input />
</div>
);
} );
https://react.dev/reference/react/useImperativeHandle
const Child=forwardRef(
(props, ref)=> {
console.log(props, ref);
const input_ref = useRef(null);
// 방법1: 외부에서 작성된 함수 선언식 이용
useImperativeHandle(ref, ()=>({open2})); // ({함수명,함수명2})
//App에서 호출
function open2(){
console.log("open 메서드");
}
// 방법2: return {} 안에서 작성된 함수 선언식 이용
// https://react.dev/reference/react/useImperativeHandle 참조할 것.
useImperativeHandle(ref, ()=>{
return {
open(x){
console.log("open 메서드 >>>>>>>>>>>>>>", x);
},
close(){
console.log("close 메서드 >>>>>>>>>>>>>>");
},
input_value(){
return input_ref.current.value;
}
}
});
////////////////////////////////////
return (
<div className="Child">
<h2>Child컴포넌ㅌ</h2>
mesg:{props.mesg}<br></br>
아이디:<input ref={input_ref}/>
</div>
);
} );
export default Child;
# 부모 컴포넌트
function App() {
const xxx = useRef(null);
function handleEvent(){
// console.log("Child input값 출력:", xxx.current.value);
console.log("Child input값 출력:", xxx.current.input_value());
//Child open 메서드
xxx.current.open(100);
xxx.current.close();
}
return (
<div className="App">
<h2>App 컴포넌트</h2>
<Child ref={xxx} mesg="hello" /><br></br>
<button onClick={handleEvent}>Child의 input값 얻기</button>
</div>
);
}
export default App;
https://developer.mozilla.org/ko/docs/Web/HTML/Element/dialog 참고