uniapp 实现动态component,uniapp动态css

  uniapp 实现动态component,uniapp动态css

  基于uniapp框架如何实现动态路由和动态tabbar?本文将为您介绍uniapp动态路由的实战,教您如何在uniapp中实现动态路由。

  UNI-APP开发(仿饿)开发课程:进入学习

  Uni开发app相对方便快捷。官网的教程很详细,几乎所有问题都能回答。网上也有很多入门教程。腾讯课堂和哔哩哔哩有几个视频教程,感觉还可以(其实我没怎么看过)。它们相当实用,所以你可以试一试。

  假设本文读者已经基本掌握了uniapp的基本开发技巧。如果你还没有掌握uniapp,但是准备进行相关开发,就从官方文档入手,结合实际视频操作。之前的推荐都不错。好了,接下来说这篇文章的题目——如何基于uniapp框架实现动态路由、动态tabbar

  现状分析

  vue项目上有一个路由插件Vue路由器。所有路线统一管理,可以拦截和控制下一步行动。但是,在uniapp上,情况就不一样了。Uni上没有路由插件,然后页面分为tabbar和非tabbar。页面跳转也有自己的一套API,不支持最重要的路由拦截功能。所有页面都是在page.json文件中预先配置好的。

  需求分析

  假设我们要在app上做一套对应用户权限的东西,就是不同的用户,根据权限配置,决定他进来后可以使用哪些页面和按钮,甚至可以控制tabbar。这个需求需要根据权限控制路由内容和方向,但在当前条件下无法实现。但是插件市场上很多人都写过路由插件,他们的思路其实和vue路由器在web端是一脉相承的。只有这个路由插件可以完全满足需求。

  还有一个很重要的需求就是动态tabbar,这是一个很重要的内容,就是app登录后首页底部的一列按钮。这些tabbars基本上包含了app的主要内容。如何实现动态Tabbar,如上所述,是根据权限来控制的。比如tabbar最多只能有五个,那么如何控制A看五个,B看三个呢?这个要求在原生uniapp上无法实现,原生只能用页面配置,tabBar是页面的子项配置。不过插件市场已经有人实现了tabbar的组件化,可以尝试定制开发。

  总结起来,其实有两个诉求:

  1.实现uniapp路由守护;

  2.实现动态tabbar;

  第一个要求,前面提到的一些方案;第二个需求,动态tabbar,需要结合uview组件库的tabbar组件来实现。我们来分析一下目前的框架和插件能力,结合上面的需求,就有了这张图:

  这张图中有一些内容是之前没有提到的,比如状态管理和本地缓存。这是后面要用到的关键部分,会在后面的设计部分提到。

  方案设计

  让我们来看看业务流程设计:

  1.app输入用户名和密码登录;

  2.在路由守卫处拦截,以确定用户登录时本地数据中是否有路由信息;如果不是,则转到步骤3;如果是,转到步骤4;

  3.调用接口获取路由,从服务器获取路由数据;本地存储路由数据(vuex,uniapp cache);

  4.将tabbar级别数据单独存放,结合uview的tabbar组件实现动态tabbar;

  5.在本地保存全套app按钮(除tabbar外,其他页面均通过按钮跳转),与服务器获取的数据进行比对,获得按钮是否显示的配置数据集;

  6.路由信息初始化后,进入用户定制的初始页面或主页;

  好了,分析差不多了。下面是具体的实际操作步骤。

  解决方案

  一、实现路由守卫

  插件推荐uni-simple-router,具体教程可以参考它的官方文档,里面写的很详细。以下是我的简单实用教程。

  安装uni-simple-router插件

  m安装uni-simple-router接下来,进行模块化配置,创建一个文件夹路由器,内容如下:

  在主文件中是所有页面的路由配置,如下所示:

  const home=[

  {

  路径:“/pages/login/login”,

  AliasPath:/app/login ,//适用于h5终端

  名称:登录,

  元:{

  标题:“登录”,

  }

  },

  {

  路径:“/pages/index/index”,

  AliasPath:/app/index ,//适用于h5终端

  名称:“索引”,

  元:{

  标题:“主页”,

  }

  }]

  导出默认首页这里必须多说一句。因为这个插件没有动态写功能,所以我们必须在本地配置一个完整的路由来实现权限管理。而且pages.json里面的内容应该是全配置的,只是tabbar配置有些不同,后面会讲到;

  modules文件夹下的索引只是一个模块读取的代码;

  const files=require.context( . ,false,/\。js$/)

  常量模块=[]

  files.keys()。forEach(key={

  if (key===。/index.js )返回

  const item=files(key)。系统默认值

  模块.推送(.项目)

  })

  导出默认模块路由器根目录下的索引内容主要是路由守护:

  从导入模块。/modules/index.js

  从“vue”导入Vue

  从“单简单路由器”导入路由器

  从“@/store/store.js”导入商店

  Vue.use(路由器)

  //初始化

  常量路由器=新路由器({

  应用程序:{

  HoldTabbar:默认情况下为false //true

  },

  h5: {

  Vueruterdev: true,//完全使用vue-router开发默认false。

  },

  路线:[.模块] //路由表

  });

  //全局路由前端保护

  router.beforeEach((收件人,发件人,下一个)={

  //首先确定是否有路由信息。

  //如果不存在,先调用接口获取数据

  //具体请参考以上方案设计。

  })

  //全局路由后端保护

  router.afterEach((to,from)={})

  导出默认路由器;最后,你需要在app的main.js中引用这句话:

  从导入路由器。/router/index.js

  从“单简单路由器”导入{ RouterMount }

  .

  //v1.3.5你应该把原来的app去掉。来自H5端的$ mount();使用路线附带的渲染方法。

  //#伊夫H5

  RouterMount(app, # app );

  //#endif

  //为了兼容小程序和app,必须这样写才有效。

  //#伊夫H5

  app。$ mount();

  //#endif至于后面的路由用法,直接看官方文档,比较清楚。使用方法类似于vue路由器。这里需要注意的是上面代码初始化的块的几种配置:holdTabbar: false,vueRouterDev: true,前者的意思是在app端替换原生Tabbar拦截,在这个插件中拦截;后者意味着vue-router的api完全用在h5上,包括这个插件和uniapp在内的原生api被抛弃。请谨慎使用后者。

  二、结合状态管理、uniapp数据缓存管理app缓存开销

  其实这里没有难度,也没有给出代码。这很简单。

  我可以在状态管理中存储从服务器获取的数据,但是vuex的数据是存储在内存中的,很容易丢失。比如用了一段时间的app,拉到后台,马上打开也没问题。但如果时间过长,缓存被意外清空,或者超过了服务器的超时限制,那么再次点击app可能会导致部分数据丢失。这个问题将由路线警卫处理。当路由发生跳转时,会判断相关的状态数据是否存在,如果不存在,会重新处理。

  再来介绍一下uniapp的数据缓存api。更稳定,尤其是在app上。不是缓存的概念,而是持久存在的,除非你调用它的clearing方法。可以利用两者,分别保存一些数据,用它们做一些控制,自己搞清楚具体实现。比如你从后台拉回来,状态管理的数据没有了,但是这个时间还在服务器的超时范围内,那么这个没有超时的令牌数据会被保存在uniapp的数据缓存中。我会根据这个令牌找出相关的权限路由信息,给vuex赋值,然后进行后续操作;如果拉回来超时,直接回到登录页面。这一块,我只是提供思路,而且是成功的思路,通过亲测是有效的。

  三、实现动态tabbar

  好吧,如果我们能走到这一步,我们就已经完成了长征的一半。不要看下面的内容。实际上,我花了比上面更多的时间来收集相关信息。

  因为tabbar是单独配置的,所以原生uniapp没有动态配置方法。环顾四周,发现uview的tabbar组件是可以实现的。这里先列出步骤:循序渐进,可以实现!

  1、修改pages.json配置

  tabBar: {

  列表:[{

  页面路径:页面/索引/索引

  },{

  页面路径:页面/关于/关于

  }]

  },像这样就只剩下这些内容了,比原生配置少很多。

  2、将tabbar信息单独存储到一个全局对象上

  这个步骤可以存储在vuex中。因为容易读取,所以uniapp的数据缓存读取有点麻烦。放在vuex里,拿起来很方便,像这样:

  这个。$ store . state . userinfo . tabbar list3、在每一个tabbar页面配置tabbar组件

  模板

  视角

  view class=content

  .

  /查看

  u-tabbar:list= $ store . state . userinfo . tabbar list @ change= change TB :inactive-color= inactive color :active-color= active color /u-tabbar

  /查看

  /template的模板部分的格式应该如上,tabbar与正文内容并列;跳转代码如下,两种方式都有可能。有关详细信息,请参见文档。

  changeTb(索引){

  //uni.switchTab({

  //url:这个。$ store . state . userinfo . tabbar list[index]。页面路径

  //});

  这个。$Router.pushTab(这个。$ store . state . userinfo . tabbar list[index]。页面路径)

  }需要注意的是,这个方法隐藏了uniapp的原生tabbar上述状态管理中使用的tabbarlist数据是tabbar配置,具有完整的结构参数,但tabbar页面可能不完整,这是由用户的权限决定的。

  好了,到目前为止,本文已经清楚地解释了动态路由和动态tabbar的完整方案。细节可以根据自己的需求逐步完善,希望对你有所启发和帮助。如果对你有用,现在就点击分享吧。谢谢大家!

  推荐:《uniapp教程》以上是教你如何基于uniapp框架实现动态路由和动态tabbar的详细内容。更多请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: