eventHandling

  • react의 component는 상태를 가지고, 상태의 변화에 따라 컴포넌트가 리 랜더링됨
    • 즉, 리엑트 컴포넌트의 상태를 변경시키는 무언가가 있다.
      • 그 무언거의 대부분이 바로 이벤트
  • javaScript의 event와 약간차이는 있으나 비슷하다.
    • react도 결국 javaScript다.
  • JSX에선 카멜케이스로 구성된 속성에 이벤트 함수를 넣는다.
    • <button onClick={handleClick}>Button </buttonn>

  • react의 이벤트에선 이벤트함수가 호출되면 인자로 SyntheticEvent 객체가 전달됨
    • SyntheticEvent는 javascript의 event 객체를 래핑한 객체임.
    • 거의 유사한 인터페이스를 가지고 있음
    • 원본 이벤트 객체도 접근 가능 SyntheticEvent.nativeEvent

eventHandler함수를 만들때는 react lifecycle을 고려해야한다.

  • 컴포넌트 내부에서 함수를 만들면 리랜더링 될때마다 새로 함수가 쓰여진다.
    • 이게 필요한 순간도 있겠으나 아닌 순간도 있다.
    • 새로 함수를 쓸 필요가 없다면 컴포넌트 외부에서 이벤트 핸들러 함수를 만들자.
    • 또는 useCallback으로 감싸주면 리랜더링을 피할 수 있다.
import { useCallback } from "react";

// 컴포넌트 외부에 함수 선언
function handleClickOutOfComponent(e) {
  console.log("click2", e);
}

function App() {
  // 컴포넌트 내부의 함수 
  function handleClick(e) {
    console.log("click1", e);
  }
  const handleChange = useCallback((e) => {
    console.log("change", e.target.value);
  }, []);

  return (
    <div>
      <button onClick={handleClick}>Button1</button>
      <button onClick={handleClickOutOfComponent}>Button2</button>
      <div>
        <input type="text" onChange={handleChange} />
      </div>
    </div>
  );
}
export default App;

이벤트의 종류

Mouse event

  • onClick : 마우스 클릭 (down + up )
  • onMouseDown : 버튼 누를시
  • onnMouseUp : 버튼 뗄시
  • onMouseEnter : 요소 밖에서 안으로 마우스 커서가 들어감
  • onMouseLeave : 요소 안에서 밖으로 마우스 커서가 나감
  • onMouseMove : 요소 안에서 마우스 커서가 움직임

Keyboard event

  • onKeyDown : 키를 눌렀을때 (물리적인 키에 반응)
  • onKeyUp : 키를 떼었을때
  • onKeyPress : 키를 눌러서 문자가 입력될때(눌린 문자에 반응함)

Focus, Form event

  • Focus
    • onFocus : 요소가 포커스 될때
    • onBlur : 요소의 포커스가 사라질경우
  • Form
    • onChange : 요소의 값이 변경될때

그외

  • 필요할때마자 찾아가면서 사용하도록하자.

Form 요소 컨트롤

  • Form 요소를 컨트롤할때는 이벤트를 자주 사용한다.

Controlled Component

  • 제어 컴포넌트 라고도 함.
  • React에 의해 입력 요소 값이 제어되는 컴포넌트
import { useState } from 'react';

function TextArea() {
  const [textAreaVal, setTextAreaVal] = useState('');

  console.log('[TextArea] render', value);

  return (
    <textarea
      value={textAreaVal}
      onChange={(e) => {
        setTextAreaVal(e.target.value);
      }}
    />
  );
}

export default TextArea;
  • 위 코드에서 textAreavalue 속성에 textAreaVal 스테이트 값을 넣어줌
  • onChange 에서는 setTextAreaVal를 호출함
  • 유저가 값을 입력하면 state에 유저의 입력이 반영 되면서 상태가 업데이트됨

장점

  • 컴포넌트의 state 와 input value가 완전히 동일함(신뢰가능한 단일 출처)
  • 다른 컴포넌트에 input value를 전달하거나 다른 이벤트 핸들러에서값을 재설정 할 수 있음

단점

  • 값이 변경되는 매 순간 렌더링이 됨
  • 컴포넌트의 영향 범위가 클수록 성능 저하됨

Uncontrolled Component

  • Controlled Component와는 반대로 input value를 컴포넌트 State에 연결하지 않고 사용하는 컴포넌트
  • 값은 dom을 통해 가져온다.
    • ex: document.querySelector('#{id}').value
  • useRef를 사용해 가져올 수 도 있다.
    • useRef는 Hooks의 한 종류. 특정 요소의 레퍼런스를 직접 가져올때 사용
    • 연결된 값이 변경되더라도 리랜더링이 되지 않는다.
import { useRef } from 'react';

function UncontrolledTextInput() {
  const inputRef = useRef(); //1. useRef를 이용해 ref를 만든다.

  console.log('[UncontrolledTextInput] render');

  return (
    <>
    /* jsx에서 ref속성에 연결한다.  */
      <input ref={inputRef} type="text" id="input" />
      <button
        onClick={() => {
          console.log(inputRef.current.value);
        }}
      >
        Get value
      </button>
    </>
  );
}

export default UncontrolledTextInput;

반응형

'프로그래밍 > react 학습노트' 카테고리의 다른 글

react 학습노트 | 3.Hooks  (0) 2025.04.20
react 학습노트 | 2.Component  (0) 2025.04.11
react 학습노트 | 1.JSX란?  (0) 2025.03.30

Hooks

  • react의 life cycle을 알려면 Hooks를 알 필요가 있다.
  • Hooks에 대해 알아보자.

Hooks의 종류

  • useState
  • useEffect
  • useCallback
  • useMemeo, useContext, useRef, useLayoutEffect
  • 위와 같이 10개 정도가 있는데, 그중 상위 3개정도가 주로 사용된다. 나머지는 필요할때 찾아서 쓰면된다.

useState

  • component의 State를 생성하는 Hook
    const [value, setValue] = useState(0) //인자는 초기값
    // 첫번째 요소(value) => state 값
    // 두번째 요소(setValue) => state를 set 해주는 setter 함수

useEffect

  • component가 랜더링 될때 현재 상태 변화에 따라 조건적으로 특정 작업을 실행하기 위한 Hook
    • 처음 랜더링 될때
    • 컴포넌트가 언마운트 될때
      • cleanup 함수를 이용해서 component unmount시 자원, 이벤트 등을 정리해준다.
        useEffect(() => {
        ...
        return () => {
        ... // cleanup 함수. component 가 unmount될때 실행됨
        }
        },[])
  • 상태가 변할때
    • useEffect()함수에 인자로 상태 변화를 감지할 state를 배열로 전달한다.
    • 이 경우 클린업 함수는 상태 변화를 감지하고 useEffect를 재실행하기 직전에 실행됨.
      const [value, setValue] = useState(0) 
      useEffect(() => {
      ...
      return () => {
      ... // cleanup 함수. component 가 unmount될때 실행됨
      }
      }, [value])

useCallback

  • 리 랜더링 시 기존에 만든 함수를 재생성 하지 않고 재활 용 하기 위해 사용하는 Hooks
  • memoization
const fooFun =useCallback(()=>{
  console.log("bar");
})

Hooks 사용시 주의사항

  • 조건적으로 사용하면 안된다.
  • Hooks 는 React Component에서만 사용 가능하다.

React의 렌더링 과정

Rerendering

  • Component의 상태(state, props)가 변경 되면서 해당 컴포넌트를 다시 실행하여 화면에 그린다는 의미.
  • Rerendering시 매번 다른 동작을 하게되고 이를 우리는 life cycle이라고함

React의 Life Cycle

  • Class형 과 Function형이 약간 다름
  • Class
    1. constructor 실행
      • 최초 실행
        1. getDerivedStateFromProps() 실행 : props로 넘어온 값을 state와 동기화하는 메소드
        2. render method 실행 : 화면에 그릴 JSX를 반환
        3. componentDidMount() 실
      • 업데이트 시
        1. getDerivedStateFromProps()
        2. shouldComponentUpdate() 실행 : 현재 일어난 상태변화를 확인하여 컴포넌트를 다시 랜더링 할지 말지를 결정
        3. componentDidUpdate()
      • 컴포넌트 삭제시
        1. 제거
        2. componentWillUnmount()실행
  • function형
    • 최초 실행
      1. 자기자신을 실행하여 JSX를 리턴하고 DOM에 반영
      2. useEffect Hook 실행: componentDidMount, componentDidUnMount, componentDidUpdate()를 커버해줌.
    • 업데이트시
      1. 자기 자신 실행 후 JSX반한
      2. useEffect 실행
    • unmount 시
      1. useEffect만 실행
반응형

'프로그래밍 > react 학습노트' 카테고리의 다른 글

react 학습노트 | 3.EventHandling  (0) 2025.04.26
react 학습노트 | 2.Component  (0) 2025.04.11
react 학습노트 | 1.JSX란?  (0) 2025.03.30

Component

  • 스스로 상태를 관리하는 캡슐화된 코드 조각
  • 컴포넌트는 하나의 JSX를 반환하는 함수.
  function App(){  
  return (
    <h1> Hello </h1>
    <h1> World </h1>
   )  
  }

  ReactDom.render(
    document.getElementById('root')  
  )

위 코드에서 App() 함수가 컴포넌트. div 태크로만들어진 JSX를 반환한다.
ReactDomrender 메소드를 이용해서 화면에 그린다.

JSX로 컴포넌트를 만드는것과 함수형태로 컴포넌트를 만드는 방식의차이

  1. 컴포넌트는 기본적으로 함수이기 때문에 자신만에 고유한 로직이 들거갈 수 있다.
  2. 스스로 상태를 가질 수 있다.

컴포넌트 생성시 주의사항

  • 컴포넌트 이름은 PascalCase
    • MyComponent
    • ArticlePage
    • UserProfile
  • 컴포넌트는 의미 단위로 쪼개서 파일을 분리한다.
    • header, content, footer ...
    • 각 컴포넌트가 역할을 가지도록한다.
  • 최 상위 컴포넌트는 일반적으로 App이다.
  • App컴포넌트를 ReactDom.render() 를 이용해서 랜더링 하는 코드는 일반적으로 index.js에 넣는다.
  • index.js 는 모든 컴포넌트의 엔트리 포인트, App.js는 모든 컴포넌트의 root 컴포넌드

Props

  • 프로퍼티의 줄임말.
  • 컴포넌트에서 하위 컴포넌트로 어떤 값을 전달해줄때 사용하는 요소
function App() { 
  return( 
    <div> <MyComponent value={'test'} /> </div> 
  ) 
} 

function MyComponent(props) { 
  return <div>{props.value} </div> 
}
  • App Component가 하위 컴포넌트인 MyComponent로 데이터를 전달해줌.
  • 전달반은 데이터는 object형태이며, 전달 했던 속성 이름으로 접근해서 사용할 수 있음.
    function App() { 
    return(
     <div>
       <MyComponent>
         <h1> value </h1> 
       </MyComponent>
     </div>
    )
    }


  function MyComponent(props) {  
    return
      {props.children}
    }
  • 상위 컴포넌트가 값을 감싸는 형태로 전달도 가능. 이때는 props에서 children을 이용해서 접근
  • 이때 children으로 전달받은 데이터는 <h1> 태그로 이루어진 JSX 값이다.

Props 활용팁.

  • 구조분해 할당을 잘 활용한다.
  • 특정 Props에 기본 값을 줄 수 있다.(defaultProps).
  • Props는 읽기 전용.

State

  • 컴포넌트 내부에서 사용되는 변수
    • state 값이 변하면 컴포넌트가 리렌더링됨.
    • 렌더링 사이클에서 값이 보존됨
function App(){ 
  const[value, setValue] = useState(); 
  return ( 
    <div> {value} </div>
  ) 
}
  • useState를 사용하면 value와 setValue를 리턴해준다.
  • setValue를 이용하면 value를 set할 수 있으며 이때 리 랜더링이 실행됨
  • value가 set 되는 시점은 리렌더링이 된 이후라는점에 주의해야함.

Hooks

  • 클래스형 컴포넌트의 단점을 보완하기 위해 함수형 컴포넌트에 지급된 개념
  • 지금까지는 함수형 컴포넌트를 사용했다.
  • 하지만 클래스형 컴포넌트라는 방식도 있다.
    • 과거에 useState 같은 Hooks는 이용할 수 없었기때문에 클래스형 컴포넌트를 이용했다.
    • 클래스형은 몇가지 안좋은점이 있어서 점점 안쓰게 되었다.
반응형

'프로그래밍 > react 학습노트' 카테고리의 다른 글

react 학습노트 | 3.EventHandling  (0) 2025.04.26
react 학습노트 | 3.Hooks  (0) 2025.04.20
react 학습노트 | 1.JSX란?  (0) 2025.03.30

JSX란?

  • Javascript 확장 문법으로 Javascript XML이란 의미.

  • 리엑트에서는 JSX를 이용하여 화면(컴포넌트)을 표시함.

    • 리엑트가 JSX -> HTML을 만들어줌

    JSX의 특징

    • JSX에서 사용되는 태그의 속성 이름이 HTML과 약간 다름
      • class => className
      • for => htmlFor
      • onclick => onClick
    • 태그를 명시적으로 닫아줘야함.
        //잘못된 JSX
        <button class="btn"> hello, world </button>
        <input type="text"> 

        //옳게된 JSX\`\`\` - 하나의 태그로 감싸져 있어야함.
        <div>
          <button className="btn"> hello, world </button>
          <input type="text"/> 
        </div>

JSX에서 Javascript사용하기

1. 중괄호 {} 안에서 JavaScript 표현식 사용

JSX 안에서는 중괄호 **`` 안에 JavaScript 표현식**을 사용할 수 있습니다.

const name = "Alice";

return <h1>Hello, {name}!</h1>;
  • ✅ 사용 가능한 것: 변수, 함수 호출, 삼항 연산자 등 표현식(expression)
  • ❌ 사용 불가: if, for 같은 문장(statement)

2. 조건부 렌더링

2-1. 삼항 연산자

const isLoggedIn = true;

return <div>{isLoggedIn ? "Welcome!" : "Please log in."}</div>;

2-2. 논리 AND (&&)

const hasMessages = true;

return <div>{hasMessages && <p>You have new messages.</p>}</div>;

3. 리스트 렌더링 (map 사용)

const items = ["Apple", "Banana", "Orange"];

return (
  <ul>
    {items.map((item, index) => (
      <li key={index}>{item}</li>
    ))}
  </ul>
);
  • key 속성은 필수는 아니지만 React가 효율적으로 렌더링하기 위해 사용합니다.

4. 반복문 사용하기 (for, while 등)

JSX 안에서는 for, while 같은 문장(statement) 은 직접 사용할 수 없습니다. 대신 반복문은 JSX 바깥에서 데이터를 처리한 뒤 JSX에서는 map() 등으로 표현식 형태로 렌더링합니다.

const items = ["Apple", "Banana", "Orange"];
const elements = [];

for (let i = 0; i < items.length; i++) {
  elements.push(<li key={i}>{items[i]}</li>);
}

return <ul>{elements}</ul>;
  • 또는 map() 사용이 가장 권장되는 방식입니다 (위의 리스트 렌더링 참고).

5. 함수 호출

function formatName(user) {
  return `${user.firstName} ${user.lastName}`;
}

const user = { firstName: "John", lastName: "Doe" };

return <h1>Hello, {formatName(user)}!</h1>;

6. 속성(prop)에도 JavaScript 표현식 사용 가능

const isDisabled = true;

return <button disabled={isDisabled}>Click me</button>;

7. 스타일 객체도 JavaScript로 정의 가능

const style = {
  color: "blue",
  fontSize: 20
};

return <p style={style}>Styled Text</p>;
  • CSS 속성 이름은 camelCase로 써야 합니다 (font-sizefontSize)

반응형

'프로그래밍 > react 학습노트' 카테고리의 다른 글

react 학습노트 | 3.EventHandling  (0) 2025.04.26
react 학습노트 | 3.Hooks  (0) 2025.04.20
react 학습노트 | 2.Component  (0) 2025.04.11

+ Recent posts