Microservice React

Introducing Microservice React !!

Microservice React is space to learn with React.

Contents

Table of Contents

NoTitleRemarks
0환경설정React환경셋팅
1ReactReact
2MobxMobx
3Atomic DesignAtomic Design

Learning

Table of Learning

NoTitleEducational InstitutionLecturerTermRemarks
1리액트 + 몹엑스 기초 강의나무소리나무소리2022.04.30 ~ 2022.04.30Mobx

Get Started(React)

0. Node.js 설치

React로 프로젝트 만들기

1. CRA(Create React App) 설치하기

  • NPM 명령어를 이용해서 CRA를 설치할 수 있습니다.
    npm install -g create-react-app
    

    2. React 프로젝트 생성하기

  • 특정한 폴더로 이동하여 create-react-app 명령어를 이용하여 spa라는 폴더를 만들어 보도록 하겠습니다.
  • #c:\Data\create-react-app jobmarketplace
    #D:\Project\Java\react> create-react-app spa
    $ npx create-react-app spa
    # or
    $ yarn create react-app [프로젝트명]
    

3. 서버 가동하기

  • yarn으로 가동 가능, 만약 yarn이 설치 안되어 있으면…
npm install --global yarn
yarn start

yarn start = (npm start)
yarn build = (npm run build)
yarn test  = (npm run test)
yarn eject = (npm run eject)
  • Windows에서 실행 스크립트 오류날때
Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope LocalMachine
  • npm으로 가동하기 위해서는 아래와 같이 함.(npm start)

4. 페이지 이동을 구현하기 위해 router 구현

$ npm install react-router-dom —save 
or
$ yarn add react-router-dom

5. Styled Component 설치

Sytled-component

JS 안에 CSS 를 작성 Tagged Template Literal 이라는 문법 사용 가능

$ npm install --save styled-components
# or
$ yarn add styled-components

6. 사라지는 메시지 출력 위해 toast 라이브러리를 적용

$ npm install -s react-toasts

7. 서버와의 통신목적의 라이브러리 axios를 설치(From React client)

$ npm install --save axios
# or
$ yarn add axios

8. Node.js 서버 파일 업로드 처리 라이브러리 multer를 설치(From Node.js Server)

$ npm install --save multer

React

Virtual DOM 은 가상의 DOM 인데요, 브라우저에 실제로 보여지는 DOM 이 아니라 그냥 메모리에 가상으로 존재하는 DOM 으로서 그냥 JavaScript 객체이기 때문에 작동 성능이 실제로 브라우저에서 DOM 을 보여주는 것 보다 속도가 훨씬 빠릅니다. 리액트는 상태가 업데이트 되면, 업데이트가 필요한 곳의 UI 를 Virtual DOM 을 통해서 렌더링합니다. 그리고 나서 리액트 개발팀이 만든 매우 효율적인 비교 알고리즘을 통하여 실제 브라우저에 보여지고 있는 DOM 과 비교를 한 후, 차이가 있는 곳을 감지하여 이를 실제 DOM 에 패치시켜줍니다

class 하나가 Component 하나 임.

1. JSX

JSX(JavaScript + XML) : javascript에서 html tag를 사용하게 해줌 JSX 내부에 자바스크립트 변수를 보여줘야 할 때에는 {} 으로 감싸서 보여줍니다. TEXT 영역에 {}를 사용하면 javascript문법을 사용 가능함. JSX 에서 태그에 style 과 CSS class 를 설정하는 방법은 HTML 에서 설정하는 방법과 다릅니다. 우선, 인라인 스타일은 객체 형태로 작성을 해야 하며, background-color 처럼 - 로 구분되어 있는 이름들은 backgroundColor 처럼 camelCase 형태로 네이밍 해주어야 합니다. CSS class 를 설정 할 때에는 class= 가 아닌 className= 으로 설정을 해주어야 합니다. JSX 내부의 주석은 {/* 이런 형태로 */} 작성합니다.

<button onclick="() => { console.log('clicked') }" type="submit">Like</button>
$('button').text('Liked');
class LikeButton extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      liked: false,
    }
  }
  render() {
    return <button type="submit" onClick={() => {this.setState({liked:true})}}>Like</button>;
    //  e(
    //   'button',
    //   { onClick: () => { this.setState( { liked: true})}, type: 'submit' },
    //   this.state.liked === true ? 'Liked' : 'Like',
    // );
  }
}

2. Prop vs State

① props 를 통해 컴포넌트에게 값 전달하기

props 는 properties 의 줄임말입니다. 어떠한 값을 컴포넌트에게 전달해줘야 할 때, props 를 사용합니다. props 는 객체 형태로 전달되며, 만약 name 값을 조회하고 싶다면 props.name 을 조회하면 됩니다.

import React from 'react';

export default
function Hello(props) {
  return <div style=>안녕하세요 {props.name}</div>
}
  • props 비구조화 할당 ```javascript import React from ‘react’;

export default function Hello({ color, name }) { return <div style=>안녕하세요 {name}</div> }


* props.children

> 컴포넌트 태그 사이에 넣은 값을 조회하고 싶을 땐, props.children 을 조회하면 됩니다.
> props 이름만 작성하고 값 설정을 생략한다면, 이를 true 로 설정한 것으로 간주합니다.

#### ② state : 컴포넌트에서 동적인 값을 상태(state)라고 부릅니다.

> 리액트에 useState 라는 함수를 사용 하여 컴포넌트에서 상태를 관리.
> 함수형 업데이트(prevNumber => prevNumber + 1)는 주로 나중에 컴포넌트를 최적화를 하게 될 때 사용

```javascript
import React, { useState } from 'react';

/**
 *
 *
 * @export
 * @return {*}
 */
export default function Counter() {
    const [number, setNumber] = useState(0);

    const onIncrease = () => {
        // 함수형 update → 컴포넌트를 최적화 할때 사용
        setNumber(prevNumber => prevNumber + 1);
    };
    const onDecrease = () => {
        setNumber(prevNumber => prevNumber - 1);
    };

    return (
        <div>
            <h1>{number}</h1>
            <button onClick={onIncrease}>+1</button>
            <button onClick={onDecrease}>-1</button>
        </div>
    );
}

리액트에서 엘리먼트에 이벤트를 설정해줄때에는 on이벤트이름={실행하고싶은함수} 형태 onClick={onIncrease()}

이벤트에 등록하는 함수에서는 이벤트 객체 e 를 파라미터로 받아와서 사용 할 수 있는데 이 객체의 e.target 은 이벤트가 발생한 DOM 인 input DOM 을 가르키게됩니다. 이 DOM 의 value 값, 즉 e.target.value 를 조회하면 현재 input 에 입력한 값이 무엇인지 알 수 있습니다.

import React, { useState } from 'react';

/**
 *
 *
 * @export
 * @return {*}
 */
export default function Input() {
    const [text, setText] = useState('');

    const onChange = e => {
        setText(e.target.value);
    };

    const onReset = () => {
        setText('');
    };

    return (
        <div>
            <input onChange={onChange} value={text} />
            <button onClick={onReset}>초기화</button>
            <div>
                <b>: {text}</b>
            </div>
        </div>
    );
}

리액트 상태에서 객체를 수정해야 할 때에는,inputs[name] = value; 이런식으로 직접 수정하면 안됩니다.그 대신에, 새로운 객체를 만들어서 새로운 객체에 변화를 주고, 이를 상태로 사용해주어야 합니다. setInputs({ ...inputs, [name]: value });

import React, { useState, useRef } from 'react';

export default function InputMolecules() {
    const [inputs, setInputs] = useState({
        name: '',
        nickname: '',
    });

    const nameInput = useRef();

    const { name, nickname } = inputs; // 비구조화 할당을 통해 값 추출

    const onChange = e => {
        const { value, name } = e.target; // 우선 e.target 에서 name 과 value 를 추출
        setInputs({
            ...inputs, // 기존의 input 객체를 복사한 뒤
            [name]: value, // name 키를 가진 값을 value 로 설정
        });
    };

    const onReset = () => {
        setInputs({
            name: '',
            nickname: '',
        });
        nameInput.current.focus();
    };

    return (
        <div>
            <input
                name="name"
                placeholder="이름"
                onChange={onChange}
                value={name}
                ref={nameInput}
            />
            <input
                name="nickname"
                placeholder="닉네임"
                onChange={onChange}
                value={nickname}
            />
            <button onClick={onReset}>초기화</button>
            <div>
                <b>: </b>
                {name} ({nickname})
            </div>
        </div>
    );
}

③ useRef 로 특정 DOM 선택하기

JavaScript 를 사용 할 때에는, 우리가 특정 DOM 을 선택해야 하는 상황에 getElementById, querySelector 같은 DOM Selector 함수를 사용해서 DOM 을 선택합니다. 리액트를 사용하는 프로젝트에서도 가끔씩 DOM 을 직접 선택해야 하는 상황이 발생 할 때도 있습니다. 예를 들어서 특정 엘리먼트의 크기를 가져와야 한다던지, 스크롤바 위치를 가져오거나 설정해야된다던지, 또는 포커스를 설정해줘야된다던지 등 정말 다양한 상황이 있겠죠. 추가적으로 Video.js, JWPlayer 같은 HTML5 Video 관련 라이브러리, 또는 D3, chart.js 같은 그래프 관련 라이브러리 등의 외부 라이브러리를 사용해야 할 때에도 특정 DOM 에다 적용하기 때문에 DOM 을 선택해야 하는 상황이 발생 할 수 있습니다. 그럴 땐, 리액트에서 ref 라는 것을 사용합니다. 함수형 컴포넌트에서 ref 를 사용 할 때에는 useRef 라는 Hook 함수를 사용합니다 useRef() 를 사용하여 Ref 객체를 만들고, 이 객체를 우리가 선택하고 싶은 DOM 에 ref 값으로 설정해주어야 합니다. 그러면, Ref 객체의 .current 값은 우리가 원하는 DOM 을 가르키게 됩니다. 위 예제에서는 onReset 함수에서 input 에 포커스를 하는 focus() DOM API 를 호출해주었습니다.

④ React에서 배열 Rendering 하기

리액트에서 배열을 렌더링 할 때에는 key 라는 props 를 설정해야합니다. key 값은 각 원소들마다 가지고 있는 고유값으로 설정을 해야합니다. 배열을 렌더링 할 때에는 고유한 key 값이 있는것이 중요하며, 만약에 배열안에 중복되는 key 가 있을 때에는 렌더링시에 오류메시지가 콘솔에 나타나게 되며, 업데이트가 제대로 이루어지지 않게 됩니다.

import React from 'react';

function User({ user }) {
    return (
        <div>
            <b>{user.username}</b> <span>({user.email})</span>
        </div>
    );
}

export default function UserStore() {
    const users = [
        {
            id: 1,
            username: 'velopert',
            email: 'public.velopert@gmail.com',
        },
        {
            id: 2,
            username: 'tester',
            email: 'tester@example.com',
        },
        {
            id: 3,
            username: 'liz',
            email: 'liz@example.com',
        },
    ];

    return (
        <div>
            {users.map(user => (
                <User user={user} key={user.id} />
            ))}
        </div>
    );
}

만약 배열 안의 원소가 가지고 있는 고유한 값이 없다면 map() 함수를 사용 할 때 설정하는 콜백함수의 두번째 파라미터 index 를 key 로 사용하시면 됩니다.

<div>
  {users.map((user, index) => (
    <User user={user} key={index} />
  ))}
</div>

배열에 새 항목을 추가 할 때에는 spread 연산자를 사용하거나, concat 을 사용하시면 됩니다. 배열에 있는 항목을 제거할 때에는, 추가할떄와 마찬가지로 불변성을 지켜가면서 업데이트를 해주어야 합니다. 불변성을 지키면서 특정 원소를 배열에서 제거하기 위해서는 filter 배열 내장 함수를 사용하는것이 가장 편합니다. 이 함수는 배열에서 특정 조건이 만족하는 원소들만 추출하여 새로운 배열을 만들어줍니다.

컴포넌트 마운트시 하는 주요 업무

  • props 로 받은 값을 컴포넌트의 로컬 상태로 설정
  • 외부 API 요청 (REST API 등)
  • 라이브러리 사용 (D3, Video.js 등…)
  • setInterval 을 통한 반복작업 혹은 setTimeout 을 통한 작업 예약

useEffect 를 사용 할 때에는 첫번째 파라미터에는 함수, 두번째 파라미터에는 의존값이 들어있는 배열 (deps)을 넣습니다. 만약에 deps 배열을 비우게 된다면, 컴포넌트가 처음 나타날때에만 useEffect 에 등록한 함수가 호출됩니다.그리고, useEffect 에서는 함수를 반환 할 수 있는데 이를 cleanup 함수라고 부릅니다. cleanup 함수는 useEffect 에 대한 뒷정리를 해준다고 이해하시면 되는데요, deps 가 비어있는 경우에는 컴포넌트가 사라질 때 cleanup 함수가 호출됩니다.

useEffect 안에서 사용하는 상태나, props 가 있다면, useEffect 의 deps 에 넣어주어야 합니다. 그렇게 하는게, 규칙입니다.만약 useEffect 안에서 사용하는 상태나 props 를 deps 에 넣지 않게 된다면 useEffect 에 등록한 함수가 실행 될 때 최신 props / 상태를 가르키지 않게 됩니다.

리액트 컴포넌트는 기본적으로 부모컴포넌트가 리렌더링되면 자식 컴포넌트 또한 리렌더링이 됩니다.

useMemo 의 첫번째 파라미터에는 어떻게 연산할지 정의하는 함수를 넣어주면 되고 두번째 파라미터에는 deps 배열을 넣어주면 되는데, 이 배열 안에 넣은 내용이 바뀌면, 우리가 등록한 함수를 호출해서 값을 연산해주고, 만약에 내용이 바뀌지 않았다면 이전에 연산한 값을 재사용하게 됩니다

const count = useMemo(() => countActiveUsers(users), [users]);

useReducer 상태 업데이트 로직을 컴포넌트에서 분리 reducer 에서 반환하는 상태는 곧 컴포넌트가 지닐 새로운 상태가 됩니다.

function reducer(state, action) {
  // 새로운 상태를 만드는 로직
  // const nextState = ...
  return nextState;
}

const [state, dispatch] = useReducer(reducer, initialState); state 는 우리가 앞으로 컴포넌트에서 사용 할 수 있는 상태를 가르키게 되고, dispatch 는 액션을 발생시키는 함수 dispatch({ type: ‘INCREMENT’ }). useReducer 에 넣는 첫번째 파라미터는 reducer 함수이고, 두번째 파라미터는 초기 상태입니다.

React 최적화 작업

함수들은 컴포넌트가 리렌더링 될 때 마다 새로 만들어집니다. 함수를 선언하는 것 자체는 사실 메모리도, CPU 도 리소스를 많이 차지 하는 작업은 아니기 때문에 함수를 새로 선언한다고 해서 그 자체 만으로 큰 부하가 생길일은 없지만, 한번 만든 함수를 필요할때만 새로 만들고 재사용하는 것은 여전히 중요합니다. 그 이유는, 우리가 나중에 컴포넌트에서 props 가 바뀌지 않았으면 Virtual DOM 에 새로 렌더링하는 것 조차 하지 않고 컴포넌트의 결과물을 재사용 하는 최적화 작업을 할건데요, 이 작업을 하려면, 함수를 재사용하는것이 필수입니다.

컴포넌트에서 관리하는 값이 여러개가 되어서 상태의 구조가 복잡해진다면 useReducer로 관리 setter 를 한 함수에서 여러번 사용해야 하는 일이 발생한다면, useReducer사용 고민 필요

setUsers(users => users.concat(user));
setInputs({
  username: '',
  email: ''
});

Class형 Component

클래스형 컴포넌트에서는 render() 메서드가 꼭 있어야 합니다. 이 메서드에서 렌더링하고 싶은 JSX 를 반환하시면 됩니다. 그리고, props 를 조회 해야 할 때에는 this.props 를 조회하시면 됩니다. 상태를 업데이트 할 때에는 이 메서드에서 this.setState 라는 함수를 사용해야 하는데요,


React의 라이프 사이클(Life Cycle) 이해

  • Hook 사용시에는 그렇게 중요하지 않다

  • 기본적으로 리액트 라이브러리가 처음 컴포넌트를 실행할 때는 다음의 순서를 따릅니다.

① constructor()

constructor 는 컴포넌트의 생성자 메서드입니다. 컴포넌트가 만들어지면 가장 먼저 실행되는 메서드입니다.

② componentWillMount()

③ render()

④ componentDidMount()

컴포넌트의 첫번째 렌더링이 마치고 나면 호출되는 메서드입니다. 이 메서드가 호출되는 시점에는 우리가 만든 컴포넌트가 화면에 나타난 상태입니다. 여기선 주로 D3, masonry 처럼 DOM 을 사용해야하는 외부 라이브러리 연동을 하거나, 해당 컴포넌트에서 필요로하는 데이터를 요청하기 위해 axios, fetch 등을 통하여 ajax 요청을 하거나, DOM 의 속성을 읽거나 직접 변경하는 작업을 진행합니다


Mobx

$ yarn add mobx mobx-react
# decorator 사용하기
$ yarn add @babel/plugin-proposal-class-properties @babel/plugin-proposal-decorators
# or
$ npm i --save-dev @babel/plugin-proposal-class-properties @babel/plugin-proposal-decorators
yarn add --dev customize-cra react-app-rewired @babel/plugin-proposal-decorators @babel/plugin-proposal-class-properties core-decorators mobx mobx-react autobind-decorator
#yarn add --dev customize-cra
#yarn add --dev react-app-rewired
#yarn add --dev core-decorators 
 "scripts": {
    "start": "react-app-rewired start",
    "build": "react-app-rewired build",
    "test": "react-app-rewired test",
    "eject": "react-scripts eject"
  },
  • tsconfig.json
{
  "compilerOptions": {
    "experimentalDecorators": true,
  }
}
  • material ui icons
$ yarn add @material-ui/icons
$ yarn add @material-ui/pickers
$ yarn add @date-io/date-fns
#$ yarn add date-fns
#$ yarn add moment
$ yarn add @date-io/date-fns@1.x date-fns
$ yarn add @date-io/moment@1.x moment
# $ yarn add @date-io/luxon@1.x luxon
# $ yarn add @date-io/dayjs@1.x dayjs


Design

1. Atomic Design

간략한 특징은 다음과 같이 Atoms(원자), Molecules(분자), Organisms(유기체), Templates, Pages 분류로 React Component의 종류와 규모에 맞게 적절히 분류해서 생성하여 관리합니다.

a. Atomic Design 단계 구분

  • Atoms(원자), Molecules(분자), Organisms(유기체), Templates, Pages

Atoms(원자) : 가장 작은 단위의 컴포넌트들로 버튼, 체크박스, div, radio 박스, span, textarea 등 html로 개발 시 사용 되는 대부분의 태그들을 atom 컴포넌트로 생성해 놓음 Molecules(분자) : 두개 이상의 atom 묶음, 또는 기능이 추가된 컴포넌트 organisms : molecule보다 더 많은 컴포넌트들의 묶음, 또는 더 많은 기능이 추가된 컴포넌트 templates : organism 과 비슷하거나 더 많은 컴포넌트 또는 기능들이 있는 단위이며, 주로 화면에서 하나의 영역을 구성하는 경우에 사용된다 (예:검색 영역) pages : 화면 개발단위로 여기에서 template 이하의 컴포넌트들을 불러서 개발

b. Atomic Design 적용한 폴더 구조

  • atoms : 버튼, 체크박스, div, radio 박스, span, textarea 등
import styled, {css} from styled-component #사용
  • cmm : common.js → COMPS_KEY 등 핵심 선언
  • commonComp : 서버통신등 라이브러니(공통 컴포넌트)
  • containers : Layout 및 Route
    예) gnbLayout.js
        compsKey + Cmn.getNewCompsKey(this, ‘GnbLayout’): 반드시 넣어야 함
    
      render 밑에 <DivAtom compsKey={this.compsKey} args= store={store} sort={‘box’} >
  • molecules : selectBox, 버튼, 체크박스 등
  • organisms : 테이블, 로그인 등
  • pages : 화면
  • stores : 화면 상태 → page별로 상태를 관리한다
  • styles : styled component에서 사용 할 css를 정의(주로 atom단위로 생성됨) test코드는 시각적인 효과일 뿐 실제로 사용되지 않음 _base등 언더바로 시작하는 변수는 클래스 내부에서만 사용하는 용도 default는 자주 사용되는 스타일을 선언한 것으로 특별한 설정이 없을 시 기본으로 사용된다 key_value 구조의 변수는 커스텀 스타일을 지정한 객체로 개발자가 [Cmm.CUSTOM_SC]: {key: value} 형식으로 불러서 사용할 수 있으며 이때 default 객체는 사용되지 않는다

    예) UlAtom UlStyle

  • test코드는 시각적으로 보기 좋게..
  • _base : 전체 적용시
  • default : 기본 적용 되는 것 (백틱) → 예) 일반스트링, ${자바스크립트문법}
  • customs style 적용 :
  • 자주 사용되는 다른 스타일은 key_value 구조로 변수명을 작성 예) type_menu
  • 정말로 1군데 만 사용 하는 곳 → 예) searchContentTemplate.js ┖ 예) args=}, args=}

  • 기타

template : //* → 예) 설계자 주석 리액트 순수 코드로 개발해서 꽃아넣어도 돌아가는데 문제 없다. Data는 페이지 단위로, 공통으로 쓰는 BaseStore, PopupStore는 따로 있는데..page 단위로 Store를만들기로 했음. → 메뉴하나당 store는 하나임

Mobx Store는 index.js에 다 선언을 해주어야 함. rootLayout.js : 브라우저 전체 화면 Atom.js는 args=style을 입히면 되지만, 그 위에 있는거에서는 여러 개가 묶여 있어서 그렇게 줄수가 없고 tableAttr:{STYLE:{}}

상위 Component에서 하위 Component로 값을 내리는 방법이 2가지 있음

① Mobx Store를 통해서 전달하는 방법 → store에 param으로 지정해서 내려주는 것은 저 멀리까지 감

store는 끝까지 상속을 받음으로..중간단계에 Component도 param을 사용하고 상위도 param을 사용하면 겹쳐짐으로, 중간단계(Molecule, Organizm, Template)는 최대한 arg를 사용해야 함. Component가 로드가 완료되었을 때 DidMount가 됨 → 그 순서가 제일 마지막 것 부터임. Page → Organizm → Molecular → Atom 제일 마지막 Component부터 DidMount가 됨

예전 Javascript에서 onload 될때 실행되는 함수, React는 따로 없어서 onload = () => { 함수를 props로 던짐 예가 실행되는 시점이 이해가 되었다면, DidMount가 내 바로 자식이 DidMount되지 직전에 되니까, param를 onload에 넣어놓았음..store를 param을 계속 업어치니까, 마지막에 page단위로 Cmm.getParam을 불르는데 이때 arg까지 같이 부름

② arg를 통해서 전달하는 방법 → 바로 밑에만 전달됨

compsKey : Component들의 Key → 내부모로부터 나한테까지 오는 모든 route가 다 기록되어 있음. 예) gnbLayout.js compsKey + Cmn.getNewCompsKey(this, ‘GnbLayout’): 반드시 넣어야 함 render 밑에 <DivAtom compsKey={this.compsKey} args= store={store} sort={‘box’} > 여러 개의 button중에서 찾아가는 것도 필요함 그게 sort={0} Sort 용도 : 현재 Component에서 동일한 자식 Component가 2번 이상 사용될 때 sort={0} {1} {‘deleteButton’} 구별해서 사용함 크롬 개발자 도구 Component의 구별은 _, sort구별은 ‘$’ 로 함. Cmn.getChildKey가 상위 부모 Component의 경로를 다 붙어서 줌 [Cmn.getChildKey(this, ‘_ListOrganizm$0’)]: { }

Route를 Page쪽에서만 쓰게 했음. Content만.. 변하게끔… ContentRoute.js baseStore는 백엔드랑 통신할 때 사용하기 위해 사용함. sampleListStore.js 필수 영역은 store만들 때 필수로 넣어서 개발 해야 함. Store에 객체는 2개가 있음, data와 param임, Param은 arg를 대체할수 있는 애(즉 저 멀리까지 던질수 있는 것) → 화면하고 관련된 애들은………param에 들어감. Data는 하드코드이거나 자료를 조회올 때 가져오는 것 ds_cond, ds_list Data = {}; 성능 이슈가 있음

얕은 비교 vs 깊은 비교

얕은 비교를 통해서 달라졌을때만 화면에 rendering을 함.

구조분해할당을 하면 복사를 함.
this.data = { …this.data }; Data = {ds_cond:[aaa:1]};

WillUnmount에서 Will Unmout전, Did Unmout 후 Ds_cond = {aaa:1}; Aaa =1;

어떤 것을 개발해도, 그 화면을 모든것을하고 떠날때에는 reset을 호출해야 함. refreshData() → 직접 값 변경하고 setData하지 말고..refresh함.

Didmount는 onload함수 호출, WillUnmout는 꼭 page단에서만. Arg= → 자식중에 1놈에만 실행 시킴

<body onload=’reload’ → componentDidMount는 onload처럼 작동을 하지 않음 내 자식의 componentDidMount에 넣으면 onload처럼 작동함. 자식 componentDidMount() { This.props.arg.onload(); // arg는 한번만 내려감. Cmn.doOnload(this);

Cmm.appendStore( data와 param넣을 때 이런 명령어를 사용하여 넣어야 함) Append 해야 함.

Param
{
	 A:1,
	B:3
}
Param
{
	A;1,
C:1
}
Arg 
{
	C:1,
	B:2
}
# A,b,c   B를 3으로 인식함

Page에서는 html 태그를 맘대로 사용해도 됨…왜냐면 따로 불러사용하는곳이 없음 예) colgroup은 그냥 사용함. Atom.js에 className={this.compsKey} //* 필수 : 컴포넌트 추적을 위해 className에 compsKey문자열을 추가한다 함수영역에서는 모든 자바스크립를 쓸수 있지만, render() { return 영역은 3항 연산자만 쓸수 있다. onclick={(e)=>()} 미리 집어 넣지안으면 안되다 value={null} 안되는경우도 있음 value={‘’} Cmn.getParamsAll(this. 모든 성능이슈는 render가 소스가 길면 길수록 오래 걸린다.


Reference