-
[React] section 9, 10Frontend/React 2023. 11. 1. 21:10
Generic Event Handler
const inputChangeHandler = (input, value) => { setUserInput((prevInput) => { return { ...prevInput, [input] : value }; }); }; <input onChange={(event) => inputChangeHandler('curent-savings', event.target.value} type="number" id="current-savings" />모든 입력에서의 변경 이벤트에 대해 항상 동일한 changeHandler 함수가 실행될 수 있다.
각자 다른 식별자와 값으로 실행된다.
재사용 가능한 Card component 추가
사용자 정의 컴포넌트들은 이 className이라는 속성도, 어떻게 작업해야 하는지도 모른다.
그래서 아래와 같이 해주어야 함.
const Card = (props) => { return ( <div className={`${classes.card} ${props.className}`}>{props.children}</div> ); };검증 추가
if (user.name.trim().length === 0 || user.age.trim().length === 0) { setIsValid(false); } if (+user.age < 1) { setIsValid(false); }State를 통해 사용자 목록 관리하기
// App.js const addUserHandler = (name, age) => { ... }; return ... <AddUser onAddUser={addUserHandler} /> // AddUser.js props.onAddUser(...);상태 위로 올리기
모달 창 추가하기
백드롭 : 모달창과 실제 메인 페이지 사이에 겹쳐지는 부분
페이지의 나머지 부분과 상호작용 하지 못하게 하려면 사용해야 한다.
<div> Soup
실제 DOM으로 렌더링 될 때 리액트 컴포넌트가 많이 중첩될 수 있다.
불필요한 div 또는 기타 요소가 많이 있을 수 있다.
-> 스타일링에 영향을 줄 수도 있고 별로 좋은 관행은 아니다!
불필요한 요소를 렌더링 하기 때문
Wrapper
const Wrapper = props => { return props.children; }; export default Wrapper;Wrapper 컴포넌트는 리액트와 함께 제공된다.
-> 이것이 Fragment component!
Fragment
<React.Fragment></React.Fragment> // 항상 작동한다. // or <></> // 프로젝트 설정에 따라 다르다.Wrapper와 마찬가지로 실제 HTML 요소를 DOM에 렌더링하지 않는다.
리액트 포털
포털에는 두 가지가 필요하다
컴포넌트를 이동시킬 장소, 그런 다음 컴포넌트에게 그 곳에 포털을 가져야 한다고 알려줄 필요가 있다.
// index.html <div id = "backdrop-root"></div> <div id = "overlay-root"></div> <div id = "root"></div>// ErrorModal.js const Backdrop = (props) => { return <div className={classes.backdrop} ... ... }; const ModalOverlay = (props) => { return ( <Card> ... ... } const ErrorModel = (props) => { return ( <> {ReactDOM.createPortal(<Backdrop onClick={props.onConfirm} />, document.getElementById('backdrop-root'))} </> ) }리액트 DOM은 브라우저에 대한 리액트용 어댑터의 일종이라 할 수 있다.
ReactDOM.createPortal은 JSX를 사용하는 어디에서나 사용할 수 있다.
Ref
다른 DOM 요소에 접근해서 그것들로 작업할 수 있게 해주는 것
모든 리액트 훅과 마찬가지로 , useRef도 함수형 컴포넌트 안에서만 사용가능하다.
// AddUser.js const AddUser = (props) => { const nameInputRef = useRef(); const ageInputRef = useRef(); const addUserHandler = (event) => { ... const enteredName = nameInputRef.current.value; ... nameInputRef.current.value = ''; ... <input ... ref = {nameInputRef} }어떤 HTML 요소라도 참조 중 하나에 연결될 수 있다.
nameInputRef에 들어있는 것은 나중에 실제 DOM 요소가 될 것이다.
객체가 있고 이 객체에는 current 요소가 있다. (중요)
ref의 값은 항상 객체이고 항상 current prop을 가지고 있다.
current prop은 ref가 연결된 실제 값을 갖는다.
재설정 로직 : 리액트 없이 DOM 조작하기 일반적으로는 좋지 않은 방법이지만 사용자가 입력한 값을 재설정하려는 경우에는 써도 괜찮다.
state vs ref ?
= 값만 읽을거면 ref가 낫다.
제어되지 않은 컴포넌트
-> ref를 사용하면 리액트로 입력 요소의 state를 제어하지 않기 때문!
vs
제어되는 컴포넌트
-> 내부 state가 리액트에 의해 제어됨.
'Frontend > React' 카테고리의 다른 글
[React] Section 11_2 (0) 2023.11.04 [React] section 11_1 (0) 2023.11.02 [React] section 6, 7 (0) 2023.10.31 [React] section 4, 5 (0) 2023.10.30 [React] section 3 (0) 2023.10.30