| ¶Ô±ÈÐÂÎļþ |
| | |
| | | /** |
| | | * è·¯ç±è·³è½¬æ¹æ³ï¼è¯¥æ¹æ³ç¸å¯¹äºç´æ¥ä½¿ç¨uni.xxxç好夿¯ä½¿ç¨æ´å ç®åå¿«æ· |
| | | * å¹¶ä¸å¸¦æè·¯ç±æ¦æªåè½ |
| | | */ |
| | | |
| | | class Router { |
| | | constructor() { |
| | | // åå§å±æ§å®ä¹ |
| | | this.config = { |
| | | type: 'navigateTo', |
| | | url: '', |
| | | delta: 1, // navigateBack页é¢åéæ¶,åéç屿° |
| | | params: {}, // ä¼ éçåæ° |
| | | animationType: 'pop-in', // çªå£å¨ç»,åªå¨APPææ |
| | | animationDuration: 300, // çªå£å¨ç»æç»æ¶é´,å使¯«ç§,åªå¨APPææ |
| | | intercept: false // æ¯å¦éè¦æ¦æª |
| | | } |
| | | // å 为routeæ¹æ³æ¯éè¦å¯¹å¤èµå¼ç»å¦å¤ç对象使ç¨ï¼åæ¶routeå
é¨æä½¿ç¨thisï¼ä¼å¯¼è´route失å»ä¸ä¸æ |
| | | // è¿é卿é 彿°ä¸è¿è¡thisç»å® |
| | | this.route = this.route.bind(this) |
| | | } |
| | | |
| | | // 夿urlå颿¯å¦æ"/"ï¼å¦ææ²¡æåå ä¸ï¼å¦åæ æ³è·³è½¬ |
| | | addRootPath(url) { |
| | | return url[0] === '/' ? url : `/${url}` |
| | | } |
| | | |
| | | // æ´åè·¯ç±åæ° |
| | | mixinParam(url, params) { |
| | | url = url && this.addRootPath(url) |
| | | |
| | | // ä½¿ç¨æ£åå¹é
ï¼ä¸»è¦ä¾æ®æ¯å¤ææ¯å¦æ"/","?","="çï¼å¦â/page/index/index?name=mary" |
| | | // 妿æurl䏿getåæ°ï¼è½¬æ¢åæ é带ä¸"?" |
| | | let query = '' |
| | | if (/.*\/.*\?.*=.*/.test(url)) { |
| | | // object对象转为getç±»åçåæ° |
| | | query = uni.$u.queryParams(params, false) |
| | | // å 为已ægetåæ°,æä»¥å颿¼æ¥çåæ°éè¦å¸¦ä¸"&"éå¼ |
| | | return url += `&${query}` |
| | | } |
| | | // ç´æ¥æ¼æ¥åæ°ï¼å 为æ¤å¤url䏿²¡æåé¢çqueryåæ°ï¼ä¹å°±æ²¡æ"?/&"ä¹ç±»çç¬¦å· |
| | | query = uni.$u.queryParams(params) |
| | | return url += query |
| | | } |
| | | |
| | | // 对å¤çæ¹æ³åç§° |
| | | async route(options = {}, params = {}) { |
| | | // åå¹¶ç¨æ·çé
ç½®åå
é¨çé»è®¤é
ç½® |
| | | let mergeConfig = {} |
| | | |
| | | if (typeof options === 'string') { |
| | | // 妿options为å符串ï¼å为route(url, params)çå½¢å¼ |
| | | mergeConfig.url = this.mixinParam(options, params) |
| | | mergeConfig.type = 'navigateTo' |
| | | } else { |
| | | mergeConfig = uni.$u.deepMerge(this.config, options) |
| | | // å¦åæ£å¸¸ä½¿ç¨mergeConfigä¸çurlåparamsè¿è¡æ¼æ¥ |
| | | mergeConfig.url = this.mixinParam(options.url, options.params) |
| | | } |
| | | |
| | | // å¦ææ¬æ¬¡è·³è½¬çè·¯å¾åæ¬é¡µé¢è·¯å¾ä¸è´ï¼ä¸æ§è¡è·³è½¬ï¼é²æ¢ç¨æ·å¿«éç¹å»è·³è½¬æé®ï¼é æå¤æ¬¡è·³è½¬åä¸ä¸ªé¡µé¢çé®é¢ |
| | | if (mergeConfig.url === uni.$u.page()) return |
| | | |
| | | if (params.intercept) { |
| | | this.config.intercept = params.intercept |
| | | } |
| | | // paramsåæ°ä¹å¸¦ç»æ¦æªå¨ |
| | | mergeConfig.params = params |
| | | // åå¹¶å
å¤é¨åæ° |
| | | mergeConfig = uni.$u.deepMerge(this.config, mergeConfig) |
| | | // å¤æç¨æ·æ¯å¦å®ä¹äºæ¦æªå¨ |
| | | if (typeof uni.$u.routeIntercept === 'function') { |
| | | // å®ä¸ä¸ªpromiseï¼æ ¹æ®ç¨æ·æ§è¡resolve(true)æè
resolve(false)æ¥å³å®æ¯å¦è¿è¡è·¯ç±è·³è½¬ |
| | | const isNext = await new Promise((resolve, reject) => { |
| | | uni.$u.routeIntercept(mergeConfig, resolve) |
| | | }) |
| | | // 妿isNext为trueï¼åæ§è¡è·¯ç±è·³è½¬ |
| | | isNext && this.openPage(mergeConfig) |
| | | } else { |
| | | this.openPage(mergeConfig) |
| | | } |
| | | } |
| | | |
| | | // æ§è¡è·¯ç±è·³è½¬ |
| | | openPage(config) { |
| | | // è§£æåæ° |
| | | const { |
| | | url, |
| | | type, |
| | | delta, |
| | | animationType, |
| | | animationDuration |
| | | } = config |
| | | if (config.type == 'navigateTo' || config.type == 'to') { |
| | | uni.navigateTo({ |
| | | url, |
| | | animationType, |
| | | animationDuration |
| | | }) |
| | | } |
| | | if (config.type == 'redirectTo' || config.type == 'redirect') { |
| | | uni.redirectTo({ |
| | | url |
| | | }) |
| | | } |
| | | if (config.type == 'switchTab' || config.type == 'tab') { |
| | | uni.switchTab({ |
| | | url |
| | | }) |
| | | } |
| | | if (config.type == 'reLaunch' || config.type == 'launch') { |
| | | uni.reLaunch({ |
| | | url |
| | | }) |
| | | } |
| | | if (config.type == 'navigateBack' || config.type == 'back') { |
| | | uni.navigateBack({ |
| | | delta |
| | | }) |
| | | } |
| | | } |
| | | } |
| | | |
| | | export default (new Router()).route |