Files
小鱼开发 3bf5c948d8 Initial commit
2024-05-24 14:16:05 +08:00

310 lines
7.7 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* 使用方法:
* 1.脚本顶部引入 const app = getApp();
* 2.Utils.$router.push(name,params,type,openMode)
* -1params为传入参数和值,如果params有值,将存在本地存储中
* -2)如果type(默认为params)为query时,参数会拼接到url后面
* -3openMode 开发方式 默认navigateTo
* 3.Utils.$router.reLaunch(name,params,type)//打开到应用内的某个页面,可跳转到Tabbar页面
* 4.Utils.$router.redirect(name,params,type)//打开到应用内的某个页面,不可重定向到Tabbar页面
* 5.Utils.$router.switchTab(name)//跳转指定的tab页
* 6.Utils.$router.back(deltah,params)//返回上n级页面
* 7.Utils.$router.backHome(params)//返回到首页
* 8.Utils.$router.webviewRedirect(name, params, openMode)//跳转到webview页面
* 9.Utils.$router.openUrlScheme //传入url结构解析后跳转
* 10.链式调用successfailcomplete
* 例:Util.$router.push("mine")
.success(res => {
console.log("success: ", res)
})
.fail(err => {
console.log("fail: ", res)
})
.complete(_ => {
console.log("complete")
})
*/
const symbol = {
reLaunch: Symbol(),
redirect: Symbol(),
switchTab: Symbol(),
}
export default class Router {
/**
* constructor 🚀
*/
constructor() {
// 当前页面携带的参数 (缓存在storage中)
this.params = null
// 当前页面携带的参数 (在query中)
this.query = null
this.callbacks = {}
this.success = function (onSuccess) {
this.callbacks.onSuccess = onSuccess
return this
}
this.fail = function (onFail) {
this.callbacks.onFail = onFail
return this
}
this.complete = function (onComplete) {
this.callbacks.onComplete = onComplete
return this
}
}
/******** Public ********/
/**
* 保留当前页面,跳转到应用内的某个页面。但是不能跳到 tabbar 页面
* @param name
* @param params
* @returns {*}
*/
push(name, params = null, type = 'params', openMode = 'navigateTo') {
// const page = isFullPath ? { url: name, name: name}:this.getPageFor(name)
const page = {
url: name,
name: name
}
if (!page) {
throw Error(`!! Not found page ->[${name}] !!`)
return
}
this.currentPage = page
if (params) {
const key = `router-${page.name}-params`
wx.setStorageSync(key, params)
this.params = this._getParams(key)
} else {
this.params = null
}
if (type === 'query') {
this.params = {}
page.url += "?"
for (let key in params) {
console.log("key: ", key)
page.url += `${key}=${params[key]}&`
this.params[key] = params[key]
}
page.url = page.url.slice(0, -1)
console.log("this.params", this.params)
}
const [, , obj] = Array.from(arguments)
const that = this
let f = wx.navigateTo
if (obj && Object.is(obj.fn, symbol.reLaunch)) {
f = wx.reLaunch
}
if (obj && Object.is(obj.fn, symbol.redirect)) {
f = wx.redirectTo
}
if (obj && Object.is(obj.fn, symbol.switchTab)) {
f = wx.switchTab
}
if (openMode == 'reLaunch') {
f = wx.reLaunch
} else if (openMode == 'redirect') {
f = wx.redirectTo
} else if(openMode == 'switchTab') {
f = wx.switchTab
}
f({
url: page.url,
...that._getFunc()
})
return this
}
/**
* 关闭所有页面,打开到应用内的某个页面 可传递参数 可跳转到Tabbar页面
* @param name
* @param params
*/
reLaunch(name, params = null, type = 'params') {
return this.push(name, params, {
fn: symbol.reLaunch
}, type)
}
/**
* 关闭所有页面,打开到应用内的某个页面 可传递参数 不可重定向到Tabbar页面
* @param name
* @param params
*/
redirect(name, params = null, type = 'params') {
return this.push(name, params, {
fn: symbol.redirect
}, type)
}
/**
* 跳转指定的tab页
* @param name
* @returns {*}
*/
//lcb://switchTab/pages/card/index
switchTab(name) {
return this.push(name, null, {
fn: symbol.switchTab
})
}
/**
* 关闭当前页面,返回上一页面或多级页面。 没有参数 代表返回上一页
* @param delta
* @param params
*/
back(delta = 1, params = null) {
if (params) {
const key = `router-${this._currentPage.name}-params`
wx.setStorageSync(key, params)
this.params = this._getParams(key)
} else {
this.params = null
}
wx.navigateBack({
delta,
...this._getFunc()
})
return this
}
/**
* 关闭所有页面返回到首页
* @param params
*/
backHome(params = null) {
// return this.back(Number.MAX_SAFE_INTEGER, params)
return this.reLaunch('/pages/index/index')
}
/**
* 跳转到webview页面
* @param name
* @param params
*/
webviewRedirect(url = null, title = '', openMode = 'navigateTo') {
return this.push('/pages/web-view/index', {
title: title,
url: encodeURIComponent(url)
}, 'query', openMode)
}
/**
* 跳转到其他小程序
* @param url
*/
//调整小程序数据格式,appId要先加到app.json中
//'lcb://navigateToMiniPrograms??appId=wx636830278bc7b5f4@path=/pages/consultant?id=1@envVersion=release@extraData={"fromwhere":"aolai"}'
navigateToMiniProgramRedirect(OBJ) {
let search = OBJ.split('??')[1]
let appId = this._getQueryString('appId',search)
let path = this._getQueryString('path',search)
let extraData = JSON.parse(this._getQueryString('extraData',search))
let envVersion = this._getQueryString('envVersion',search) || 'release'
wx.navigateToMiniProgram({
appId: appId,
path: path,
extraData: extraData,
envVersion: envVersion
})
return this
}
/**
* 传入url结构解析后跳转
* @param url
*/
openUrlScheme(url = null, title = '', extraData = {}, openMode = 'navigateTo') {
if (url.indexOf('lcb://navigateToMiniProgram') > -1) {
this.navigateToMiniProgramRedirect(url)
} else if (url.indexOf('lcb://switchTab') > -1) {
this.switchTab(url.split('switchTab')[1])
// } else if(url.indexOf('ixm://reLaunch')>-1) {
// this.reLaunch(url.split('reLaunch')[1])
// } else if(url.indexOf('ixm://redirectTo')>-1) {
// this.redirect(url.split('redirectTo')[1])
// } else if(url.indexOf('ixm://navigateTo')>-1){
// this.push(url.split('navigateTo')[1])
// } else if(url.indexOf('ixm://navigateBack')>-1){
// this.back(url.split('navigateBack/')[1])
}else if (url.indexOf('http') > -1) {
this.webviewRedirect(url, title, extraData, openMode)
} else {
this.push(url)
}
return this
}
/******** Private ********/
/**
* 获取函数
* @returns {{fail: fail, success: success, complete: complete}}
* @private
*/
_getFunc() {
let that = this
return {
success: function (res) {
if (that.callbacks.onSuccess) that.callbacks.onSuccess(res)
},
fail: function (err) {
if (that.callbacks.onFail) that.callbacks.onFail(err)
},
complete: function () {
if (that.callbacks.onComplete) that.callbacks.onComplete()
}
}
}
/**
* 获取当前跳转的页面的携带的参数
* @param key
* @returns {*}
* @private
*/
_getParams(key) {
return wx.getStorageSync(key)
}
/**
* 获取url的query值
* @param name
* @private
*/
_getQueryString = (name, url) => {
if (url.indexOf(name) > -1) {
var reg = new RegExp('(^|@)' + name + '=([^@]*)(@|$)', 'i');
var r = url.match(reg)
if (r != null) {
return decodeURI(r[2]);
}
}
return null;
}
}