- 小程序路由跳转api封装
路由api简介: 文档地址:https://developers.weixin.qq.com/miniprogram/dev/api/route/wx.switchTab.html switchTab:跳转到 tabBar 页面 navigateTo:普通跳转 navigateBack:返回上一页面或多级页面 reLaunch:关闭所有页面,打开到应用内的某个页面 redirectTo:关闭当前页面,跳转到应用内的某个页面。但是不允许跳转到 tabbar 页面 痛点: 1,tabBar页面得用switchTab跳转、普通页面用navigateTo,当tabBar配置改变时,相关跳转所调用的api就需要进行修改 2,navigateBack得自己计算要返回的页面数delta,有时进入页面的路径不一样,返回相同的页面时delta就可能不一样,于是路径数量多时,计算delta显得很复杂 解决方案: 1,封装方法 jump 入参:url:要进入的页面 type:进入方式 back(返回)、reLaunch(对应api reLaunch)、redirectTo(对应api reLaunch) 函数内处理: 1,声明tabBar页面数组,判断到入参url在这数组中,则调用switchTab 2,根据传入type调用相应api 3,当type值为‘back’时,调用getCurrentPages()获取当前的页面栈,根据传入的url计算要返回的delta 使用: 普通跳转:jump('/pages/goods/detail') 返回:jump('/pages/goods/detail','back') 返回上一页:jump('back')、jump(-1) reLaunch:jump('/pages/goods/detail','reLaunch') redirectTo:jump('/pages/goods/detail','redirectTo') 具体实现: const jump = (url, type) => { const pages = getCurrentPages(); // 判断当前页面就是要跳转的url,无需处理 if (pages.length !== 0) { const nowUrl = pages[pages.length - 1].$page.fullPath; if (nowUrl === url) { return; } } if (url === 'back' || url === -1) { // jump('back') || jump(-1) wx.navigateBack(); } else if (type === 'reLaunch') { wx.reLaunch({ url, }); } else if (type === 'back') { // 返回 let delta; for (let i = 0; i < pages.length; i++) { if (('/' + pages[i].route) === url) { delta = pages.length - 1 - i; break; } } if (delta) { wx.navigateBack({ delta }); } else { // 返回时没找到要返回对应的delta wx.reLaunch({ url }); } } else { // 普通跳转 const tabList = [ // tabbar页面数组 '/pages/index/index', '/pages/store/list', ] if (tabList.indexOf(url) !== -1) { // 当前要跳转的页面是tabbar页面 wx.switchTab({ url, }); } else if (type === 'redirectTo') { wx.redirectTo({ url, }); } else { wx.navigateTo({ url, }); } } }
2021-12-02 - 小程序获取路由参数方法封装
路由传参的几种场景: 1,小程序内普通跳转传参 直接获取 onLoad (options) { doSomething(options) } 2,通过扫小程序码进入 文档:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/qr-code.html 通过扫小程序进入的时候,参数会被放在options.scene里 onLoad (options) { doSomething(decodeURIComponent(options.scene)); } 3,扫普通链接二维码打开小程序 文档:https://developers.weixin.qq.com/miniprogram/introduction/qrcode.html#%E4%BA%8C%E7%BB%B4%E7%A0%81%E8%B7%B3%E8%BD%AC%E8%A7%84%E5%88%99 通过配置扫普通链接二维码打开小程序时,参数会被放在options.q里 onLoad (options) { doSomething(decodeURIComponent(options.q)); } 函数封装: 1,将params参数字符串转成对象返回 // 获取URL参数并转换成对象 const getQueryParams = (url) => { const sUrl = url.split('?'); // 取最后一位,兼容全链接有?和纯参数无? const sParams = sUrl[sUrl.length - 1]; const arr = sParams.split('&'); // ['a=1', 'b=2'] const result = {}; arr.forEach((item) => { const keyVal = item.split('='); // key值 const key = keyVal.shift(); // value值,兼容参数没encode时有=,例如'a=b=1' => [a, b, 1] => key: a,value: b=1 const value = decodeURIComponent(keyVal.join('=')); result[key] = value; }) return result; } 2,处理上述3种场景 const handleOptions = (options = {}, key) => { let params = JSON.parse(JSON.stringify(options)); if (params.q || params.scene) { params = { ...params, ...getQueryParams(decodeURIComponent(params.q || params.scene)), } } if (key) { return params[key]; } else { return params; } } 3,使用 onLoad(options) { const params = handleOptions(options); doSomething(params); // --------直接取某个key------- const id = handleOptions(options, id); }
2021-12-06