인턴십에서 하이브리드앱개발 라이브러리인 Framework7을 사용해볼 수 있게 되어서 블로깅해보고자 한다!
안드로이드와 IOS 앱 개발을 동시에 함으로써 개발 생산성을 높이는 하이브리드앱 개발툴
난 무조건 안드로이드와 ios는 따로 개발해야하는 줄 알았는데 한번에 개발할 수 있는 라이브러리가 있다니..! 심지어 데스크탑도 지원함.. !
index.html
<!DOCTYPE html>
<html>
<head>
...
<title>SUNFUME</title>
</head>
<body>
<div id="app"></div>
</body>
</html>
<div id="app"></div>
: framework7의 최상위
app이란 id를 가진 div태그안에 framework7 으로 구성한 화면들이 들어간다.
App.tsx
// App.jsx
import { App, View, Page } from 'framework7-react';
export default () => (
<App theme="auto" name="My App" id="com.demoapp.test">
<View main>
<Page>
{/* Page Content */}
</Page>
</View>
</App>
)
App안에 View. View안에 Page의 구조로 되어있다.
앱은 웹과 다르게 페이지가 누적이 되기 때문에 페이지가 쌓일때마다 Page가 어떤형태로 변화하는지 잘 알아둘 필요성이 있다.
현재페이지일 경우 Page의 class로 page-current가 추가되고, 페이지가 이동될 경우 그 전 Page는 page-previous의 class가 붙는 방식으로 동작한다.
app.ts
import React from 'react';
import ReactDOM from 'react-dom';
import Framework7React from 'framework7-react';
import Framework7 from '@js/framework7-custom';
import '@styles/framework7-custom.less';
import '@styles/icons.css';
import '@styles/app.less';
import App from '@components/App';
//framework7을 사용
Framework7.use(Framework7React);
ReactDOM.render(React.createElement(App), document.getElementById(
useEffect(() => {
f7ready((f7) => {
f7.dialog.alert('Component mounted');
})
}, []);
react에서 f7을 쓸 때는 반드시 f7에게 router를 명시적으로 제공해야한다.
const f7params = {
name: 'My App',
id: 'com.myapp.test',
// f7params안에 routes를 넣어 전달한다.
routes: [
{
path: '/',
component: HomePage,
},
{
path: '/about/',
component: AboutPage,
},
{
path: '/login/',
component: LoginPage,
},
],
};
export default () => (
<App { ...f7params }>
<View main url="/" />
</App>
내 경우 routes/index.ts
에서 routes를 지정하고
const routes = [
{ path: '/', component: HomePage },
{ path: '/users/sign_in', component: LoginPage },
{ path: '/users/sign_up', component: SignUpPage },
{ path: '/users/:id', component: UserInfoPage },
{ path: '/category/:id', component: ItemIndexPage },
{ path: '/items/:id', component: ItemDetailPage },
{ path: '/cart', component: CartPage },
{ path: '/order', component: OrderPage },
{ path: '/order/list', component: OrderListPage },
{ path: '/like', component: LikeListPage },
{ path: '/review', component: ReviewPage },
{ path: '/mypage', component: MyPage },
//routes는 위에서 아래로 읽기 때문에 이 위의 경로가 아닐 경우 무조건 NotFoundPage를 띄운다.
{ path: '(.*)', component: NotFoundPage },
];
export default routes;
App.tsx
에서 import한 후 f7parmas로 전달해주었다.
const f7params = {
name: 'SUNFUME',
theme: 'ios',
id: 'com.insomenia.practice',
routes,
input: {
scrollIntoViewOnFocus: device.capacitor,
scrollIntoViewCentered: device.capacitor,
},
statusbar: {
iosOverlaysWebView: true,
androidOverlaysWebView: false,
},
view: {
iosDynamicNavbar: device.ios,
},
};
라이프사이클 관련
export default () => {
// 페이지 들어가기 전
const onPageBeforeIn = () => {}
// 페이지 들어갈때
const onPageInit = () => {}
return (
<Page onPageBeforeIn={onPageBeforeIn} onPageInit={onPageInit}>
...
</Page>
)
}