contact
------------------------------------------------------InlineBox.js
export default function InlineBox({bgColor,letter}){
const style={
padding:"10px",
margin:"10px",
backgroundColor:bgColor,
color:"#333",
display:"inline-block",
fontSize:"50px",
fontFamily:"맑은 고딕",
textAlign:"center"
}
return(
<div style={style}>{letter}</div>
);
}
------------------------------------------------------InlineApp.js
import InlineBox from "./InlineBox";
export default function InlineApp(){
return(
<div>
<InlineBox letter="A" bgColor="#EEE"/>
<InlineBox letter="E" bgColor="#CCC"/>
<InlineBox letter="I" bgColor="#AAA"/>
<InlineBox letter="O" bgColor="#999"/>
<InlineBox letter="U" bgColor="#888"/>
</div>
);
}

함수형 컴포넌트는 라이프사이클을 사용할 수 없다
const [number, setNumber] = useState(0);

---------------------------------------------------------------UseRefTest
import { useRef } from "react";
export default function RefComponent(){
const nameRef = useRef()
function click(){
const nameInput=nameRef.current // current는 Ref가 연결되어있는 태그
console.log(nameInput)
console.dir(nameInput)
console.log(nameInput.dataset["name"])
console.log(nameInput.value)
if(nameInput.value==""){
alert("이름을 입력하세요")
nameInput.value="이름은 필수값 입니다."
nameInput.focus()
}
}
return(
<div>
<input data-name="111" ref={nameRef}/>
<button onClick={click}>클릭!</button>
</div>
);
}
import { useRef, useState } from "react";
export default function MemberList(){
const [memberData, setMembertData]= useState([]);
const nameRef=useRef()
const ageRef=useRef()
const addressRef=useRef()
function save(){
const nameInput=nameRef.current
const ageInput=ageRef.current
const addressInput=addressRef.current
let data=[...memberData]
data.push({username:nameInput.value, age:ageInput.value, address:addressInput.value});
setMembertData(data);
}
return(
<div>
<div>
<label htmlFor="name">이름</label>
<input type="text" id="name" ref={nameRef}/>
</div>
<div>
<label htmlFor="age">나이</label>
<input type="text" id="age" ref={ageRef}/>
</div>
<div>
<label htmlFor="address">주소</label>
<input type="text" id="address" ref={addressRef}/>
</div>
<div>
<button onClick={()=>save()}>저장</button>
</div>
<Member memberData={memberData}/>
</div>
);
}
function Member({memberData}){
return(
<>
{
memberData.map((value,index)=>
<div key={index}>
<span>{value.username}</span>
<span>{value.age}</span>
<span>{value.address}</span>
</div>)
}
</>
);
}
useRef를 Props로 보낼려면 forwardRef가 필요하다
----------------------------------------------------------------------------------------------userEffectTest.js
import { useEffect, useState } from "react";
export default function EffectComponent(){
const [memberData, setMembertData]=useState([])
const [name,setName]=useState("")
const [age,setAge]=useState("")
const [address,setAddress]=useState("")
useEffect(()=>{
console.log(`이함수는 props 또는 state중 하나라도 변경이 된다면 무조건 실행하는 함수입니다.`)
})//의존배열 파라미터가 없다면 컴포넌트가 갱신될때마다 실행된다.
// Lifecycle: componentDidMount, componentDidUpdate
useEffect(()=>{
console.log(`이 함수는 컴포넌트가 처음으로 만들어질 때에만 실행되는 함수입니다.`)
},[]) //의존 배열 파라미터가 []라면 컴포넌트가 만들어 질 때에만 실행된다.
// Lifecycle : componentDidMount
useEffect(()=>{
console.log(`이함수는 컴포넌트의 name state가 변경되었을 때에만 실행되는 함수입니다.`)
},[name])//Lifecycle : componentDidUpdate
// 쿠팡이 react로 만들었다면 카테고리
useEffect(()=>{
console.log(`이 함수는 컴포넌트의 age,address, memberData state중 하나라도 변경이 되었을때 실행되는 함수입니다.`)
},[age,address,memberData])//Lifecycle : componentDidUpdate
function changeName(){
setName(Math.random())
}
function changeAge(){
setAge(Math.random())
}
function changeAddress(){
setAddress(Math.random())
}
function changeMemberData(){
let data=[...memberData]
data.push({name,age,address})
setMembertData(data)
}
return (
<div>
<button onClick={changeName}>이름 변경하기</button>
<button onClick={changeAge}>나이 변경하기</button>
<button onClick={changeAddress}>주소 변경하기</button>
<button onClick={changeMemberData}>목록 변경하기</button>
</div>
);
}


Reducer
Dispatch
Action