Archive

React.js 조건부렌더링,list&key,form,공통state,composition

|

React.js 조건부렌더링,list&key,form,공통state,composition


  1. Conditional Rendering

    • 조건에 따라 UI를 감추거나 보여주거나하는 테크닉
    • Element Variable : 변수에 리액트의 element를 담아서 사용할 수 있다
    let button = <ComponentName><ComponentName />;
       
    // 사용 예시
    <div>
    	{button}
    </div>
    
    • && 연산자와 short-circuit 현상을 이용한 방법
    const = messages = ['React', 'hi', 'hello']; // props로 전달
       
    //function component
    function Mailbox(props) {
        const unreadMessage = props.unreadMessage;
        return {
            <div>
            	{unreadMessage.length > 0 &&
                	<h2>
                		you have {unreadMessage.length} unread Messages.
                	</h2>
                }
            </div>
        };
    }
    
    • 삼항연산자를 이용한 방법
    render() {
        const isLoggedIn = this.state.isLoggedIn;
        return {
            <div>
            	The user is {isLoggedIn ? 'currently' : 'not'} logged in.
            </div>
        }
    }
    
    • null을 return하여 렌더링 막기
    function WarningBanner(props) {
        if(!props.warn) {
            return null;
        }
        return (
        	<div>
                Warning!
            </div>
        )
    }
    


  2. Lists and keys

    • 리액트에서는 배열을 이용해서 다수의 element를 렌더링할 수 있다
    function NumberList(props){
    	const numbers = props.numbers;
    	const listItems = numbers.map((number) =>
    		<li>{number}</li>);
    	return(
    		<ul>{listItems}</ul>);
    }
       
    const numbers = [1,2,3,4,5];
    render(
    	<NumberList numbers={numbers}></NumberList>);
    
    • 두 list 사이에서는 key가 같아도 상관없다
    • 리액트에서는 배열을 이용하여 UI를 생성할 경우 key라는 별도의 식별자가 필요
    • but, key값은 리액트 자체적인 식별자로 쓰이기 때문에 사용자가 접근 할 수 없다. 따라서 식별자가 필요한 경우 id 등 별도로 지정을 해주어야한다
    function ListItem(props) {
        return <li>{props.value}</li>;
    }
       
    function NumberList(props){
    	const numbers = props.numbers;
    	const listItems = numbers.map((number) =>
    		<ListItem key={number.toString()} value={number}></ListItem>);
    	return(
    		<ul>{listItems}</ul>);
    }
    
    • JSX 안에서 map 사용하기
    function NumberList(props) {
        const numbers = props.numbers;
        return (
        	<ul>
            	{numbers.map((number) => 
                	<ListItem key={number.toString()} value={number})}
            </ul>);
    }
    


  3. Forms

    • Controlled Component : 리액트의 통제를 받는 input form element
    handleChange(e) {
        this.setState({value: e.target.value});
    }
       
    render() {
        return (
        	<form>
            	<input type='text' value={this.state.value}
                 onChange={this.handleChange}></input>
            </form>)
    }
    
    • ES6의 객체의 계산된 프로퍼티 이름(computed property name)를 이용해서 setState의 key값에 맞는 value를 바꿀 수 있다
    handleChange(e) {
        const target = e.target;
        const value = target.value;
        const name = target.name;
        // 선택한 target의 계산된 이름 [name]
        this.setState({
            [name]: value
        })
    }
    
    • null 값을 이용하여 행동 제어
    ReactDom.render(
    	<input value='hi'></input>, mountNode);
    setTimeout(() => { // 1초 뒤에 입력가능 상태로 바뀜
        ReactDom.render(
        	<input value={null}></input>, mountNode);
    }, 1000);
    


  4. Lifting State Up

    • Shared State : 상위 컴포넌트의 state를 여러 하위 컴포넌트에서 공통적으로 사용
    • 상위 컴포넌트에서 이벤트를 설치하고 값을 받을 매개변수를 세팅
    • 이벤트는 props로 넘겨준다
    • 하위 컴포넌트에서 this.props.이벤트(인자)로 인자를 상위 컴포넌트의 매개변수로 전달한다


  5. Composition vs Inheritance

    • Composition : 여러 개의 컴포넌트를 합쳐서 새로운 컴포넌트를 만드는 것
    • Containment : sidebar, dialog 등 box 형태의 컴포넌트는 자신의 하위 컴포넌트를 미리 알 수 없기에 children이라는 prop을 사용해서 조합한다
    function FancyBorder(props) {
        return (
        	<div>
            	{props.children}
            </div>
        );
    }
    
    function WelcomeDialog() {
        return (
        	<FancyBorder>
                // Children으로 전달
            	<h1>Welcome</h1>
                <p>Thank you</p>
            </FancyBorder>
        );
    }
    
    • children이 여러개의 집합인 경우에는?
    • 상위 컴포넌트에서 각각 렌더링할 컴포넌트를 넣어준다
    function SplitPane(props) {
        return (
        	<div>
            	<div>
                    {props.left}
                </div>
                <div>
                    {props.right}
                </div>
            </div>
        );
    }
    
    function App() {
        return (
        	<SplitPane
                left={
                    <Contacts></Contacts>
                }
                right={
                    <Chat></Chat>
                }
        );
    }
    
    • 객체지향 언어에서는 상속을 통해 Specialization을 구현한다
    • but, 리액트에서는 Composition을 사용하여 Specialization을 구현한다
    function Dialog(props) {
        return (
        	<FancyBorder>
            	<h1>{props.title}</h1>
                <p>{props.message}</p>
            </FancyBorder>
        );
    }
    
    function WelcomeDialog() {
        return (
        	<Dialog
                title='Welcome'
                message='Thank you'
             ></Dialog>
        );
    }
    




참고 자료


reactjs.org - 공식홈페이지

goormedu - 처음만난 리액트

2021-01-27 TIL

|

2021-01-27 TIL


  • 오늘 한 것
    1. 리액트 공부 - React-The Complete Guide 강의를 듣기 시작했다. 영어 자막을 보고 0.75배속으로 간신히 듣고 있는데 사전에 생활코딩, 구름에듀에서 맛뵈기를 하고 배경지식이 쌓여서 그런지 못알아먹을 정도는 아니다. 강의 내용은 정말 좋다. 무려 40시간이나 되는 어마어마한 내용의 강의지만 확실히 도움이 많이 될 듯하다. 결제한 보람이 있다.ㅎ
    2. 책 받으러 학원 출두 - 책을 16권이나 받았는데 세상에.. 전부다 자바 생태계 관련된 서적들뿐.. ㅜ 자바스크립트 책은 한 권도 없다니… 하긴 학원 과정이 애초에 자바 과정이라 그렇다치만 커리큘럼에 엄연히 html/css/js 내용이 들어가있는데도…
    3. 학원 비대면 수업(15:30~22:00)



  • 내일 할 것
    1. 리액트 공부 - React The complete Guide
    2. 학원 비대면 수업(15:30~22:00)



  • 끝으로

졸지에 영어공부도 하고 있다.

오늘의 한 줄 총평 : 영어!!


React.js Class vs Function (hook)

|

React.js Class vs Function (hook)


  1. 리액트에서 컴포넌트를 만드는 방법

    • Class : 리액트의 기능을 최대한 발휘할 수 있다
    • Function : 함수의 문법만 사용, 기능 부족(state, life-cycle API 등)
    • 최신 리액트에서는 hook을 이용해 함수 방식을 보완


  1. Class Style Component

    • 상위 컴포넌트에서 하위 컴포넌트에 props의 형태로 값을 전달
    • this.props.xxxx의 형태
    • props를 state화 시켜서 사용함으로서 state 값이 바뀔때마다 re-render 돼서 UI에 반영됨
    • 메소드 정의시 function 안붙인다


  2. Function Style Component

    • 매개변수로 props를 받을 수 있다
    • props.xxxx의 형태
    • 함수 방식에서도 hook을 이용해 state를 사용할 수 있다. (React ver 16.8 이후 추가)
    • 단, hook은 최상위 컴포넌트에서만 호출해야한다
    • react의 useState를 import 한 후 useState() 메소드의 인자로 props.xxxx를 전달하면 길이가 2인 배열이 나오는데 이 배열의 0번째 값이 state의 값이다
    • 배열의 1번째 값에는 클래스 방식의 setState 메소드와 동일한 기능을 하는 메소드가 담겨있다.
    • 구조 분해 할당으로 코드의 간결화
    • const [first, second] = useState(props.xxxx);
    • first의 값은 state의 값이 저장
    • second에는 setState 메소드가 저장
    • second 사용시 주의할 점 ★★★
    • state가 multiple line 일 경우 second 메소드로 state 변경시 변경할 녀석들 말고도 다른 state들도 명시적으로 적어주어야한다. (클래스 방식의 setState 메소드는 변경할 녀석들만 적으면 됨)
    • 아니면 그냥 useState를 여러번 사용해서 state를 나누면 상관 x
    • 메소드 정의시 const name = () => {…}


  3. Class Style에서의 Life-cycle

    • 클래스 방식에서는 생명주기 메소드를 사용할 수 있어, 원하는 타이밍에 어떠한 처리를 할 수 있다
    • shouldComponentUpdate() 는 nextProp, nextState 두 가지 인자를 가지고 return 값으로 boolean 을 가지는데 현재 props이나 state값과 바뀐 prop, state 값을 비교해서 바뀐게 있으면 re-render를 하고 바뀐게 없으면 그냥 냅두는 강력한 기능을 한다

    생명주기

    출처 : React component lifecycle, API 정리


  4. Function Style에서의 Life-cycle

    • useEffect import 후 메소드 사용
    • 인자로 함수를 정의할 수 있는데, 이 함수는 컴포넌트의 첫 render가 끝난 뒤 실행이 되고 UI가 바뀌어 re-render 될 때마다 실행이 된다
    • 클래스 방식의 componentDidMount & componentDidUpdate 메소드와 동일한 기능을 한다
    • componentDidMount & componentDidUpdate를 분리하여 사용하고 싶은 경우, useEffect의 두 번째 인자값으로 빈 배열[] 을 넣어준다. componentDidMount의 수행문은 최초 render시 한 번만 실행을 하게 된다
    • 여러 개 설치 가능
    • return 값으로 함수를 정의할 수 있는데 클래스 방식의 componentWillUnmount 메소드와 같이 컴포넌트가 cleanUp이 될 때 실행된다
    • useEffect 메소드의 두 번째 인자값으로 배열을 넣어 감시 대상의 값이 바뀌었을 때에만 동작이 실행되도록 하여 성능을 높일 수 있다
    • export default React.memo(name); <- React.memo() 메소드를 이용해서 클래스 방식의 shouldComponentUpdate()와 같은 효과를 낼 수 있다. 업데이트 된 놈들만 re-render되도록




참고 자료


생활코딩-React.js

reactjs.org - 공식홈페이지

React.js Create, Update, Delete

|

React.js Create, Update, Delete


  1. 중간 정리

    • 상위 컴포넌트는 생성자로 state화 시킨다. 하위 컴포넌트에게는 props를 전달하는데 이벤트도 props의 형태로 전달이 가능하다.

    • 하위 컴포넌트가 상위 컴포넌트의 state를 변경할 때는 이벤트를 이용한다. (without REDUX)
    • 하나의 공통 저장소가 있어서 저장소의 데이터 값이 바뀌면 연관된 컴포넌트가 전부 바뀜. (with REUDX)


  2. Create 구현

    • control 컴포넌트 추가 후 onChangeMode 이벤트 설치

    • create / update / delete 각 버튼 클릭시 모드 변경

    • mode가 welcome이거나 read 일시에는 본문 내용 출력 (ReadContent 컴포넌트)

    • mode가 create이면 CreateContent 컴포넌트의 내용 출력

    • form 태그에 입력창 세팅 후 onSubmit 이벤트에서 입력창의 값을 인자로 전달

    • 상위 컴포넌트에서 인자를 받아서 contents 배열에 추가

    • 기존 배열을 건드리는것보다 concat으로 추가한 새 배열을 만드는것이 좋다

      shouldComponentUpdate() 메소드의 return 값을 false로 주면 컴포넌트의 값이 바뀌지 않는이상 re-render가 일어나지 않음

      shouldComponentUpdate() 메소드는 newProps와 기존의 props 모두 접근이 가능하여 비교가 가능하다.

      이것을 활용하여 concat으로 추가한 새 배열로 state를 교체했을시에만 re-render가 일어나게 설정할 수 있는데 원본까지 바꿔버리면 newProps와 this.props가 항상 같으므로 re-render가 일어나지 않는다.

    • setState로 새로운 contents 배열로 re-render


  3. Update 구현

    • UpdateContent 컴포넌트 추가
    • Create와 기능면에서 유사하기 때문에 컴포넌트 복붙
    • 상위 컴포넌트에서 mode === update이면 사용자가 선택한 TOC의 state(배열)를 하위 컴포넌트에게 props로 넘겨준다
    • 하위 컴포넌트에서 선택한 TOC의 title과 desc를 입력창에 출력하는데 props를 그대로 쓰면 error가 발생한다. (props는 read-only이기 때문)
    • props를 state화 시키고 쓰는데 반드시 onChange를 정의해주어야함
    • state의 이름과 이벤트가 발생한 target의 이름을 같게해서 setState로 [e.target.name] : e.target.value로 입력창에 변경된 state 값 출력
    • input type=’hidden’ name=’id’ value={this.state.id} 태그를 하나 더 추가해서 onSubmit 이벤트 발동시 id, 변경된 title, 변경된 desc 값을 넘겨준다
    • 상위 컴포넌트의 onSubmit 이벤트 props에서 기존의 contents 배열을 복사한 뒤 반복문을 돌며 하위 컴포넌트에서 넘어온 id와 복사한 배열의 id값이 일치하는 index를 찾아 배열의 title과 desc 값을 수정하여 다시 setState를 해준다.


  4. Delete 구현

    • contents 배열을 복사한 후 반복문을 돌며 선택한 요소의 id와 배열의 요소의 id가 같은 index를 찾아 splice로 잘라낸다.
    • 편집된 contents를 setState로 교체시킨다.




참고 자료


생활코딩-React.js

reactjs.org - 공식홈페이지

goormedu - 처음 만난 React

2021-01-26 TIL

|

2021-01-26 TIL


  • 오늘 한 것
    1. 리액트 공부 - 생활코딩 React, class vs function 수강 완료 - 리액트로 간단한 CRUD 구현을 마쳤다. 클래스로 컴포넌트를 구현했을때 state를 활용해서 상위 컴포넌트와 하위컴포넌트에서의 데이터가 어떻게 넘나드는지를 배울 수 있었다. 또, class 방식과 function 방식의 차이점과 최신 리액트에 추가된 hook을 이용한 function 컴포넌트의 활용에 대해 알 수 있었다. 리액트가 자바스크립트의 라이브러리이다보니 ES6 등 js문법적인 부분도 계속 나오는데 역시 자바스크립트도 병행해서 공부하면 좋을듯하다.
    2. 학원 비대면 수업(15:30~22:00)



  • 내일 할 것
    1. 리액트 공부 - React The complete Guide
    2. 학원 비대면 수업(15:30~22:00)



  • 끝으로

내일은 책받으러 학원좀 다녀와야겠다.

오늘의 한 줄 총평 : 리액트 익숙해지기