Skip to content

Vanilla JavaScript(TypeScript) UI framework package to develop SPA.

License

Notifications You must be signed in to change notification settings

ryong9rrr/sangyoon-ui

Repository files navigation

sangyoon-ui

https://www.npmjs.com/package/sangyoon-ui

sangyoon-ui는 Single Page Application 구현을 도와주는 자바스크립트(타입스크립트) UI 프레임워크입니다.

Installation

npm install sangyoon-ui

yarn add sangyoon-ui

Note : 타입스크립트로 작성되었기 때문에 따로 설치해야할 @types 모듈은 필요없습니다.

API Summary

sangyoon-ui는 크게 3가지 모듈을 지원합니다.

ui

컴포넌트 구현을 도와주는 추상클래스인 Component를 제공합니다.

Component 클래스는...

  • 상태에 따라 ui를 렌더링 시킵니다.

  • 컴포넌트 단위로 ui를 구성할 수 있습니다.

  • 라이프사이클 메서드를 지원하며 리액트의 라이프사이클에서 영감을 얻었습니다.

import { Ui } from "sangyoon-ui"

// Props, State는 제네릭으로 기본값은 {} 이고 필요없다면 생략해도 됩니다.
class App extends Ui.Component<Props, State> {
  // 여기서 App의 상태를 정의할 수 있고, 타입은 State와 동일해야합니다.
  initState(): State {
    return {}
  }

  // Component는 template()을 반드시 구현해야합니다.
  template(): string {
    return `<h1>Hello World!</h1>`
  }

  // 여기서 이벤트를 'addEvent()' 메서드를 통해 정의해야합니다.
  setEvent(){
    this.addEvent(...)
  }

  /*
  이 메서드는 현재 컴포넌트와 하위 컴포넌트를 "구독-발행" 관계로 정의합니다.
  이 메서드 내부에서 "addComponent()" 메서드를 통해 하위 컴포넌트를 등록합니다.
  */
  setChildren(){
    this.addComponent(...)
  }

  /*
  라이프사이클 메서드로, 컴포넌트가 "렌더링"되기 전에 단 한 번 실행됩니다.
  하지만 이 라이프사이클의 사용은 가급적 피하는 것이 좋습니다.
  */
  componentWillMount(){
    /*
    하지만 만약 "flux" 모듈로 전역상태스토어를 사용하고 있다면,
    여기서 setProvider() 메서드를 통해 스토어를 "구독"하세요.
    */
   this.setProvider(스토어)
  }

  /*
  라이프사이클 메서드로, 컴포넌트가 "렌더링" 된 이후에 단 한 번 실행됩니다.
  */
  componentDidMount(){}

  /*
  라이프사이클 메서드로, 컴포넌트가 "리렌더링" 된 이후마다 실행됩니다.
  */
  componentDidUpdate(){}
}

router

SPA를 위한 라우팅을 도와줍니다. url 경로에 대한 Page 설정과 navigate를 지원합니다.

이 모듈은 react-router-dom에서 영감을 받았기 때문에 다음과 같이 사용할 수 있습니다.

import { Ui, Router } from "sangyoon-ui"

class Page extends Ui.Component{ ... }
class Page2 extends Ui.Component{ ... }
class NotFoundPage extends Ui.Component{ ... }

// 페이지 렌더링이 이루어질 최상위 DOM Selector를 주입합니다.
const router = Router.createRouter(`#root`)

// addRoute() 를 통해 url과 page 컴포넌트를 등록합니다.
router.addRoute("/", Page) // "/" 경로에 매칭됩니다.
router.addRoute(`/:documentId`, Page2) // "/1", "/hi" ... 등의 경로에 매칭됩니다.

/*
만약 어떤 경로에도 매칭되지 않았을 때 보여주고 싶은 페이지가 있다면,
setNotFoundView() 메서드를 사용하세요.
*/
router.setNotFoundView(NotFoundPage)

// 경로 설정을 모두 마친 뒤에는 route() 를 호출해야합니다.
router.route()

flux

전역 상태 관리를 도와줍니다.

redux를 모티브로 구현하였기 때문에 사용법은 초창기 redux와 거의 유사합니다.

  • actionCreator()를 사용해서 "액션"을 생성하세요.

  • createStore()reducer를 주입하여 스토어를 생성하세요.

  • 컴포넌트와 flux store를 "구독-발행" 관계로 설정하기 위해서는 Component를 정의할 때 componentWillMount() 라이프사이클 메서드 안에서 setProvider() 메서드를 통해 스토어를 구독해야합니다.

    ...
    componentWillMount(){
      /*
      하지만 만약 "flux" 모듈로 전역상태스토어를 사용하고 있다면,
      여기서 setProvider() 메서드를 통해 스토어를 "구독"하세요.
      */
      this.setProvider(스토어)
    }

Examples

깃허브 저장소의 examples 폴더에서 예제 코드를 확인해보세요. 4가지 예제가 준비 되어 있습니다.

About

Vanilla JavaScript(TypeScript) UI framework package to develop SPA.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published