Archive

React.js Hooks (계속 업뎃 예정)

|

React.js Hooks


  1. useMemo

    • props가 바뀌지 않았다면, 리렌더링을 막아 성능을 최적화 해줄 수 있는 녀석
    • 리렌더링이 필요할 때만 되도록 설정할 수 있다
    • 이것을 남용하면 불필요한 props 비교만 하게 되므로 렌더링 최적화가 필요할 때만 사용하도록 한다
    import { useMemo } from 'react';
       
    // 값을 받아서 바꾸는 함수가 있다고 하자
    const changeValue = (value) => {
        return value + 1;
    }
    // a의 값이 바뀔때에만 changeValue가 호출된다
    const xxx = useMemo(() => changeValue(a), [a]);
    


  1. useCallback

    • 이전에 만든 함수를 재사용할 때 쓴다
    • 두 번째 인자는 의존성으로 deps를 배열 [] 안에 넣어주는데 의존하는 상태값이 없다면 빈 배열을 넣어준다
    import { useCallback } from 'react';
    
    const onChange = useCallback((value) => {
        setValue(value+1);
    }, [value]);
    
    /*
    useCallback의 두번째 인자로 준 값이 바뀔때마다 callback 함수를 만들고
    값이 같다면 기존에 있던 함수를 재사용한다
    */
    


  2. useReducer

    • 컴포넌트의 state 업데이트 로직을 컴포넌트에서 분리해서 바깥에서 관리할 수 있다
    • 여기에 action과 dispatch라는 개념이 등장한다
    • 이벤트 함수에서 action.type을 reducer에게 dispatch해준다
    • reducer는 state,action을 받아서 action.type에 맞는 로직(state 업데이트)을 실행한다
    const reducer = (state, action) => {
        switch(action.type) {
            case 'INCREMENT':
                return state + 1;
            case 'DECREMENT':
                return state - 1;
            default:
                return state;
        };
    };
    
    export default reducer;
    
    // state 초기화
    const init = {
        number: 0,
    };
    
    // useReducer의 첫 번째 인자로 reducer 함수를,
    // 두 번째 인자로 default state를 넣어준다
    const [state, dispatch] = useReducer(reducer,init);
    
    // 이벤트 함수 실행시 dispatch에 의해 action type이 전달된다
    const onChange = () => {
        dispatch({
            type: 'INCREMENT',
        });
    };
    // state의 사용
    <input onChange={onChange} value={state.number} />
    


  3. Custom Hook

    • input태그의 onChange 등 자주 사용하는 기능들을 custom hook으로 만들어 재사용 할 수 있다
    import { useState, useCallback } from 'react';
    
    const useInputs = (initialForm) => {
        const [form, setForm] = useState(initialForm);
        const onChange = useCallback((e) => {
            const {name, value} = e.target;
            setForm((form) => {
                ...form,
                [name]: value,
            });
        }, []); // 의존하는 상태값이 없으므로 빈 배열
        const reset = useCallback(() => {
            setForm(initialForm, [initialForm]);
            // initialForm에 의존하므로 적어야한다
        });
        return [form, onChange, reset]; // 배열 형태로 반환
    };
    
    export default useInputs;
    
    import useInputs from 'path/useInputs';
    
    // useInputs의 initialForm에 초기 상태값 전달
    const [form, onChange, reset] = useInputs({
        name: '',
        email: '',
    });
    
    // useInputs에서 만든 state에서 구조분해 할당
    const { name, email } = form;
    


  4. Hooks로 Context API 사용하기

    import { createContext } from 'react';
       
    // context를 생성한다 (함수형, 클래스형 동일)
    const ctx = createContext({
        isLogined: false,
        id: '',
    });
       
    export default ctx;
    
    // 사용하고자 하는 컴포넌트에서 context를 사용한다
    import { useContext } from 'react';
    import ctx from 'path/ctx';
       
    const Bottom = () => {
        // context의 사용
        const { isLogined, id } = useContext(ctx);
        // ...
    }
    


    const Ctx = createContext();
       
    // provider를 이용해서 값을 전달해도 된다
    <Ctx.Provider value=>
    </Ctx.Provider>
    


  5. useParams

    • <Route> 컴포넌트의 path 속성에서 URL을 파라미터로서 값을 받는 객체를 useParams()를 통해 접근 가능
    • 파라미터 개수는 여러개여도 상관없다. ex)<Route path="/:id/:name/:title" />
    import React from 'react';
    import { Route, Switch } from 'react-router-dom';
       
    function app() {
      return (
        <Switch>
          <Route exact path='/' component={PostIndex} />
          <Route exact path='/posts/:id' component={PostShow} />
        </Switch>
      );
    }
    export default app;
    


    import React from 'react';
    import { useParams } from 'react-router-dom';
       
    function postShow() {
      let { id } = useParams();
      return <div>{id}</div>;
    }
       
    export default postShow;
    
    • app 컴포넌트의 id 파라미터를 PostShow에서 비구조화 할당으로 id 로 받을 수 있다


  6. continue..



참고 자료


reactjs.org - 공식홈페이지

벨로퍼트와 함께하는 모던리액트

2021-03-13 TIL

|

2021-03-13 TIL


  • 오늘 한 것
    1. 코로나 확진자 SPA map 페이지 만들기 - kakao Map open API를 사용해서 지도를 화면에 찍어내는데 성공했다. 물론 중간 과정은 어려움이 많았지만 대충 구조는 파악할 수 있었다. 추가적으로 지도에 마커 표시, 인포윈도우 표시, 줌 기능 추가 등 여러 개 실험을 해보았는데 사용법이 꽤나 심플해서 좋았다. kakao dev의 wizard를 사용하면 아예 코드도 짜주던데..
    2. React Hooks 동영상 강의 시청 - 클래스형 컴포넌트만 연습을 하다보니 함수형 컴포넌트에서 hooks 쓰는 법을 잊어버렸다… 개인적으로 Java를 먼저 배운지라 클래스 사용법이 익숙하고 편한데 React 팀에서는 Hooks를 밀고 있는 추세이니 함수형 컴포넌트에 익숙해지도록 연습을 해야겠다.



  • 내일 할 것
    1. 블로그 업로드
    2. 리액트 / 자바스크립트 둘 중 하나 공부
    3. 실무자 찾아가서 Git 배워오기



  • 끝으로

혼자서만 git & github를 쓰는 것과 팀 단위 프로젝트에서 git을 사용하는 것은 전혀 달랐다. 알고 있다고 생각했던 branch 개념도 직접 써보니 너무 어려웠다. 이 부분은 실무자한테 1:1 과외로 배우는게 제일 빠를것 같다. 그리하여..

오늘의 한 줄 총평 : 과외받기


2021-03-12 TIL

|

2021-03-12 TIL


  • 오늘 한 것

    1. 학원 대면 수업(15:30~22:00) Spring
    2. 코로나 확진자 통계 SPA 만들기 - 일자별 코로나 확진자수를 그래프로 출력해야하는데 문제는 데이터가 누적데이터라는 것.. 즉, 오늘 누적 확진자수 - 어제 누적 확진자수 = 어제 확진자수 라는 것이다. 10일치씩 끊어서 그래프에 출력할 것이라 받은 데이터를 최신날짜 기준 10개로 잘라서 reduce를 걸어, 계산한 값을 reduce의 acc 배열에 담는 식으로 구현했다. 이것을 최근 10일 날짜 배열을 label로 갖는 그래프의 data에 전달해 그래프를 찍는데 성공했다.
    3. Javascript DOM 관련 동영상 강의 시청



  • 내일 할 것
    1. 코로나 확진자 SPA - map page 작성
    2. 블로그 업로드
    3. 리액트 / 자바스크립트 둘 중 하나 공부



  • 끝으로

array API 쓰는 연습을 좀 많이 해야겠다..

오늘의 한 줄 총평 : 고등래퍼 보는 날


2021-03-11 TIL

|

2021-03-11 TIL


  • 오늘 한 것

    1. 학원 대면 수업(15:30~22:00) Spring

    2. 코로나 확진자 통계 SPA 만들기 - COVID19 공공 데이터를 활용해서 화면에 그래프의 형태로 찍어주는 간단한 리액트 SPA를 만들고 있다. 데이터를 가져오는것 자체는 어렵지 않으나, 어떤 데이터를 가져와서 어떻게 가공을 할 것인가에 대한 로직을 세우는 것은 무척이나 어려웠다. Array API에 대해 알고는 있는데 전혀 적용을 못했다. 결국 구글신의 도움을 받았지만 reduce를 이렇게 사용하는 방법을 알았으니 잘 정리를 해놓고 기억해야겠다.

    3. HTML, CSS 블로그 업로드 - spring을 포기하는 대신 front쪽에 전념하기로 했다. 나중에 서버사이드 언어를 하게 되더라도 자바스크립트 생태계인 Node.js를 배우기로 다짐하고 학원에서는 HTML 처음부터 차근차근 정리해봐야겠다.



  • 내일 할 것
    1. 코로나 확진자 SPA - map page 작성
    2. 학원 대면 수업(15:30~22:00)
    3. 블로그 업로드



  • 끝으로

spring 포기

오늘의 한 줄 총평 : 선택과 집중


HTML5 Sementic Web, meta Tag, Attribute

|

HTML5 Sementic Web, meta Tag, Attribute


  1. HTML5

    • 2014년 차세대 웹 표준으로 HTML5에 아래와 같은 기능들이 추가되었다

      • Multimedia : 플래시 없이 비디오 및 오디오 기능을 자체적으로 지원
      • Graphics & Effects : SVG, Canvas(2차원), CSS3, WebGL(3차원) 그래픽을 지원
      • Connectivity : 서버와의 소켓 통신 지원으로 양방향 통신이 가능
      • Device Access : 카메라, 동작센서 등의 하드웨어를 직접 제어 가능
      • Offline & Storage : 오프라인 상태에서도 앱을 동작시킬 수 있다
      • Semantics : 시맨틱 태그를 도입
      • CSS3 : HTML5는 CSS3를 완벽하게 지원


  2. Semantic Web

    • 검색엔진에 노출이 되는 것은 아주 중요하다

    • SEO(검색엔진 최적화: Search Engine Optimization) 같은 마케팅 도구를 사용해 검색엔진이 내가 배포한 웹을 검색하기 알맞은 구조로 조정한다

    • 검색엔진은 매일 전 세계의 웹사이트 정보를 수집한다. 이를 크롤링이라 한다

    • 사용자가 검색할 만한 키워드를 예상해 인덱스를 만든다. 이를 인덱싱이라 한다

    • 검색엔진은 시맨틱 태그를 보다 명확하게 해석할 수 있다

    • 시맨틱 태그는 브라우저, 검색엔진, 개발자 모두에게 콘텐츠의 의미를 명확히 설명한다

    • 시맨틱 웹은 웹 페이지에 메타데이터를 부여하여 웹 페이지를 의미와 관련성을 가지는 거대한 데이터베이스로 구축하고자 하는 발상이다

    • HTML5에서 추가된 시맨틱 태그

      • header : 헤더
      • nav : 네비게이션
      • aside : 사이드 메뉴, 광고 등
      • section : 본문의 여러 내용 (article을 포함)
      • article : 본문의 주내용
      • footer : 푸터


  3. meta tag

    • description, keywords, author, 기타 메타데이터 정의에 사용된다
    <!-- 브라우저가 사용할 문자셋 -->
    <meta charset="utf-8">
       
    <!-- SEO를 위해 검색엔진이 사용할 키워드 -->
    <meta name="keywords" content="HTML, CSS, JavaScript">
       
    <!-- 웹 페이지 설명 -->
    <meta name="description" content="value">
       
    <!-- 웹 페이지 저자 -->
    <meta name="author" content="name"> 
       
    <!-- 웹 페이지 새로고침 -->
    <meta http-equiv="refresh" content="time"> 
    


  4. Attribute

    • HTML 태그의 속성

    • Global Attribute

      • id
      • class
      • hidden : css의 hidden과는 다르게 의미상으로도 브라우저 노출이 안됨
      • lang : 지정된 요소의 언어 지정, 크롤링시 웹 페이지의 언어를 인식하게 한다
      • style : 인라인 스타일링
      • tabindex : 사용자가 키보드로 페이지 이동시 순서 지정
      • title : 요소의 제목 지정
    • href (a 태그)

      • 페이지 내 특정 id를 갖는 요소에 링크가 가능하게 한다
      <div id="top"></div>
           
      <a href="#top">TOP</a>
      
      • mailto:
      <a href="mailto:powerlsh0103@gmail.com">Send Mail</a>
      
      • script : 자바스크립트
      <a href="javascript:alert('안녕');">push</a>
      
    • target (a 태그)

      • _blank : 링크 클릭시 새 창에서 오픈
      • _self : 링크 클릭시 현재 창에서 오픈
    • ol 태그

      • type=”1”,”A”,”a”,”ⅰ” : 순서를 나타내는 문자 지정
      • start : 리스트의 시작값 지정
      • reversed 리스트의 순서값을 역으로 표현
    • table 태그

      • rowspan : 병합할 행의 수 지정
      • colspan : 병합할 열의 수 지정
    • input 태그

      • color : 컬러 선택 폼 생성
      • date : 년월일 선택 폼 생성
      • datetime : 년월일 시분초 선택 폼 생성
      • datetime-local : 지역 시간 년월일 시분초 선택 폼 생성
      • time : 시간 선택 폼 생성
      • month : 월 선택 폼 생성
      • week : 주 선택 폼 생성
      • range : 범위 선택 폼 생성
      • search : 검색어 입력 폼 생성
      • tel : 전화번호 입력 폼 생성
      • time : 시간 입력 폼 생성
      • url : url 입력 폼 생성



참고 자료


모던 자바스크립트 deep dive