0.0.8-hotfix1 • Published 6 years ago

@happysanta/router v0.0.8-hotfix1

Weekly downloads
161
License
MIT
Repository
github
Last release
6 years ago

@happysanta/router

Роутер для приложений на VKUI

причины создания этой поделки описаный в статье https://vk.com/@-197036977-navigaciya-mini-apps-vkui

пример приложения с роутером https://github.com/HappySanta/router-example/tree/master/src

Changelog

0.0.7

Добавлено новое поле в событие update isNewRoute:boolean.

true - когда событие вызвано после методов push* replace*

false- когда событие вызвано переходом по истории назад или вперед

Это поле нужно использовать когда в событии update находится логика загрузки данных для предотвращения повторной загрузки когда осуществляется переход назад.

getGlobalRouter().on("update", (next:Route, old:Route|undefined, isNewRoute:boolean) => {
    if (isNewRoute) {
	  // Переход на новый экран после методов pushPage replacePage  
    } else {
	  // Переход назад popPage или бразурные кнопки
    }
    console.log("new route id", next)
    if (old) {
        console.log("old route was", old)
    }
})

Как использовать

Определить роуты

const PAGE_MAIN = '/'
const PAGE_PRODUCT = '/product/:id([0-9]+)'

const PANEL_PRODUCT = "panel_product"
const routes = {
  [PAGE_MAIN]: new Page(),
  [PAGE_PRODUCT]: new Page(PANEL_PRODUCT),
}

startGlobalRouter

startGlobalRouter(routes)

вызвать функцию в сама начале приложения еще до первого рендера

HOC withSantaRouter

В компоненте App использовать withSantaRouter чтобы получить текущий роут withSantaRouter передаст в пропсы объекты route:Route и routeState:State

route.getViewId() id View передается в VKUI как есть <Root activeView={route.getViewId()}>

getPanelIdInView(route, viewId), передается в activePanel у <View>

route.hasOverlay() ? [] : getViewHistory(route, viewId) передается в history у <View>

route.getModalId() pushModal/replaceModal

route.getPopupId() pushPopup/replacePopup

Методы для перехода между экраноами

pushPage(PAGE, params = {}) pushModal(MODAL, params = {}) pushPopup(POPOUT, params = {})

replacePage(PAGE, params = {}) replaceModal(MODAL, params = {}) replacePopup(POPOUT, params = {})

popPage() popPageIfModalOrPopup() -- перейдет назад по истории только если сейчас показана маодалка или попап

pushPageAfterPreviews(OLD_PAGE, PAGE, params = {}) -- откатиться по истории до OLD_PAGE и запушить после нее PAGE

Получить текущую страницу

getCurrentRoute():Route

useRoute()

Обратите внимание что данные меняются не синхронно со сменой панелей в VKUI, поэтому эти данные надо сохранять в компоненте

Подписаться на изменения роута

getGlobalRouter().on("update", (next:Route, old:Route|undefined, isNewRoute:boolean) => {
    if (isNewRoute) {
	  // Переход на новый экран после методов pushPage replacePage  
    } else {
	  // Переход назад popPage или бразурные кнопки
    }
    console.log("new route id", next)
    if (old) {
        console.log("old route was", old)
    }
})

или можно сделать это там где определяем роуты

export const routes: { [key: string]: Page } = {
   	[PAGE_MAIN]: new Page().onEnter((r:Route) => console.log('enter on main page', r) ),  
};

У Page есть колбеки onEnter onLeave

Фичи

withThrottlingRouter позвонят обходить проблему со слишком частой сменой панелей из-за которой VKUI может зависнуть передает то же самое что и withSantaRouter + колбек onTransitionEnd который надо вызывать на событиях onTransition у и

useHomePageCheck -- вернет true если мы находимся на первой странице

Бесконечные панели

1) Пометить роут как makeInfinity 2) использовать getViewHistoryWithLastPanel для получения списков панелей которые надо отрендерить 3) isInfinityPanel(panelId) и getInfinityPanelId(panelId) чтобы понять какой компонент рендерить

Ограничения

Нельзя вызвать синхронно методы роутера одни за другим

pushPage("/")
pushPage("/user")
popPage()
replacePage("/info")

Сейчас такой код не будет работать корректно (планируем исправить в будущем), если очень надо вызвать методы подряд то надо сделать это с небольшой задержкой.

Например так:

pushPage("/")
await delay(10)
pushPage("/user")
await delay(10)
popPage()
await delay(10)
replacePage("/info")
1.2.2

4 years ago

0.3.1

4 years ago

1.2.0

4 years ago

1.2.1

4 years ago

0.3.0

4 years ago

1.0.2

4 years ago

1.1.0

4 years ago

1.0.1

4 years ago

1.0.0

4 years ago

1.0.3

4 years ago

0.1.22

4 years ago

0.2.1

4 years ago

0.2.2

4 years ago

0.1.20

4 years ago

0.1.21

4 years ago

0.1.19

5 years ago

0.1.18

5 years ago

0.1.17

5 years ago

0.1.16

5 years ago

0.1.15

5 years ago

0.1.14

5 years ago

0.1.13

5 years ago

0.1.10

5 years ago

0.1.11

5 years ago

0.1.9

5 years ago

0.1.8

5 years ago

0.1.7

5 years ago

0.1.6

5 years ago

0.1.5

6 years ago

0.1.4

6 years ago

0.1.3

6 years ago

0.1.2

6 years ago

0.1.1

6 years ago

0.0.8-hotfix1

6 years ago

0.0.8-fix1

6 years ago

0.1.0

6 years ago

0.0.10

6 years ago

0.0.9

6 years ago

0.0.8

6 years ago

0.0.7

6 years ago

0.0.5

6 years ago

0.0.6

6 years ago

0.0.4

6 years ago

0.0.3

6 years ago

0.0.2

6 years ago

0.0.1

6 years ago