js和(hé / huò)微信小程序路由(頁面)跳轉攔截 - 新聞資訊 - 雲南小程序開發|雲南軟件開發|雲南網站建設-昆明融晨信息技術有限公司

159-8711-8523

雲南網建設/小程序開發/軟件開發

知識

不(bù)管是(shì)網站,軟件還是(shì)小程序,都要(yào / yāo)直接或間接能爲(wéi / wèi)您産生價值,我們在(zài)追求其視覺表現的(de)同時(shí),更側重于(yú)功能的(de)便捷,營銷的(de)便利,運營的(de)高效,讓網站成爲(wéi / wèi)營銷工具,讓軟件能切實提升企業内部管理水平和(hé / huò)效率。優秀的(de)程序爲(wéi / wèi)後期升級提供便捷的(de)支持!

您當前位置>首頁 » 新聞資訊 » 小程序相關 >

js和(hé / huò)微信小程序路由(頁面)跳轉攔截

發表時(shí)間:2022-9-14

發布人(rén):融晨科技

浏覽次數:1563

前言 
在(zài)開發有登錄功能的(de)項目時(shí),不(bù)可避免的(de)需要(yào / yāo)在(zài)路由(頁面)跳轉時(shí)對當前用戶的(de)權限進行一定的(de)校驗。目前我使用的(de)比較多的(de)vue.js提供了(le/liǎo)比較好的(de)解決方案。在(zài)開發微信小程序時(shí),發現官方目前并未提供相應的(de)解決方案,根據以(yǐ)往的(de)經驗自己實現了(le/liǎo)路由(頁面)跳轉攔截。在(zài)此對兩者做一個(gè)簡單的(de)對比。

vue.js的(de)路由攔截 
vue.js官方稱之(zhī)爲(wéi / wèi)導航守衛。官方文檔很詳細,使用起來(lái)也(yě)比較簡單,此處就(jiù)不(bù)多說(shuō)了(le/liǎo),簡單的(de)示例代碼如下:

  1. // routes/index.js
  2. const router = new Router({
  3. routes: [{
  4. path: '/',
  5. name: 'Login',
  6. component: Login
  7. },
  8. {
  9. path: '/user',
  10. name: 'User',
  11. component: User,
  12. meta: {
  13. requireAuth: true
  14. }
  15. }]
  16. });
  17. // 全局導航鈎子(zǐ)
  18. router.beforeEach((to, from, next) => {
  19. // meta.requireAuth爲(wéi / wèi)true時(shí)才進行校驗
  20. if (to.meta.requireAuth) {
  21. // 此處使用vuex進行校驗,具體根據業務需求來(lái)
  22. store.dispatch('checkAuth');
  23. if (!store.state.checkAuth) {
  24. // rediect是(shì)爲(wéi / wèi)了(le/liǎo)登錄後重定向到(dào)當前頁面
  25. next({
  26. path: '/',
  27. query: {
  28. redirect: to.fullPath
  29. }
  30. });
  31. } else {
  32. next();
  33. }
  34. } else {
  35. next();
  36. }
  37. });

微信小程序的(de)路由攔截

因爲(wéi / wèi)微信小程序官方并沒有提供官方的(de)解決方案,所以(yǐ)這(zhè)裏隻能自己去實現一個(gè)。如果對node.js比較熟悉的(de)話,應該對express/koa框架中的(de)經常提到(dào)的(de)中間件概念比較熟悉,這(zhè)裏就(jiù)使用中間件的(de)機制來(lái)處理。結合小程序中Page()函數和(hé / huò)生命周期,具體代碼如下:

  1. // utils/filter.js
  2. function loginCheck(pageObj) {
  3. if (pageObj.onLoad) {
  4. let _onLoad = pageObj.onLoad;
  5. // 使用onLoad的(de)話需要(yào / yāo)傳遞options
  6. pageObj.onLoad = function (options) {
  7. if(wx.getStorageSync('USERID')) {
  8. // 獲取當前頁面
  9. let currentInstance = getPageInstance();
  10. _onLoad.call(currentInstance, options);
  11. } else {
  12. //跳轉到(dào)登錄頁
  13. wx.redirectTo({
  14. url: "/pages/login/login"
  15. });
  16. }
  17. }
  18. }
  19. return pageObj;
  20. }
  21. // 獲取當前頁面
  22. function getPageInstance() {
  23. var pages = getCurrentPages();
  24. return pages[pages.length - 1];
  25. }
  26. exports.loginCheck = loginCheck;

以(yǐ)上(shàng),通用的(de)過濾函數就(jiù)寫好了(le/liǎo)。在(zài)需要(yào / yāo)使用的(de)頁面引入該方法即可:

  1. // pages/user/user.js
  2. const filter = require('../../utils/filter');
  3. Page(filter.loginCheck({
  4. // ...
  5. onLoad: function (options) {
  6. // ...
  7. },
  8. // ...
  9. }));

總結

相比vue.js官方提供的(de)路由攔截功能,自己實現微信小程序的(de)路由攔截還是(shì)存在(zài)一定的(de)不(bù)足。比如:

微信小程序需要(yào / yāo)進行路由攔截的(de)每個(gè)頁面都需要(yào / yāo)引入,并包裝一層,使用起來(lái)還是(shì)比較繁瑣的(de)。 
vue.js是(shì)每次跳轉到(dào)新的(de)路由(頁面)前進行處理,校驗通過會跳轉到(dào)新頁面,不(bù)通過則直接跳轉到(dào)登陸頁面;而(ér)微信小程序這(zhè)裏,會先跳轉到(dào)新頁面,校驗不(bù)通過會再次跳轉到(dào)登陸頁面。 
目前在(zài)微信小程序這(zhè)方面如果有比較好的(de)解決方案的(de)話,可以(yǐ)相互交流一下。

路由跳轉攔截是(shì)一個(gè)非常常用的(de)功能,希望後續微信小程序官方能給出(chū)一個(gè)比較好的(de)官方解決方案。

相關案例查看更多