日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

如何基于uniapp框架實(shí)現(xiàn)動(dòng)態(tài)路由、動(dòng)態(tài)tabbar?本篇文章就來(lái)給大家介紹一下uniapp動(dòng)態(tài)路由實(shí)戰(zhàn),手把手教大家在uniapp中實(shí)現(xiàn)動(dòng)態(tài)路由。


手把手教你基于uniapp框架實(shí)現(xiàn)動(dòng)態(tài)路由、動(dòng)態(tài)tabbar


uniapp用來(lái)開發(fā)app還是比較方便快捷的,官網(wǎng)教程挺細(xì)致,幾乎所有問(wèn)題都能找到答案。網(wǎng)上也有不少入門教程,騰訊課堂、b站上有好幾個(gè)視頻教程,感覺(jué)還可以(其實(shí)我沒(méi)怎么看),比較偏實(shí)戰(zhàn),可以動(dòng)手試一下。

本文假設(shè)閱讀者已經(jīng)基本掌握了uniapp的入門開發(fā)技能,如果還沒(méi)有掌握uniapp,但你準(zhǔn)備進(jìn)行相關(guān)開發(fā),趕緊從官方文檔入手,再結(jié)合實(shí)戰(zhàn)視頻操作就好了,前面推薦的都不錯(cuò)。好了,進(jìn)入本文主題——如何基于uniapp框架實(shí)現(xiàn)動(dòng)態(tài)路由、動(dòng)態(tài)tabbar。

現(xiàn)狀分析

vue項(xiàng)目上有路由插件Vue Router,所有路由都是統(tǒng)一管理,可以統(tǒng)一攔截,控制下一步動(dòng)作,但是在uniapp上,情況就不一樣了。uniapp上沒(méi)有路由插件,然后頁(yè)面分為tabbar和非tabbar兩種,頁(yè)面跳轉(zhuǎn)也有自己的一套api,最重要的路由攔截功能并不支持,所有的頁(yè)面都是在page.json文件里提前配置好。

需求分析

那假設(shè)我們要在app上做一套對(duì)應(yīng)著用戶權(quán)限的東西,就是不同用戶,根據(jù)權(quán)限配置,決定了他進(jìn)來(lái)后能用哪些頁(yè)面哪些按鈕,甚至是能控制到tabbar這塊。這個(gè)需求,就需要根據(jù)權(quán)限控制路由內(nèi)容及導(dǎo)向,但在目前條件下是實(shí)現(xiàn)不了的。不過(guò)在插件市場(chǎng)有不少人寫了路由插件,思路其實(shí)都是向web端的vue Router看齊的,能完整滿足需求的只有這個(gè)路由插件。

還有很重要的一個(gè)需求就是動(dòng)態(tài)tabbar,這是一個(gè)很重要內(nèi)容,就是在app登錄后主頁(yè)下面的一欄按鈕,這些tabbar基本上包括了app的主要內(nèi)容,如何實(shí)現(xiàn)動(dòng)態(tài)的tabbar,像上面提到的根據(jù)權(quán)限控制。比如說(shuō)tabbar最多只能有五個(gè),那我如何控制甲能看到5個(gè),乙只能看到3個(gè)?這個(gè)需求在原生的uniapp上無(wú)法實(shí)現(xiàn),原生的只能配置好pages,tabBar是pages的一個(gè)子項(xiàng)配置。不過(guò)插件市場(chǎng)上有人實(shí)現(xiàn)了tabbar的組件化,我們可以嘗試下定制開發(fā)。

總結(jié)起來(lái)說(shuō)需求其實(shí)就兩個(gè):

1、實(shí)現(xiàn)uniapp路由守衛(wèi);

2、實(shí)現(xiàn)動(dòng)態(tài)tabbar;

第一個(gè)需求,前面提到過(guò)一些方案;第二個(gè)需求,動(dòng)態(tài)tabbar,需要結(jié)合uview組件庫(kù)的tabbar組件來(lái)實(shí)現(xiàn)。我們?cè)俜治鱿履壳暗目蚣?、插件能力,糅合上述需求,就有這張圖:


6129fe3f32346.png


這張圖里有些內(nèi)容前面沒(méi)有提到,比如狀態(tài)管理、本地緩存,這是后面會(huì)用到的一個(gè)關(guān)鍵部分,下面的設(shè)計(jì)部分會(huì)提到。


方案設(shè)計(jì)

我們來(lái)捋一捋業(yè)務(wù)流程設(shè)計(jì):

1、app輸入用戶名密碼登錄;

2、在路由守衛(wèi)進(jìn)行攔截,判斷用戶登錄時(shí)的本地?cái)?shù)據(jù)是否存在路由信息;如果沒(méi)有則走第3步,如果有就走第4步;

3、調(diào)用接口獲取到路由并從服務(wù)端獲取路由數(shù)據(jù);將路由數(shù)據(jù)存入本地(vuex、uniapp緩存);

4、將tabbar這一層級(jí)數(shù)據(jù)單獨(dú)提出來(lái)存儲(chǔ),結(jié)合uview的tabbar組件實(shí)現(xiàn)動(dòng)態(tài)tabbar;

5、在本地存一個(gè)全量的app按鈕集合(除了tabbar,其他頁(yè)面都是通過(guò)按鈕跳轉(zhuǎn)),與服務(wù)端獲取的數(shù)據(jù)進(jìn)行比對(duì),得到一個(gè)按鈕展示與否的配置數(shù)據(jù)集;

6、路由信息初始化后,進(jìn)入用戶定制化的初始頁(yè)或者首頁(yè);

ok,分析得差不多了,下面介紹下具體實(shí)操步驟。

解決方案

一、實(shí)現(xiàn)路由守衛(wèi)

路由插件推薦uni-simple-router,具體教程可以參考它的官方文檔,寫得比較詳細(xì)了。以下是我的簡(jiǎn)單實(shí)戰(zhàn)教程。


安裝uni-simple-router插件

npm install uni-simple-router

接下來(lái)進(jìn)行模塊化配置,創(chuàng)建文件夾router,文件夾內(nèi)容如下:


6129fe7f5b30d.png


home文件里是所有頁(yè)面的路由配置,就像這樣:

const home = [
 {
      path: '/pages/login/login',
      aliasPath:'/app/login',  //對(duì)于h5端適用
      name: 'login',
        meta: {
         title: '登錄',
     }
    },
 {
      path: '/pages/index/index',
      aliasPath:'/app/index',  //對(duì)于h5端適用
      name: 'index',
        meta: {
         title: '首頁(yè)',
     }
    }]
export default home

這里必須要多說(shuō)一句,由于這個(gè)插件沒(méi)有動(dòng)態(tài)寫入功能,所以我們要實(shí)現(xiàn)權(quán)限管理,必須在本地配置完整的路由;而且pages.json中的內(nèi)容也要完整配置,不過(guò)tabbar配置有些不同,后面會(huì)說(shuō)到;

modules文件夾下的index只是一個(gè)模塊讀取的代碼;

const files = require.context('.', false, /\.js$/)
const modules = []
 
files.keys().forEach(key => {
  if (key === './index.js') return
  const item = files(key).default
  modules.push(...item)
})
 
export default modules

router根級(jí)目錄下的index內(nèi)容主要就是路由守衛(wèi):

import modules from './modules/index.js'
import Vue from 'vue'
import Router from 'uni-simple-router'
import store from '@/store/store.js'
 
Vue.use(Router)
//初始化
const router = new Router({
 APP: {
  holdTabbar: false //默認(rèn)true
 },
 h5: {
  vueRouterDev: true, //完全使用vue-router開發(fā) 默認(rèn) false  
 },
 routes: [...modules] //路由表
});
 
//全局路由前置守衛(wèi)
router.beforeEach((to, from, next) => {
 // 首先判斷是否存在路由信息
 //不存在就先調(diào)用接口得到數(shù)據(jù)
   //具體內(nèi)容可以參照上文的方案設(shè)計(jì)內(nèi)容
})
// 全局路由后置守衛(wèi)
router.afterEach((to, from) => {})
export default router;

最后在app的main.js里需要這么引用:

import router from './router/index.js'
import { RouterMount } from 'uni-simple-router'
...
 
//v1.3.5起 H5端 你應(yīng)該去除原有的app.$mount();使用路由自帶的渲染方式
// #ifdef H5
 RouterMount(app,'#app');
// #endif
 
//為了兼容小程序及app端必須這樣寫才有效果
// #ifndef H5
 app.$mount(); 
// #endif

至于后面的路由用法,直接看官方文檔,比較清楚,用法跟vue-router差不多。這里要特別說(shuō)明的是上面代碼初始化的那一塊的幾個(gè)配置:holdTabbar: false,vueRouterDev: true,前者表示在app端取代原生的tabbar攔截,在這個(gè)插件里攔截;后者表示在h5中完全用vue-router的api,廢棄了包括此插件及uniapp的原生api,后者請(qǐng)慎用。


二、結(jié)合狀態(tài)管理、uniapp數(shù)據(jù)緩存管理app緩存開銷

這里其實(shí)沒(méi)什么難度,也不給代碼了,很簡(jiǎn)單。

從服務(wù)端獲取的數(shù)據(jù)我可以存在狀態(tài)管理里,但是vuex的數(shù)據(jù)存在內(nèi)存中,容易丟失。比如說(shuō),app用一會(huì)兒,我拉到了后臺(tái),立馬再點(diǎn)開是沒(méi)問(wèn)題可以用的;但如果時(shí)間太長(zhǎng)了,不小心清了緩存,或者超過(guò)了服務(wù)端的超時(shí)限制,此時(shí)再次點(diǎn)開app,可能就缺失了部分?jǐn)?shù)據(jù)。這個(gè)問(wèn)題就要在路由守衛(wèi)進(jìn)行處理了,在路由跳轉(zhuǎn)時(shí)就判斷相關(guān)的狀態(tài)數(shù)據(jù)是否存在,不存在就再進(jìn)行處理。

再介紹一下uniapp的數(shù)據(jù)緩存api,更穩(wěn)定,特別在app上,它不是緩存的概念,是持久化存在的,除非你調(diào)用它的清除方法。你可以利用這二者,分別存一些數(shù)據(jù),搭配做一些控制,具體實(shí)現(xiàn)就自己琢磨下。比如你從后臺(tái)拉回,狀態(tài)管理的數(shù)據(jù)沒(méi)了,但這個(gè)時(shí)間還在服務(wù)端超時(shí)范圍內(nèi),那這個(gè)未超時(shí)的token數(shù)據(jù)就要存在uniapp的數(shù)據(jù)緩存中,我根據(jù)這個(gè)token再查到相關(guān)權(quán)限路由信息,給vuex賦值,再進(jìn)行后續(xù)操作;如果拉回來(lái),超時(shí)了,那就直接回到登錄頁(yè)。這一塊,我只是提供思路,而且是成功的思路,親測(cè)有效的。


三、實(shí)現(xiàn)動(dòng)態(tài)tabbar

好了,能走到這一步,萬(wàn)里長(zhǎng)征就走了一半了。別看下面的內(nèi)容就那么一點(diǎn),我把相關(guān)的資料拼起來(lái)實(shí)際上花了比上面那些更多的時(shí)間。

由于tabbar是單獨(dú)配置的,原生的uniapp沒(méi)有動(dòng)態(tài)配置的方法。找了一圈,發(fā)現(xiàn)uview的tabbar組件可以實(shí)現(xiàn)。這塊還是把步驟列一下:一步步來(lái),是可以實(shí)現(xiàn)的!

1、修改pages.json配置

"tabBar": {
  "list": [{
   "pagePath": "pages/index/index"
  },{
   "pagePath": "pages/about/about"
  }]
 },

像這樣,只留這些內(nèi)容,跟原生配置比少了許多內(nèi)容。

2、將tabbar信息單獨(dú)存儲(chǔ)到一個(gè)全局對(duì)象上

這一步可以存在vuex里,因?yàn)樽x取方便,uniapp的數(shù)據(jù)緩存讀取稍微麻煩點(diǎn)。放在vuex里,取的時(shí)候很方便,像這樣:

this.$store.state.userInfo.tabbarlist

3、在每一個(gè)tabbar頁(yè)面配置tabbar組件

<template>
 <view>
  <view class="content">
   ...
  </view>
  <u-tabbar :list="$store.state.userInfo.tabbarlist" @change="changeTb" :inactive-color="inactiveColor" :active-color="activeColor"></u-tabbar>
 </view>
</template>

模板部分格式要像上面這樣,tabbar與正文內(nèi)容并列;跳轉(zhuǎn)代碼如下,兩種方式都是可以的,詳細(xì)見(jiàn)文檔

changeTb(index) {
    // uni.switchTab({
    //  url: this.$store.state.userInfo.tabbarlist[index].pagePath
    // });
    this.$Router.pushTab(this.$store.state.userInfo.tabbarlist[index].pagePath)
   }

需要說(shuō)明的是,這種方法是把uniapp的原生tabbar給隱藏了的;上面用到的狀態(tài)管理中的tabbarlist數(shù)據(jù)是一個(gè)結(jié)構(gòu)參數(shù)完整的tabbar配置,但是tabbar頁(yè)面可能不是完整的,由用戶權(quán)限決定。

好了,本文到此已經(jīng)把動(dòng)態(tài)路由、動(dòng)態(tài)tabbar的完整方案講清楚了,細(xì)節(jié)部分自己順著我的思路,根據(jù)你自己的需要,逐步完善即可,希望對(duì)你會(huì)有啟發(fā)和幫助。如果對(duì)你有用,請(qǐng)點(diǎn)擊在看分享,謝謝!


分享到:
標(biāo)簽:uniapp框架 動(dòng)態(tài)路由 動(dòng)態(tài)tabbar
用戶無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定