1.3.1 • Published 2 years ago

react-router-vkminiapps v1.3.1

Weekly downloads
-
License
MIT
Repository
github
Last release
2 years ago

react-router-vkminiapps

Routing library for VK Mini Apps with VKUI

Позволяет быстро и просто организовать маршрутизацию приложения на платформе VK Mini Apps с поддержкой хеш-навигации.

Установка

The package can be installed via npm:

npm install react-router-vkminiapps --save

Использование

Все приложения VK Mini Apps с VKUI имеют жесткую структуру экранов в два уровня, где на первом View, а на втором Panel. Вместо распространенного подхода с компонентами-обертками, библиотека опирается на заранее указанную структуру приложения. Это позволяет использовать нативные компоненты самой новой версии VK UI, а также иметь любой формат собственных компонентов.

Шаг 1

Создаем файл со структурой приложения. По ней алгоритм определяет все маршруты и хеш. По сути это массив views, внутри которого массив panels. Ключи id, panels и их id обязательны. Значения id в массиве должны быть уникальными.

// structure.ts
import { IStructure } from "react-router-vkminiapps";

// для удобства можно использовать enum typescript
export enum ViewTypes {
 MAIN = "MAIN",
 SETTINGS = "SETTINGS"
}

export enum PanelTypes {
 MAIN_HOME = "MAIN_HOME",
 MAIN_ABOUT = "MAIN_ABOUT",
 SETTINGS = "SETTINGS" 
}

const structure: IStructure = [
 {
  id: ViewTypes.MAIN,
  hash: "main",
  panels: [
   {
    id: PanelTypes.MAIN_HOME,
    hash: "/home"
   },
   {
    id: "about",
    hash: "/about"
   }
  ]
 },
 {
  id: ViewTypes.SETTINGS,
  hash: "settings",
  panels: [
   {
    id: PanelTypes.SETTINGS,
    hash: ""
   }
  ]
 }
];

export default structure;

Структура в файле должна правильно отображать схему интерфейса приложения VKUI.

Шаг 2

Подключаем компонент RouterProvider из библиотеки, оборачиваем в него App, и в качестве props передаем structure.

// index.tsx
import { RouterProvider } from 'react-router-vkminiapps';
import structure from './structure';
import App from './App';

const app = (
 <RouterProvider structure={structure}>
  <App/>
 </RouterProvider>
);
ReactDOM.render(app, document.getElementById("root"));

Шаг 3

Используем hoc или hooks для доступа к управлению и чтению маршрутов.

// App.tsx
import { withRouter, useRouterSelector, useRouterActions } from 'react-router-vkminiapps';
import { ViewTypes, PanelTypes } from './structure';

const App = ({router})=>{
// вместо HOC witRouter для функциональных компонентов можно использовать хуки
// const { activeView, activePanel } = useRouterSelector();
// const { toView, toPanel, toBack } = useRouterActions();

 return(
  <Epic activeStory={router.activeView} tabbar={
    <Tabbar>
      <TabbarItem
        onClick={()=>router.toView(ViewTypes.MAIN)}
        selected={router.activeView === ViewTypes.MAIN}
        text="Главная"
      >
       <Icon28NewsfeedOutline />
      </TabbarItem>
      <TabbarItem
        onClick={()=>router.toView(ViewTypes.SETTINGS)}
        selected={router.activeView === ViewTypes.SETTINGS}
        text="Настройки"
      >
       <Icon28ServicesOutline/>
      </TabbarItem>            
    </Tabbar>
  }>
    <View id={ViewTypes.MAIN} activePanel={router.activePanel}>
      <Panel id={PanelTypes.MAIN_HOME}>
        <PanelHeader>Главная</PanelHeader>
        ...
      </Panel>
      <Panel id={PanelTypes.MAIN_ABOUT}>
        <PanelHeader left={<PanelHeaderBack onClick={router.toBack}/>}>О нас</PanelHeader>
        ...
      </Panel>
    </View>
    <View id={ViewTypes.SETTINGS} activePanel={router.activePanel}>
      <Panel id={PanelTypes.SETTINGS}>
        <PanelHeader>Настройки</PanelHeader>
        ...
      </Panel>
    </View>          
  </Epic>
 );
}

export defalut withRouter(App);

Selectors and actions

Для получения selectors, в которых хранится состояние роутера, есть хук useRouterSelector, а для actions хук useRouterActions. В случае применения HOC withRouter, все они будут доступны в props router.

SelectorsDescription
modalДля хранения id открытой модалки, так как по VKUI структура должна быть задана на старте. По умолчиню null.
popoutДля алертов и тд. По умолчиню null.
activeViewID активной View.
activePanelID активной панели.
hashТекущее значение хеш.
ActionsDescription
toModalМетод для открытия модалки. В качестве аргумента передаем ID модалки.
toPopoutМетод для открытия алерта. В качестве аргумента передаем компонент с алертом или данные по принципу модалки.
toViewМетод для перехода на нужную View. В качестве аргумента передаем ID View (должна быть в structure).
toPanelМетод для перехода на нужную Panel. В качестве аргумента передаем ID панели (должна быть в structure).
toHashМетод для перехода по маршруту на основании известного хеша. В качестве аргумента строка с хешем. Сопоставит structure hash и при совпадении активирует нужный маршрут.
toBackМетод возврата на предыдущий маршрут. Благодаря хранения истории и structure сам знает куда направить пользователя. Передача аргументов не требуется.
resetHistoryСбрасывает историю переходов

Modals and Popouts

В интерфейсах VKUI модалки и алерты являются разными сущностями с различным реализацией. Данная библиотека предлагает все лишь место под хранение во внутреннем сторе, а также добавляет обработку закрытие окна по системной кнопке назад обнуляя свойства modal и popout. Если необходимости в этом нет, можно не использовать.

Hash

Конечный хеш складывается из значений хеша View и её панели, которые мы задали в structure с помощью конкатенации. Можно обойти слияние хеша для панели, если указать # в начале строки.

Views hashPanels hashFinal hash
main/aboutmain/about
main-aboutmain-about
mainmain
main#aboutabout

Загрузка приложения по нужному маршруту

Метод toHash позволяет по хеш-ссылке сразу попасть на нужную View и Panel. Хеш должен быть валидный таблице выше. При инициализации библиотека сама попытается прочитать hash из урла и сопоставить с нужным маршрутом для перенаправления.

// По умолчанию вызывается при загрузке приложения
const hash = window.location.hash.slice(1);
router.toHash(hash);

License

The MIT License.

1.3.1

2 years ago

1.3.0

2 years ago

1.2.3

2 years ago

1.2.0

3 years ago

1.2.2

3 years ago

1.2.1

3 years ago

1.1.1

3 years ago

1.1.0

3 years ago

1.0.1

3 years ago

1.0.0

3 years ago