npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

react-router-vkminiapps

v1.3.1

Published

Routing library for VK Mini Apps

Downloads

2

Readme

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.

|Selectors|Description| |----|----| |modal|Для хранения id открытой модалки, так как по VKUI структура должна быть задана на старте. По умолчиню null.| |popout|Для алертов и тд. По умолчиню null.| |activeView|ID активной View.| |activePanel|ID активной панели.| |hash|Текущее значение хеш.|

|Actions|Description| |----|----| |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 hash|Panels hash|Final hash| |----|----|----| |main|/about|main/about| |main|-about|main-about| |main||main| |main|#about|about|

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

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

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

License

The MIT License.