UNPKG

@tarojs/taro-quickapp

Version:

Taro quickapp framework

118 lines (105 loc) 3.34 kB
import router from '@system.router' import appGlobal from '../../global' import { addLeadingSlash, getUniqueKey } from '../../util' import { cacheDataGet, cacheDataSet } from '../../data-cache' const preloadPrivateKey = 'quick$PriPreload' const preloadInitedComponent = 'quick$PriPreloadComponent' export function navigateTo (options = {}) { return qappNavigate(options) } export function redirectTo (options = {}) { return qappNavigate(options, 'replace') } export function navigateBack (options = {}) { router.back() } export function switchTab (options = {}) { router.clear() return qappNavigate(options, 'replace') } export function getCurrentPages () { return router.getLength() } export function reLaunch (options = {}) { router.clear() return qappNavigate(options, 'replace') } function qappNavigate (options = {}, method = 'push') { const { url = '', success, fail, complete } = options const res = { errMsg: 'ok' } return new Promise((resolve, reject) => { let params = {} if (!url) { res.errMsg = 'url不能为空' fail && fail(res) reject(res) return } params = getUrlParams(url) const markIndex = url.indexOf('?') const componentPath = appGlobal.componentPath || '' let parseUrl = url.substr(0, markIndex >= 0 ? markIndex : url.length) const RelativeReg = /\.\.\//g if (componentPath && RelativeReg.test(parseUrl)) { //当前页面路径最后一级是文件,在计算路径时去除 var componentRootDir = componentPath.substr(0, componentPath.lastIndexOf('/')) var pathArr = parseUrl.split('/') //计算..出现的次数,每出现一次就往上一层 for(let path of pathArr) { if (path === '..') { componentRootDir = componentRootDir.substr(0, componentRootDir.lastIndexOf('/')) } } parseUrl = componentRootDir + '/' + parseUrl.replace(RelativeReg, '') } parseUrl = addLeadingSlash(parseUrl) appGlobal.taroRouterParamsCache = appGlobal.taroRouterParamsCache || {} appGlobal.taroRouterParamsCache[parseUrl] = params if (method === 'push' || method === 'replace') { const Component = cacheDataGet(parseUrl) if (Component) { const component = new Component() if (component.componentWillPreload) { const cacheKey = getUniqueKey() cacheDataSet(cacheKey, component.componentWillPreload(Object.assign({}, params))) cacheDataSet(preloadInitedComponent, component) params[preloadPrivateKey] = cacheKey } } } try { router[method]({ uri: parseUrl.substr(0, parseUrl.lastIndexOf('/')), params }) success && success(res) complete && complete(res) resolve(res) } catch (data) { res.errMsg = 'error' res.data = data fail && fail(res) reject(res) } }) } function getUrlParams (url = '') { const params = {} url = url.replace(/#.*$/, '') const queryArray = url.split(/[?&]/).slice(1) queryArray.forEach(item => { const match = item.match(/([^=]+)=([^=]+)/) if (match != null) { params[match[1]] = decodeURIComponent(match[2]) } }) return params } export default { reLaunch, switchTab, navigateTo, redirectTo, navigateBack, getCurrentPages }