useState, 이벤트, hook
2024. 3. 17. 22:06ㆍDaily Codig Reminder
자식에게이벤트전달패턴
import React from 'react';
import TabButton from './assets/components/TabButton';
function App() {
//부모에서 자식 이벤트 핸들러 구현
function handleEvent(){
console.log("hellobutton");
}
//App컴포넌트 실행횟수 체트 => 실행하면 1번만 호출됨
console.log("App Component")
return (
<div>
{/*onSelect 대신에 임의의 값 사용가능
자식 호출 시 이벤트 함수 를 전달함
매우 많이 사용되는 중요한 패턴임*/}
<TabButton onSelect={handleEvent}>Java</TabButton>
<TabButton onSelect={handleEvent}>SQL</TabButton>
<TabButton onSelect={handleEvent}>SPRING</TabButton>
<TabButton onSelect={handleEvent}>SpringBoot</TabButton>
<TabButton onSelect={handleEvent}>Vue</TabButton>
</div>
);
}
export default App;
import React from 'react';
function TabButton({children, onSelect}) {
console.log("TableButton Component");
return(
<div>
<button onClick={onSelect}>{children}</button>
</div>
);
}
export default TabButton;
자식에게이벤트전달패턴2동적처리_화면갱신은안됨
import React from 'react';
import TabButton from './components/TabButton';
function App() {
var x ="버튼을 선택하세요";
//부모에서 자식 이벤트 핸들러 구현
function handleEvent(selectedButton){
console.log("hellobutton",selectedButton);
//일반적인 변수는 화면 갱신이 안됨, 왜냐하면 app이 한번만 실행되기 때문
x = selectedButton; //useState hook을 이용하여 해결
console.log("x===============",x);
}
//App컴포넌트 실행횟수 체트 => 실행하면 1번만 호출됨
console.log("App Component")
return (
<div>
{/*onSelect 대신에 임의의 값 사용가능
자식 호출 시 이벤트 함수 를 전달함
매우 많이 사용되는 중요한 패턴임*/}
<TabButton onSelect={(e)=>handleEvent("Java")}>Java</TabButton>
<TabButton onSelect={(e)=> handleEvent("SQL")}>SQL</TabButton>
<TabButton onSelect={(e)=>handleEvent("spring")}>SPRING</TabButton>
<TabButton onSelect={(e)=>handleEvent("springboot")}>SpringBoot</TabButton>
<TabButton onSelect={(e)=>handleEvent("Vue")}>Vue</TabButton>
<h3>선택된 출력값: {x}</h3>
</div>
);
}
export default App;
import React from 'react';
function TabButton({children, onSelect}) {
console.log("TableButton Component");
return(
<div>
<button onClick={onSelect}>{children}</button>
</div>
);
}
export default TabButton;
import React from 'react';
import TabButton from './components/TabButton';
function App() {
var x ="변경될 데이터";
//부모에서 자식 이벤트 핸들러 구현
function handleEvent(v){
console.log("hellobutton",v);
//일반적인 변수는 화면 갱신이 안됨, 왜냐하면 app이 한번만 실행되기 때문
x = v; //함수 호출 시에 값 변경 => 랜더링 안됨
console.log("x===============",x);
}
//App컴포넌트 실행횟수 체트 => 실행하면 1번만 호출됨
console.log("App Component")
return (
<div>
<h1>이벤트 처리</h1>
{/*onSelect 대신에 임의의 값 사용가능
자식 호출 시 이벤트 함수 를 전달함
매우 많이 사용되는 중요한 패턴임*/}
<TabButton onSelect={handleEvent}>Java</TabButton>
<TabButton onSelect={handleEvent}>SQL</TabButton>
<TabButton onSelect={handleEvent}>SPRING</TabButton>
<TabButton onSelect={handleEvent}>SpringBoot</TabButton>
<TabButton onSelect={handleEvent}>Vue</TabButton>
<h3>변경된 출력값: {x}</h3>
</div>
);
}
export default App;
자식에게이벤트전달패턴3
부모에게데이터전달
import React from 'react';
function TabButton({children, onSelect}) {
//TableButton컴포넌트 실행횟수 버튼이 4개여서 4번 호출됨
console.log("TableButton Component");
let data= children;
console.log("TableButton Component",children);
console.log("TableButton Component",onSelect);
return(
<div>
{/*부모에게서 전달받은 이벤트 사용가능
onClick={onSelect(children)} 은 함수 호출이 됨*/}
<button onClick={()=>onSelect(children)}>{children}</button>
</div>
);
}
export default TabButton;
부모에게데이터전달2
import React from 'react';
import TabButton from './components/TabButton';
function App() {
var x ="변경될 데이터";
//부모에서 자식 이벤트 핸들러 구현
function handleEvent(v,e){
console.log("hellobutton",v);
console.log("HelloButton",e.target)
//일반적인 변수는 화면 갱신이 안됨, 왜냐하면 app이 한번만 실행되기 때문
x = v; //함수 호출 시에 값 변경 => 랜더링 안됨
console.log("x===============",x);
}
//App컴포넌트 실행횟수 체트 => 실행하면 1번만 호출됨
console.log("App Component")
return (
<div>
<h1>이벤트 처리</h1>
{/*onSelect 대신에 임의의 값 사용가능
자식 호출 시 이벤트 함수 를 전달함
매우 많이 사용되는 중요한 패턴임*/}
<TabButton onSelect={handleEvent}>Java</TabButton>
<TabButton onSelect={handleEvent}>SQL</TabButton>
<TabButton onSelect={handleEvent}>SPRING</TabButton>
<TabButton onSelect={handleEvent}>SpringBoot</TabButton>
<TabButton onSelect={handleEvent}>Vue</TabButton>
<h3>변경된 출력값: {x}</h3>
</div>
);
}
export default App;
import React from 'react';
function TabButton({children, onSelect}) {
//TableButton컴포넌트 실행횟수 버튼이 4개여서 4번 호출됨
console.log("TableButton Component");
let data= children;
console.log("TableButton Component",children);
console.log("TableButton Component",onSelect);
return(
<div>
{/*부모에게서 전달받은 이벤트 사용가능
onClick={onSelect(children)} 은 함수 호출이 됨*/}
<button onClick={(e)=>onSelect(children)}>{children}</button>
</div>
);
}
export default TabButton;
자식에게 계층구조이벤트 전달
import ChildComponent from "./components/ChildComponent";
export default function App() {
return (
<div>
<h2>App</h2>
<ChildComponent></ChildComponent>
</div>
);
}
import SubChildComponent from "./SubChildComponent";
export default function ChildComponent(props) {
function handleChildEvent() {
console.log("handleChildEvent");
} //
return (
<>
<h3>ChildComponent</h3>
<SubChildComponent onEvent={handleChildEvent}></SubChildComponent>
</>
);
}
export default function SubChildComponent(props) {
const { onEvent } = props; //이벤트 받기
return (
<>
<h4>SubChildComponent</h4>
<button onClick={onEvent}>call</button>
</>
);
}
자식에게 계층구조이벤트 전달2
import React from 'react';
import ChildComponent from './components/ChildComponent'
function App() {
function handleEvent (v){
console.log("handleEvent 호출됨", v);
}
return (
<div>
<h2>App</h2>
<ChildComponent onEvent={handleEvent}></ChildComponent>
</div>
);
}
export default App;
import React from 'react';
function SubChildComponent(props) {
const {onEvent}=props;
return (
<div>
<button onClick={onEvent}>Call</button>
</div>
);
}
export default SubChildComponent;
import React from 'react';
import SubChildComponent from './SubChildComponent';
function ChildComponent(props) {
return (
<div>
<SubChildComponent {...props}></SubChildComponent>
</div>
);
}
export default ChildComponent;
preventDefault_stopPropagation
import React from 'react';
function App() {
function handleEvent(e){
e.preventDefault();
console.log("handleEvent",e);
}
function parent(e){
console.log("parent",e);
}
function child (e){
console.log("child",e);
e.stopPropagation();
}
return (
<div>
<h2>1. 기본이벤트 동작 방지 처리</h2>
{/*public 에 target.html생성*/}
<form onSubmit={handleEvent} action='target.html'>
<button>submit</button>
</form>
<hr/>
<h2>2. 이벤트 전차방지 처리</h2>
<div onClick={parent} style={{backgroundColor:"yellow"}}>
parent
</div>
<div onClick={child} style={{backgroundColor:"pink"}}>
child
</div>
</div>
);
}
export default App;
State
const [변수명 num, 변경시 호출될 함수명 setNum] = useState(0); // num=0
num = num+1;
import React, { useState } from 'react';
function App() {
//컴포넌트 안에서 useState 선언
const [number, setNumber] = useState(0);
//처리항 데이터 변수명, 관리함수(set 변수명)
const onIncrease = () => {
setNumber (number+1); //화면에 렌더링
console.log("onIncrease",number);
//number 값은 갱신값이 아닌 이전값으로 출력
//이유는 리엑트가 변경사항을 스케쥴함
//따라서 스케쥴이 끝난 후에야 변경사항을 얻을 수 있으나
//현재 스케쥴 전에 console.log했기 때문에 이전값이 출력됨
//즉 app 함수는 새로 갱신 전의 옛 함수이다
};
const onDecrease = () => {
setNumber(number > 0 ? number -1 :0);
};
console.log("App호출====",number); //number State 값이 변경시 마다 매번 호출
return (
<div>
<h1>{number}</h1>
<button onClick={onIncrease}>+</button>
<button onClick={onDecrease}>-</button>
</div>
);
}
export default App;
useState01기본_count
export default function TabButton({ children, onSelect }) {
//TableButton컴포넌트 실행횟수 버튼이 4개이므로 4번호출됨
console.log("TableButton Component");
return (
<>
{/* 부모에게서 전달받은 이벤트 사용가능 */}
<button onClick={onSelect}>{children}</button>
</>
);
}
import TabButton from "./components/TabButton";
import {useState} from 'react';
export default function App() {
const [x, setX]= useState();
//부모에서 자식 이벤트 핸들러 구현
function handleEvent(selectedButton) {
console.log("Hello Button", selectedButton);
//일반적인 변수는 화면 갱신이 안됨, 왜냐하면 app이 한번만 실행되기 때문임
setX(selectedButton) //useState hook 을 이용 해결함
}
//App 컴포넌트 실행횟수 체크 => 실행하면 1번만 호출됨
console.log("App Component");
return (
<>
<h1>이벤트 처리</h1>
{/* onSelect대신에 임의의 값 사용가능
자식 호출시 이벤트 함수를 전달함
매우 많이 사용되는 중요한 패턴임
*/}
<TabButton onSelect={(e) => handleEvent("Java")}>Java</TabButton>
<TabButton onSelect={(e) => handleEvent("SQL")}>SQL</TabButton>
<TabButton onSelect={(e) => handleEvent("React")}>React</TabButton>
<TabButton onSelect={(e) => handleEvent("Vue")}>Vue</TabButton>
<h3>선택된 출력값</h3>
{x}
</>
);
}
import React from 'react';
import { useState } from 'react';
import { CORE_JOB } from './data/data';
function TabButton ({children, onSelect}){
return(
<li>
<button onClick={onSelect}>{children}</button>
</li>
);
};
function App() {
const [selectedName, setSelectedName] = useState();
function handleSelect(selectedButton){
setSelectedName(selectedButton);
console.log("handleSelect: ",selectedButton);
console.log(selectedName); // setSelectedName 이 바로 젇용안되고
//스케줄형(배치)로 실행되기 때문에 이전값이 출력됨
}
let tabContent =<p>이름을 선택하세요</p>;
if (selectedName){
tabContent=(
<div id="tab-content">
<p>{CORE_JOB[selectedName].name}</p>
<p>{CORE_JOB[selectedName].age}</p>
<p>{CORE_JOB[selectedName].address}</p>
</div>
);
}
console.log("App호출");
return (
<div>
<h1>1.비동기</h1>
{/*onSelect 대신에 임의의 값 사용가능
자식 호출 시 이벤트 함수 를 전달함
매우 많이 사용되는 중요한 패턴임*/}
<TabButton onSelect={()=>handleSelect("intern")}>intern</TabButton>
<TabButton onSelect={()=> handleSelect("assistant")}>assistant</TabButton>
<TabButton onSelect={()=>handleSelect("manager")}>manager</TabButton>
<h3>선택된 출력값: {tabContent}</h3>
</div>
);
}
export default App;
import React from 'react';
export const CORE_JOB={
intern:{
name:"홍길동",
age:20,
address:"서울"
},
manager:{
name:"이순신",
age:50,
address:"전라"
},
assistant:{
name:"유관순",
age:18,
address:"경기"
}
}
function data(props) {
return (
<div>
</div>
);
}
export default data;
useState01기본2_조건부랜더링1_button에스타일지정
import React, { useState } from 'react';
import { CORE_JOB } from './data/data';
import TabButton from './components/TabButton';
function App() {
const [selectedName, setSelectedName] = useState(null);
function handleSelect(selectedButton) {
setSelectedName(selectedButton);
}
let tabContent = null;
if (selectedName) {
tabContent = (
<div id="tab-content">
<p>Name: {CORE_JOB[selectedName].name}</p>
<p>Age: {CORE_JOB[selectedName].age}</p>
<p>Address: {CORE_JOB[selectedName].address}</p>
</div>
);
}
return (
<div>
<h1>1.비동기</h1>
<TabButton isSelected={selectedName === "intern"} onSelect={() => handleSelect("intern")}>intern</TabButton>
<TabButton isSelected={selectedName === "assistant"} onSelect={() => handleSelect("assistant")}>assistant</TabButton>
<TabButton isSelected={selectedName === "manager"} onSelect={() => handleSelect("manager")}>manager</TabButton>
<h3>Selected Content: {selectedName}</h3>
{tabContent}
</div>
);
}
export default App;
button.active{
background-color: blueviolet;
color: azure;
}
import React from 'react';
import './TabButton.css';
function TabButton({children, onSelect, isSelected}) {
console.log("TableButton Component");
return(
<div>
<li> <button className={isSelected? "active": undefined} onClick={onSelect}>{children}</button></li>
</div>
);
}
export default TabButton;
조건부랜더링2_boolean함수로구현
import React, { useState } from 'react';
function App() {
const [isEditing, setIsEditing] = useState(true);
function handleEvent() {
setIsEditing(()=> isEditing);
console.log(isEditing);
}
let tag = (
<>
<span>홍길동</span>
<button onClick={handleEvent}>Edit</button>
</>
)
if (!isEditing) {
tag = (
<>
<input></input>
<button onClick={handleEvent}>Save</button>
</>
);
}
console.log("App호출")
return (
<div>
{tag}
</div>
);
}
export default App;
boolean함수로구현2
import { useState } from "react";
export default function App() {
const [isEditing, setIsEditing] = useState(true);
function handleEvent() {
// setIsEditing(!isEditing);// old한 방법
setIsEditing(() => !isEditing); //new한 방법
console.log(isEditing);
}
let tag = (
<>
<span>홍길동</span>
{/* <button onClick={handleEvent}>Edit</button> */}
</>
);
if (!isEditing) {
tag = (
<>
<input></input>
{/* <button onClick={handleEvent}>Save</button> */}
</>
);
} //
console.log("App호출");
return (
<>
{tag}
{/* <button onClick={handleEvent}>{isEditing ? "save" : "edit"}</button> */}
{
isEditing?<button onClick={handleEvent}>Edit</button>:
<button onClick={handleEvent}>Save</button>
}
</>
);
}
import React, { useState } from 'react';
function App() {
const [number, setNumber] = useState({n:0});//json
//1. 불변변수가 아니기 때문에 화면 갱신이 안됨,
//객체 배열은 반드시 불변객체로 관리해야 한다
const onIncrease = ()=> {
//number.n = number.n + 1;
setNumber({...number, n:number.n+1});
console.log("onIncrease: ", number.n)
};
const onDecrease = () => {
const new_number = {...number};
console.log(number=== new_number); //false, number 와 number 와 new_number 객체는 서로 다른
const new_number2 = { ...number, n: number.n-1};
setNumber (new_number2); //덮어쓰기
};
console.log("App 호출",number.n);
return (
<div>
<h1>{number.n}</h1>
<button onClick={onIncrease}>+</button>
<button onClick={onDecrease}>-</button>
</div>
);
}
export default App;
import React, { useState } from 'react';
function App() {
const [number, setNumber] = useState([]);
//1. 불변변수가 아니기 때문에 화면 갱신이 안됨,
const onIncrease = ()=> {
number.push(10);
setNumber(number);
console.log("onIncrease: ", number);
};
//2. 객체를 불변변수로 만드는 방법은 디스트럭처럼 이용
//무조건 객체 수정은 디스트럭 처럼 이용함
const onDecrease = () => {
// let data = [ ...number, 10];
setNumber ([...number,10]); //기존 배열에 10 추가 새 배열 저장
};
const onDecrease2 = ()=> {
number.pop();
const new_arr = [...number];
setNumber (new_arr);
};
console.log("App 호출",number);
return (
<div>
<h1>{number}</h1>
<button onClick={onIncrease}>10추가안됨</button>
<button onClick={onDecrease}>10추가됨</button>
<button onClick={onDecrease2}>10감소2</button>
</div>
);
}
export default App;
import React, { useState } from 'react';
function App() {
const [number, setNumber] =useState({n:0});
const onIncrease = () => {
setNumber ({...number, n: number.n+1});
};
const onDecrease = () => {
if (number.n>0) setNumber({ ...number, n: number.n -1});
}
console.log("App호출", number.n);
return (
<div>
<h1>{number.n}</h1>
<button onClick={onIncrease}>+</button>
<button onClick={onDecrease}>-</button>
</div>
);
}
export default App;
import React, { useState } from 'react';
function App() {
const [number, setNumber] = useState([]);
//1. 불변변수가 아니기 때문에 화면 갱신이 안됨,
const onIncrease = ()=> {
number.push(10);
setNumber(number);
console.log("onIncrease: ", number);
};
//2. 객체를 불변변수로 만드는 방법은 디스트럭처럼 이용
//무조건 객체 수정은 디스트럭 처럼 이용함
const onDecrease = () => {
// let data = [ ...number, 10];
setNumber ([...number,10]); //기존 배열에 10 추가 새 배열 저장
};
const onDecrease2 = ()=> {
number.pop();
const new_arr = [...number];
setNumber (new_arr);
};
console.log("App 호출",number);
return (
<div>
<h1>{number}</h1>
<button onClick={onIncrease}>10추가안됨</button>
<button onClick={onDecrease}>10추가됨</button>
<button onClick={onDecrease2}>10감소2</button>
</div>
);
}
export default App;
import React, { useState } from 'react';
function App() {
const [number, setNumber] =useState({n:0});
const onIncrease = () => {
setNumber ({...number, n: number.n+1});
};
const onDecrease = () => {
if (number.n>0) setNumber({ ...number, n: number.n -1});
}
console.log("App호출", number.n);
return (
<div>
<h1>{number.n}</h1>
<button onClick={onIncrease}>+</button>
<button onClick={onDecrease}>-</button>
</div>
);
}
export default App;
'Daily Codig Reminder' 카테고리의 다른 글
useRef (0) | 2024.03.19 |
---|---|
useState 와 useRef (0) | 2024.03.19 |
props (0) | 2024.03.17 |
React (0) | 2024.03.17 |
부서 삭제, router@3 props, query, 라우팅 (0) | 2024.03.14 |