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

动态改变主题

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

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

第一种办法:动态组件

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

// 页面组件
<template>
    <div>
        <component :is="themeName" />
    </div>
</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>
<div class="theme1"></div>
</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的多次定义
  <div :class="className">
    <div class="switch" v-on:click="chang()">
      {{ className == "box" ? "开灯" : "关灯" }}
    </div>
  </div>
</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>
<div class='home'>
      <el-switch v-model="cutcheack" active-color="#333" inactive-color="#13ce66"  active-text="主题" @change="switchs"></el-switch>
</div>
</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 主题切换的资料请关注我们其它相关文章!

(0)

相关推荐

  • vue组件库的在线主题编辑器的实现思路

    一般而言一个组件库都会设计一套相对来说符合大众审美或产品需求的主题,但是主题定制需求永远都存在,所以组件库一般都会允许使用者自定义主题,我司的vue组件库hui的定制主题简单来说是通过修改预定义的scss变量的值来做到的,新体系下还做到了动态换肤,因为皮肤本质上是一种静态资源(CSS文件和字体文件),所以只需要约定一种方式来每次动态请求加载不同的文件就可以了,为了方便这一需求,还配套开发了一个Vessel脚手架的插件,只需要以配置文件的方式列出你需要修改的变量和值,一个命令就可以帮你生成对应的皮

  • Vue + Scss 动态切换主题颜色实现换肤的示例代码

    根据预设的配色方案,在前端实现动态切换系统主题颜色. 大概的思路就是给html根标签设置一个data-theme属性,然后通过js切换data-theme的属性值,Scss根据此属性来判断使用对应主题变量.这里可以选择持久化Vux或接口来保存用户选择的主题. 一.首先需要给项目下载配置Scss 1.安装依赖 npm install node-sass sass-loader --save-dev 2.找到build中webpack.base.conf.js,在rules中添加scss规则 { t

  • vue+webpack 更换主题N种方案优劣分析

    需求:由于业务需要,我们需要做多套皮肤 调研了下当前行业的实现方案,五花八门良莠不齐,在此总结下各种方案有优劣及复杂度,供大家快速定位到符合自己业务的方案,以vue 单页应用为业务场景 方式一:class切换方式 实现: 在每个需要更换的页面定义多个class,根据运行时标识动态的切换class名称实现加载不同的样式,这种方式较为简单 优点: 不需要修改构建工具相关 业务开发过程可以实现,没有限制 支持动态切换 缺点: 逻辑分散耦合在各个页面,一旦需要修改,涉及修改的页面较多 代码需要预先内置,

  • vue如何根据网站路由判断页面主题色详解

    前言 本文主要介绍的是vue根据网站路由判断页面主题色的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 需求: 不同品牌对应不同版本配色 做法: 根据域名带的参数判断进入哪个品牌,对应哪个版本 在main.js中 import Vue from 'vue' import App from './App' import router from './router' import axios from 'axios' import MintUI from 'mint-ui'

  • Vue的elementUI实现自定义主题方法

    使用vue开发项目,用到elementUI,根据官网的写法,我们可以自定义主题来适应我们的项目要求,下面来介绍一下两种方法实现的具体步骤,(可以参考官方文档自定义主题官方文档),先说项目中没有使用scss编写,用主题工具的方法(使用的较多) 第一种方法:使用命令行主题工具 使用vue-cli安装完项目并引入element-ui(具体可参考第二种方法中的介绍) 一.安装工具 1,安装主题工具 npm i element-theme -g 2,安装chalk主题,可以从 npm 安装或者从 GitH

  • vue+element 实现商城主题开发的示例代码

    本文介绍了vue+element 实现商城主题开发的示例代码,分享给大家,具体如下: <template> <div> <div class="set-phone"> <el-form :model="theme" :rules="rules" ref="ruleForm" class="demo-ruleForm"> <el-form-item lab

  • vue在线动态切换主题色方案

    主要原理是利用webpack插件webpack-theme-color-replacer提取相关颜色css然后根据配置动态生成替换的css 具体实现步骤如下: 1.添加webpack插件,新建文件webpack/themePlugin.js const ThemeColorReplacer = require('webpack-theme-color-replacer') const forElementUI = require('webpack-theme-color-replacer/for

  • VUE项目实现主题切换的多种方法

    需求是 做一个深色主题和浅色主题切换的效果 方法一 多套css 这个方法也是最简单,也是最无聊的. <!-- 中心 --> <template> 动态获取父级class名称,进行一个父级class的多次定义 <div :class="className"> <div class="switch" v-on:click="chang()"> {{ className == "box"

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

    动态改变主题 首先需要解决的是如何知道你需要显示哪个主题,并且可以动态切换.我选择的方法是queryString. 我们打开url的时候,可以在后面缀上?theme=xx,读取这个xx储存起来即可. 第一种办法:动态组件 当主题的路由并没有发生变化,仅是组件内部的样式,功能发生了变化,我们可以将一个组件复制一遍,修改完后,通过懒加载和动态组件实现. // 页面组件 <template> <div> <component :is="themeName" /&

  • vue实现检测敏感词过滤组件的多种思路

    目录 写在前面 需求分析v1 思路一:使用截流方法监听输入框的input事件 思路二:使用输入框的失焦和保存按钮的点击事件 思路三:使用mixins抽取敏感词检测方法 思路四:使用promise封装敏感词检测组件(面向需求v1) 思路五:使用插槽和mixins封装敏感词检测组件(面向需求v2) 优化与改进 写在最后 写在前面   在做商户端敏感词检测的过程中,发现了一些问题,特在此总结.本文的行文思路是编写敏感词检测代码,前两个思路未采用组件化的开发思想,后三个思路根据需求变更,采用组件化的思想

  • Flutter以两种方式实现App主题切换的代码

    概述 App主题切换已经成为了一种流行的用户体验,丰富了应用整体UI视觉效果.例如,白天夜间模式切换.实现该功能的思想其实不难,就是将涉及主题的资源文件进行全局替换更新.说到这里,我想你肯定能联想到一种设计模式:观察者模式.多种观察对象(主题资源)来观察当前主题更新的行为(被观察对象),进行主题的更新.今天和大家分享在 Flutter 平台上如何实现主题更换. 效果 实现流程 在 Flutter 项目中,MaterialApp组件为开发者提供了设置主题的api: const MaterialAp

  • Android主题切换之探究白天和夜间模式

    智能手机的迅速普及,大大的丰富了我们的娱乐生活.现在大家都喜欢晚上睡觉前玩会儿手机,但是应用的日间模式往往亮度太大,对眼睛有较为严重的伤害.因此,如今的应用往往开发了 日间和夜间 两种模式供用户切换使用,那日间和夜间模式切换究竟是怎样实现的呢? 在文字类的App上面基本上都会涉及到夜间模式.就是能够根据不同的设定.呈现不同风格的界面给用户.而且晚上看着不伤眼睛.实现方式也就是所谓的换肤(主题切换).对于夜间模式的实现网上流传了很多种方式.这里先分享一个方法给大家.通过设置背景为透明的方法.降低屏

  • vue中tab选项卡的实现思路

    今天分享下vue中tab选项卡的套路,废话不多说,直接上效果图 应用场景 •不同注册和登录方式切换 •操作选项切换 如保存和取消 •后台管理系统中各菜单选项切换等 •新闻标题分类切换 如关注 推荐 热点等分类 主要思路 •点击不同 tab 获取 tab 选项卡下标并为其动态绑定一个class(选中状态时的样式) •点击时使 tab 对应的内容下标与 tab 选项卡下标保持一致 •使用 v-show / v-if 指令控制内容显示与隐藏 代码如下 <html lang="en"&g

  • vue实现tab切换的放大镜效果

    本文实例为大家分享了vue实现tab切换的放大镜效果的具体代码,供大家参考,具体内容如下 废话不多说先看效果图 1.我这里并没有加遮罩层,如有需要请自行加上 2.图片建议使用4k高清图片,不然放大后模糊,影响观看心情 3.不用拘泥于样式,关注实现原理即可 4.可能我的方法并不简便,但是也是一种思路,请大家参考 实现原理 第一肯定需要vue.js 第二需要两张图片 左边为现实图片,右边放大后的效果图其实一直存在,只不过鼠标移入现实,鼠标移出消失 放大的图片并不是真正的放大,而是在img标签外套了一

随机推荐