가이드는 Vite의 시작 패키지를 기준으로 작성되었습니다.
아래 가이드의 완성본은 시작 패키지 문서에서 확인할 수 있습니다.
React Hooks, Redux 를 적용한 가이드는 데모 패키지에서 확인할 수 있습니다.
참고: 이 가이드는 JavaScript(.jsx) 기준으로 작성되었습니다. TypeScript(.tsx)로 프로젝트를 구성하는 경우 npm create vite@latest <project_dir> -- --template react-ts로 생성하고, 예제 코드의 파일 확장자를 .tsx로, import하는 컴포넌트 경로도 이에 맞게 변경해주세요.
사전 설정
프로젝트 생성
npm create vite@latest <project_dir> -- --template react
패키지 설치
cd <project_dir>yarn add @ibsheet/loader react-router-dom# using npm# npm i -S @ibsheet/loader react-router-dom
- 라우트 기능의 사용을 위해
react-router-dom패키지를 추가로 설치합니다.
IBSheet 라이브러리
만약 서버 URL을 사용한다면 이 단계는 생략합니다. (예: https://demo.ibsheet.com/ibsheet/v8/samples/customer-sample/assets/ibsheet/와 같은 데모 서버 URL은 학습용으로만 사용하고, 실제 서비스에서는 라이브러리를 프로젝트에 포함해 배포하는 것을 권장합니다.)
프로젝트 폴더의 public 폴더에 ibsheet 라이브러리를 복사합니다.
├── public/| └── ibsheet/| ├── css/| ├── locale/| ├── fonts/| ├── ibsheet.js| └── ibleaders.js
개발서버 실행
yarn dev# using npm# npm run dev
메인 컴포넌트
메인 컴포넌트 혹은 모듈에서 사용할 라이브러리들을 설정(등록)합니다.
main.jsx
src/main.jsx
import { StrictMode } from "react";import { createRoot } from "react-dom/client";// import './index.css'import App from "./App.jsx";import { BrowserRouter } from "react-router-dom";createRoot(document.getElementById("root")).render(<StrictMode><BrowserRouter><App /></BrowserRouter></StrictMode>);
App.jsx
src/App.jsx
// import './App.css'import { Routes, Route, Link } from 'react-router-dom';import loader from '@ibsheet/loader';import Home from './components/home';import Page1 from './components/page1';import Page2 from './components/page2';const ibsheetLib = {name: 'ibsheet',baseUrl: '/ibsheet',locales: ['en', 'ko'],plugins: ['excel', 'common', 'dialog']}// 로더 configloader.config({registry: [ibsheetLib]});function App() {const loaderVersion = loader.version;return (<><div className="App"><p>@ibsheet/loader v{ loaderVersion }</p><div className="top-nav"><ul><li><Link to="/">Home</Link></li><li><Link to="/page1">Page1</Link></li><li><Link to="/page2">Page2</Link></li></ul></div><Routes><Route path="/" element={<Home />} /><Route path="/page1" element={<Page1 />} /><Route path="/page2" element={<Page2 />} /></Routes></div></>)}export default App
샘플 공유 데이터
각 컴포넌트에서 사용할 공용 샘플 데이터 파일을 만듭니다.
ibsheet-data.js는 날짜/숫자 포맷 등의 컬럼 옵션을 재사용하기 위해 IB_Preset을 정의한 src/shared/common.js를 import 해서 사용합니다.
서브 컴포넌트
src/components/home.jsxsrc/components/page1.jsxsrc/components/page2.jsx
Home
홈 화면에서는 ibsheet 라이브러리를 로드하지 않습니다. 만약 로드되어 있다면 컴포넌트 마운트시 unload 합니다.
src/components/home.jsx
import React, { useEffect } from 'react';import loader from '@ibsheet/loader';import reactLogo from '../assets/react.svg'function Home () {const msg = 'IBSheetLoader for React!';useEffect(() => {loader.unload();}, [])return (<><div className="home" style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}><h1>{ msg }</h1><br/><img src={reactLogo} className="App-logo" alt="logo" width="150" height="150" /></div></>)}export default Home
Page1
컴포넌트 마운트시 첫 번째 샘플 데이터로 시트를 생성합니다. 컴포넌트가 제거될 때, 해당 테이블도 제거합니다.
src/components/page1.jsx
import React, { useEffect } from "react";import loader from "@ibsheet/loader";import { SheetSampleData } from "../shared/ibsheet-data";let sheetId = "";const sheetEl = "sheetContainer";function Page1() {useEffect(() => {const { data, options } = SheetSampleData[0];loader.createSheet({el: sheetEl,options,data,}).then((sheet) => {// 주의: 해당 구간에서 데이터 조회를 하면 안됩니다. 데이터 조회는 onRenderFirstFinish 이벤트에서 실행해야합니다.sheetId = sheet.id;console.log("created sheet", sheet.id);});return () => {loader.removeSheet(sheetId);};}, []);return (<><div><p>SearchMode: 2, 기본 페이지 입니다.</p><div id={sheetEl}></div></div></>);}export default Page1;
Page2
두 번째 샘플 데이터로 시트를 생성합니다. 컴포넌트가 제거될 때, 해당 테이블도 제거합니다.
src/components/page2.jsx
import React, { useEffect } from 'react';import loader from '@ibsheet/loader';import { SheetSampleData } from '../shared/ibsheet-data';let sheetId = '';const sheetEl = 'sheetContainer';function Page2() {useEffect(() => {const { data, options } = SheetSampleData[1];loader.createSheet({el: sheetEl,options,data}).then(sheet => {// 주의: 해당 구간에서 데이터 조회를 하면 안됩니다. 데이터 조회는 onRenderFirstFinish 이벤트에서 실행해야합니다.sheetId = sheet.id;console.log('created sheet', sheet.id);});return () => {loader.removeSheet(sheetId);};}, []);return (<><div><p>SearchMode: 0, 기본 페이지입니다.</p><div id={ sheetEl }></div></div></>)}export default Page2
Package.json
"dependencies": {"@ibsheet/loader": "^1.3.4","react": "^18.2.0","react-dom": "^18.2.0","react-router-dom": "^6.15.0"},"devDependencies": {"@vitejs/plugin-react": "^4.0.0","vite": "^5.0.0"},
시작 패키지
위의 가이드 내용을 바탕으로 구성한 소스코드 저장소를 다음 페이지에서 확인할 수 있습니다.