프론트엔드/React

양방향 바인딩

bread-gee 2023. 12. 5. 19:32

리액트의 양방향 바인딩(Two-Way Binding)은 부모 컴포넌트의 상태가 자식 컴포넌트의 props로 전달되는 동시에 자식 컴포넌트에서 변경된 값이 부모 컴포넌트의 상태에도 즉시 반영되는 메커니즘을 의미한다.

주로 사용자 인터페이스 요소(입력 필드) 값과 상태를 동기화할 유용하다.

 

📌 state를 이용한 양방향 바인딩

부모 컴포넌트가 inputValue라는 상태를 가지고 있고, 이 상태를 자식 컴포넌트에 value의 props으로 전달한다.

자식 컴포넌트에서는 입력 필드의 값이 변경될 때마다 handleChange 함수를 통해 onInputChange 콜백을 호출하여 부모의 상태를 갱신한다.

import React, { useState } from 'react';

// 부모 컴포넌트
function ParentComponent() {
	const [inputValue, setInputValue] = useState('');

	const handleInputChange = (newValue) => {
		setInputValue(newValue);
	};

	return (
		<ChildComponent value={inputValue} onInputChange={handleInputChange} />
	);
}

// 자식 컴포넌트
function ChildComponent({ value, onInputChange }) {
	const handleChange = (e) => {
		const newValue = e.target.value;
		onInputChange(newValue);
	};

	return <input type="text" value={value} onChange={handleChange} />;
}

 

🌀 부모 ➡️ 자식 (하향식 전달)

  • Props를 이용하기

 

🌀 자식 ➡️ 부모 (상향식 전달)

<input onChange={handleChange}>

  • onChange로 사용자 입력을 수신한다.
  • 사용자가 타이핑할 때마다 handleChange 함수가 실행된다.
  • 실행될 때마다 브라우저가 제공하는 디폴트 이벤트 객체(event)를 얻는다.
  • 부모로 부터 받은 포인터 함수(props) 이용해 부모로 event 값을 전달한다.

 

더보기

🔥 컴포넌트에 props 추가하기

<input onChange={handleChange}>

  • <input> 요소에 이벤트 리스너를 추가하듯이 컴포넌트는 속성(props)을 통해 외부에서 값을 전달받을 수 있다.
    ex) onChange
  • 속성의 값으로 함수를 전달하는데, 함수를 실행시키지 말고 전달만 하면 된다.
    ex)
    onChange={handleChange()} (X)
    onChange={handleChange}(O)

 

 

 

📌 커스텀 훅을 이용한 양방향 바인딩

커스텀 훅을 만든다.

부모 컴포넌트에서 훅을 이용하여 현재 상태의 값과 상태를 업데이트하는 함수를 얻고 자식 컴포넌트에 전달한다.

 

import React from 'react';

// 커스텀 훅
function useTwoWayBinding(initialValue) {
	const [value, setValue] = React.useState(initialValue);

	const handleChange = (e) => {
		setValue(e.target.value);
	};

	return [value, handleChange];
}

// 부모 컴포넌트
import useTwoWayBinding from './useTwoWayBinding';

function ParentComponent() {
	const [inputValue, setInputValue] = useTwoWayBinding('');

	return (
		<ChildComponent value={inputValue} onChange={setInputValue} />
	);
}

// 자식 컴포넌트
function ChildComponent({ value, onChange }) {
	return <input type="text" value={value} onChange={onChange} />;
}

 

🌀 커스텀 훅 사용 장점

  • 로직을 추상화할 수 있고, 다양한 컴포넌트에서 재사용할 수 있다.
  • 로직을 분리했기 때문에 컴포넌트 자체는 더 간결하고 가독성이 높아진다.
  • 로직을 일관되게 사용할 있다.