vue官网编辑器主题(vue实现主题切换的多种思路分享)
vue官网编辑器主题
vue实现主题切换的多种思路分享目录
- 动态改变主题
- 第一种办法:动态组件
- 第二种办法,路由隔离
- 总结
- 额外补充基于css的两种方法
- 方法一 多套css
- 方法二 scss动态切换变量
首先需要解决的是如何知道你需要显示哪个主题,并且可以动态切换。我选择的方法是queryString。
我们打开url的时候,可以在后面缀上?theme=xx,读取这个xx储存起来即可。
第一种办法:动态组件当主题的路由并没有发生变化,仅是组件内部的样式,功能发生了变化,我们可以将一个组件复制一遍,修改完后,通过懒加载和动态组件实现。
// 页面组件 <template> <li> <component :is="themeName" /> </li> </template> <script> export default{ name: 'Home', components:{ theme1:()=>import('@/theme/theme1/a'), theme2:()=>import('@/theme/theme2/a'), }, computed:{ themeName(){ retun `theme${this.$store.state.themeId}` } } } </script>
在组件中,我将script部分抽离出来,因为大部分组件其实在逻辑上是相同。哪怕有一些不同,我们也可以直接在主题2的组件中更改,减少对主题1的影响。
//action.js export default{ name:'Theme1', .... } <template> <li class="theme1"></li> </template> <script> import action from '../componentAction/action' action.name='Theme1' export default action </script> <style scoped> </style>
这样实现的有点是可以通过子组件的style scoped实现样式隔离,同时功能数据上都会隔离,例如两个子组件中的swiper不会相互影响。 同时,懒加载也减小了首页的加载时体积。 后面再增加新增的主题也只是照猫画虎而已。
第二种办法,路由隔离路由隔离其实就是简单的theme1写一个路由的数组,theme2写一套路由。
// router.js { path:'/theme3', name:'theme3Index', component: () => import('../views/theme3/Index.vue'), children:[ { path: '/theme3/entry', name: 'theme3Entry', component: () => import('../views/theme3/entry.vue'), } ] }
这种办法其实是下下之策,我使用这个主要是因为路由变化了,比如之前是直接进入a.vue,但是现在前面多加了一层entry页面,所以只能改变路由。 这种办法也实现了比较好的隔离。
总结以上两种思路是我针对于我们当前业务的思考,仅供参考。
其实这两种方法都有一个共同的问题,就是代码冗余。每个组件都避不可免的带有一部分之前主题的代码,虽然,大部分逻辑代码可以抽离出来,但是css和template却无法抽离。
如果每次一个主题增加一个dom,一个功能块,如果每次都用v-if,那么其实代码以后会更加难以维护。因此,我选择了按照主题去划分代码。
额外补充基于css的两种方法方法一 多套css
<!-- 中心 --> <template> 动态获取父级class名称,进行一个父级class的多次定义 <li :class="className"> <li class="switch" v-on:click="chang()"> {{ className == "box" ? "开灯" : "关灯" }} </li> </li> </template> <script> export default { name: "Centre", data() { return { className: "box" }; }, methods: { // 改变class chang() { this.className === "box" ? (this.className = "boxs") : (this.className = "box"); } }, }; </script> <style lang="scss"> 当class为box 使用witch的css @import "./style/witch.scss"; 当class为boxs 使用black的css @import "./style/black.scss"; .switch { position: fixed; top: 4px; right: 10px; z-index: 50; width: 60px; height: 60px; background: #fff; line-height: 60px; border-radius: 20%; } </style>
每个css文件样式大致相同,只是最外层的父级不一样,分别为.box 和.boxs
方法二 scss动态切换变量
我自己是分为了2个主要文件来做的
- _variable.scss 变量管理文件
- var()为css3中提出的声明样式变量的方法
- var(属性名,属性值)注意属性值不能是字符串
// 主题切换 $bgColor:var(--backgroundColor,rgb(255,255,255)); $fontColor:var(--fonntColor,rgb(0,0,0)); $bgmColor:var(--backgroundMColor,rgb(238,238,238)); $tableColor:var(--tableColor,rgb(218,218,218)); $borderColor:var(--borderColor,rgb(238,238,238)); $tablesColor:var(--tablesColor,rgb(255,255,255)); $inputColor:var(--inputColor,rgb(255,255,255))
创建的_variable.scss 文件我在vue.config.js进行了一个全局的配置,没有在组件中引入
css: { loaderOptions: { // 此文件为主题切换文件 sass: { prependData: `@import "./src/styles/_variable.scss";`, }, }, },
publicStyle.js
这个方法可以去修改var定义的变量
document.getElementsByTagName("body")[0].style.setProperty("属性名", "替换的属性值f");
// 主题切换 const cut = (cutcheack) => { document.getElementsByTagName("body")[0].style.setProperty("--backgroundColor", cutcheack ? "#121212" : "#fff"); document.getElementsByTagName("body")[0].style.setProperty("--fonntColor", cutcheack ? "#cecece" : "#333"); document.getElementsByTagName("body")[0].style.setProperty("--backgroundMColor", cutcheack ? "#333" : "#eee"); document.getElementsByTagName("body")[0].style.setProperty("--tableColor", cutcheack ? "#000" : "#d8d8d8"); document.getElementsByTagName("body")[0].style.setProperty("--tablesColor", cutcheack ? "#222" : "#fff"); document.getElementsByTagName("body")[0].style.setProperty("--inputColor", cutcheack ? "#666" : "#fff"); document.getElementsByTagName("body")[0].style.setProperty("--borderColor", cutcheack ? "#666" : "#fff"); }; export default cut;
组件中使用
<!-- 首页 --> <template> <li class='home'> <el-switch v-model="cutcheack" active-color="#333" inactive-color="#13ce66" active-text="主题" @change="switchs"></el-switch> </li> </template> <script> import cut from "../../utils/publicStyle.js"; export default { name: "Home", data() { return { cutcheack: false, //主题切换 }; }, methods: { // 左侧导航隐藏或显示 // 切换主题 switchs() { cut(this.cutcheack); }, }, }; </script> <style lang='scss' scope> .home { height: 100%; width: 100%; background:$bgColor; .el-container { height: 100%; color:$fontColor; } } </style>
以上就是vue实现主题切换的多种思路分享的详细内容,更多关于vue 主题切换的资料请关注开心学习网其它相关文章!
- vue插槽实例(Vue中插槽slot的使用方法与应用场景详析)
- 使用vue-cli构建electron项目(MAC+PyCharm+Flask+Vue.js搭建系统)
- vue图片组件使用方法(Vue图片裁剪组件实例代码)
- vue3 props用法(vue3组合API中setup、 ref、reactive的使用大全)
- vue项目做过哪些打包优化(Vue项目优化的一些实战策略)
- vue自定义列组件(vue自定义表格列的实现过程记录)
- vue3.0零基础入门(快速掌握Vue3.0中如何上手Vuex状态管理)
- vue 底层原理(浅谈Vue插槽实现原理)
- vueaxios使用教程交流(Vue使用axios图片上传遇到的问题)
- vue中的mapgetter优势(vuex 中辅助函数mapGetters的基本用法详解)
- vue3.0全家桶教程elementui学习(vite+vue3.0+ts+element-plus快速搭建项目的实现)
- vue怎么定义router的动态路由(vue.js Router中嵌套路由的实用示例)
- vue 为什么使用虚拟dom(Vue虚拟Dom到真实Dom的转换)
- vue如何excel表格上传功能(Vue + iView实现Excel上传功能的完整代码)
- vue3.0安装element(vue3+electron12+dll开发客户端配置详解)
- vue设置div大小(Vue实现div滚轮放大缩小)
- 它荣获 中国生态魅力镇 称号 就在咱们禹州,一起来看看(中国生态魅力镇)
- 真牛 禹州将建成中等城市(禹州将建成中等城市)
- 被骂欺师灭祖,与郭德纲公开叫板,何云伟改名何沄伟,开始画画了(与郭德纲公开叫板)
- 相声转行影帝,被何晴抛弃,甩10年女友闪婚生子,刘威不靠谱情史(相声转行影帝被何晴抛弃)
- 岳云鹏不说相声,改行演员了 网友 快回来说相声(岳云鹏不说相声)
- 乔欣首演古装大女主,颜值演技双在线(乔欣首演古装大女主)
热门推荐
- linux巡检命令手册(Linux xargs命令的使用)
- iis网站提示401 未授权:由于凭据无效,访问被拒绝
- js特效星空(ThingJS粒子特效一键实现雨雪效果)
- nginx设置https访问(基于Nginx实现HTTPS网站设置的步骤)
- windowsserver远程登录和唤醒(Windows Server 2016远程桌面服务配置和授权激活2个用户)
- dedecms添加代码(dedecms获取当前所在栏目ID的方法)
- phparray函数的用法(php array_chunk函数用法与注意事项)
- composer怎么设置镜像(使用composer命令加载vendor中的第三方类库 的方法)
- python对于gbk处理(Python 2/3下处理cjk编码的zip文件的方法)
- python中if语句应学会什么(Python基础之条件控制操作示例if语句)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9