191110 TIL useState 구현(미션1), 테이블 라이브러리 정리

» 1.5막, TIL (Today I Learned)

useState 구현(미션1)

const React = (()=>{
    let _val
    return {
        render(Component) {
            const comp = Component();
            comp.render();
            return comp;
        },
        useState(initVal) {
            const state = _val || initVal
            const setState = newVal => {
                _val = newVal
            }
            return [state, setState]
        }
    }

}
)();

function MyComponent() {
    const [foo,setFoo] = React.useState(10);
    return {
        render() {
            setFoo(foo + 1);
            console.log(`foo value is ${foo}`);
        }
    }
}

React.render(MyComponent);
React.render(MyComponent);
React.render(MyComponent);

//실행결과 
// foo value is 10
// foo value is 11
// foo value is 12

참고

  • 과제 (미션1)
//Plain 구현
const Plain = (() => {
  //구현이 필요해....
  let _val;
  let effectFn;
  let render;
  let thisComp;

  return {
    useState(initVal) {
      let state = _val || initVal;
      const setState = newVal => {
        _val = newVal();
        this.renderComponent(thisComp);
      };
      return [state, setState];
    },

    renderComponent(Component) {
        thisComp = Component;
      const comp = Component();
      render = comp.render;

      render();
      effectFn();
      return comp;
    },
    useEffect(fn) {
      effectFn = fn;
    }
  };
})();

function plain_test() {
  const [foo, setFoo] = Plain.useState(``);

  const fireEvent = () => {
    setFoo(value => new Date().toLocaleTimeString() || value);
  };

  Plain.useEffect(() => {
    console.log(`[effect]`);
    console.log(`-----------------------`);
  });

  return {
    render() {
      console.log(`[render] : ${foo}`);
    },
    fakeEvent() {
      fireEvent();
    },
    initComponent() {
      //초기화코드가 있다면 넣을수도 있음
      this.render();
      this.useEffect();
    }
  };
}

let pd = Plain.renderComponent(plain_test);

(async function loop() {
  for (let i = 0; i < 5; i++) {
    await new Promise(resolve =>
      setTimeout(() => {
        pd.fakeEvent();
        resolve();
      }, 1000)
    );
  }
})();

뭔가 이게 맞나,,, 싶은 느낌으로 이것저것 계속 해서 구현했다.
놀라웠던 포인트는 plain_test 함수를 계속 실행시켜줘야 foo 값이 바뀐다는 것,,,
디버깅을 겁나 하고나서야 깨달았다…. 휴…

테이블 라이브러리

계속 테이블을 잘 그려줄 수 있는 라이브러리를 찾고 있다.

1번 옵션: react-admin

  • 장점: 어드민 전체 프레임 워크 제공 / responsive / 탄탄한 문서
  • 단점: 만들어진 컴포넌트에 꼭 맞는 api 형식을 맞춰주어야함

2번 옵션: axui-datagrid

  • 장점: 한국인이 제작 / 많은 데이터 효과적으로 뿌려줌
  • 단점: 문서 빈약 / 페이지네이션 기능 없음

3번 옵션: ag-grid

  • 장점: 겁나 빵빵만 문서 / 유료화로 출시까지 됨(검증된 라이브러리) / 효과적인 데이터 렌더링
  • 단점: 아직까진 없는듯…

그래서 ag-grid로 결정!

좋은 라이브러리를 찾다가 [React] 리액트로 백오피스 개발하며 경험한 추천 npm 라이브러리 글을 보았고, ag-grid 알게 되었다.

부디 ag-grid에 정착할 수 있기를…