const handleMouseLeave = (e) => {
console.dir(e)
}
리액트에서 이벤트를 다루는 방식은 조금 특별하다
직접 이벤트를 만드는게 아니라 SyntheticBaseEvent라는 이벤트와 유사한 역할을 하는 레퍼런스를 참조해서 이벤트를 다룸.
우리는 이를 합성이벤트(인터페이스는 같지만 직접 대응되지 않음)라고 부른다.
만약 브라우저 고유의 이벤트가 필요하다면 nativeEvent 어트리뷰트를 통해서 접근이 가능하다
SynteticBascEvent > nativeEvent > type을 가면 고유 이벤트를 알 수 있다.
<div onClickCapture={handleClickCapture}>
<div onClickCapture={handleClickCapture2} onClick={handleClickBubble}>
<button onClick={handleButtonClick} onMouseLeave={handleMouseLeave}>Button</button>
</div>
</div>
function Greeting (props) {
return props.isLoggedIn ? <UserGreeting name="timmy" count={0}/> : <GuestGreeting/>
}
export default function Condition() {
const isLoggedIn = true
return (
<div>
<Greeting isLoggedIn={isLoggedIn}/>
</div>
)
}
function UserGreeting (props) {
return <h1>{props.name && `${props.name},`} Welcome {props.count ? `It's ${props.count} times` : null}</h1>
// return <h1>{props.name && `${props.name},`} {Boolean{props.count} && `It's ${props.count} times`}</h1>
}
function UserGreeting (props) {
return <h1>{props.name && `${props.name},`} Welcome {props.count ? `It's ${props.count} times` : null}</h1>
// return <h1>{props.name && `${props.name},`} {Boolean{props.count} && `It's ${props.count} times`}</h1>
}
🚀Map 활용
const numbers = [1,2,3,4,5]; return ( <ul> {numbers.map((item) => ( <li key={item.toString()}>{item}</li> ))} </ul> )
- map의 결과값 자체로 개별적으로 엘리먼트를 형성하는 것도 가능하다.
- 여기서 엘리먼트를 만들 때는 해당 값에 key를 부여해줄 수 있다.
const todoList = todos.map((todo) => <Item key={todo.id} {...todo}/>) return <>{todoList}</>
- map에서 배열을 호출할 때 spread 전개구문을 꼭 써줘야만 해당 값을 불러올 수 있다..!! 잊지마 !
{...todo}
🚀 Key
- 여기서 key라는 개념이 등장하는데, 이 또한 react에 존재하는 요상꾸리한 개념이다.
- key 엘리먼트에 고유성을 부여하기 위해서 식별하기 위해서만!사용한다. 이 말을 풀어보면 보통 자바스크립트에서는 개별 id값을 부여해줘서 하나하나 다 불러왔어야했는데
- 리액트는 이 id 값을 props가 아닌 식별하기 위해서만 붙여주는 임시 값이라고 해석해볼 수 있다.
- 이 key는 props가 아니라서 값을 받아서 사용할 수가 없음
- 만약 key를 부여받고 싶다면 id로 key값을 부여해주고 id를 사용하는 형태가 되어야함
- 만약 별도의 key를 부여하지 않는다면 리액트는 자동으로 index를 부여함.
- 이 index값을 통해서 key를 부여하더라도 동작은 정상적으로 되나 콘솔에 가면 다음과 같은 warning이 뜰 것이다. 이 말은 리액트는 인덱스 키 값을 싫어한다는 것이다.
🚀 간단한 TodoList 만들기
const todos = [ {id:1, text:'Drink Water'}, {id:2, text:'Buy Water'}, {id:3, text:'Clean the Room'}, {id:4, text:'Eat Dinner'}, ] const Item = (props) => { return ( <li> {props.text} </li> ) } const todoList = todos.map((todo) => <Item key={todo.id} {...todo}/>) return <>{todoList}</>
- 다음과 같이 간단하게 TodoList를 만들었다.
🚀 key값의 위치
- 위의 코드에서 의문이 가는 것은 key의 위치가 어디에 있어야 하느냐 이다.
- 맨 위의 map을 썼을 때는 li에 key값을 넣어줬는데 이번에는 Item자체에 key를 넣어줬다.
- 이는 map함수의 내부의 결과 값으로 key를 넣어줘야한다는 것을 알 수 있다.
🚀 key의 중복 사용
- key는 다음과 같이 같은 형제들끼리는 공유가 가능하다
- 위의 코드에서 sidebar와 content는 같은 함수 내에서 존재하기 때문에 형제요소이고
- 해당 형제요소에서 각각 다른 map함수의 결과물을 도출하지만, key값은 공유한다
🚀 만약 key값을 props로 받고 싶다면?
const Item = (props) => { return ( <li> {props.text} {/* {props.key}는 성립되지 않음 */} {props.id} </li> ) } const todoList = todos.map((todo) => <Item key={todo.id} id={todo.id} {...todo}/>)
- 이렇게 id 인자값을 부모에서 따로 만들어줘서 호출해야만 props로 받을 수 있음.