用户登录
用户注册

分享至

vue实现主题切换的多种思路分享

  • 作者: 得劲已得劲
  • 来源: 51数据库
  • 2021-08-16

动态改变主题

首先需要解决的是如何知道你需要显示哪个主题,并且可以动态切换。我选择的方法是querystring。

我们打开url的时候,可以在后面缀上?theme=xx,读取这个xx储存起来即可。

第一种办法:动态组件

当主题的路由并没有发生变化,仅是组件内部的样式,功能发生了变化,我们可以将一个组件复制一遍,修改完后,通过懒加载和动态组件实现。

在组件中,我将script部分抽离出来,因为大部分组件其实在逻辑上是相同。哪怕有一些不同,我们也可以直接在主题2的组件中更改,减少对主题1的影响。

这样实现的有点是可以通过子组件的style scoped实现样式隔离,同时功能数据上都会隔离,例如两个子组件中的swiper不会相互影响。 同时,懒加载也减小了首页的加载时体积。 后面再增加新增的主题也只是照猫画虎而已。

第二种办法,路由隔离

路由隔离其实就是简单的theme1写一个路由的数组,theme2写一套路由。

这种办法其实是下下之策,我使用这个主要是因为路由变化了,比如之前是直接进入a.vue,但是现在前面多加了一层entry页面,所以只能改变路由。 这种办法也实现了比较好的隔离。

总结

以上两种思路是我针对于我们当前业务的思考,仅供参考。

其实这两种方法都有一个共同的问题,就是代码冗余。每个组件都避不可免的带有一部分之前主题的代码,虽然,大部分逻辑代码可以抽离出来,但是css和template却无法抽离。

如果每次一个主题增加一个dom,一个功能块,如果每次都用v-if,那么其实代码以后会更加难以维护。因此,我选择了按照主题去划分代码。

额外补充基于css的两种方法

方法一 多套css

每个css文件样式大致相同,只是最外层的父级不一样,分别为.box 和.boxs

方法二 scss动态切换变量

我自己是分为了2个主要文件来做的

  • _variable.scss 变量管理文件
  • var()为css3中提出的声明样式变量的方法
  • var(属性名,属性值)注意属性值不能是字符串

创建的_variable.scss 文件我在vue.config.js进行了一个全局的配置,没有在组件中引入

publicstyle.js

这个方法可以去修改var定义的变量
document.getelementsbytagname("body")[0].style.setproperty("属性名", "替换的属性值f");

组件中使用

以上就是vue实现主题切换的多种思路分享的详细内容,更多关于vue 主题切换的资料请关注其它相关文章!

软件
前端设计
程序设计
Java相关