基于Vue2.0和Typescript实现多主题切换的示例

目录
  • 第一步: 需要创建一个colorConfig.ts文件,用于配置主题信息 (我创建的目录是src/config/colorConfig.ts)
  • 第二步,根据接口获取当前主题信息,并进行切换设置
  • 第三步,切换主题时,更新缓存
  • 第四步, 页面上使用css变量来动态展示颜色值

之前在项目中用了Sass的多主题切换,感觉太麻烦,后面发现直接用CSS的很方便,所以整理一下,希望可以帮到大家,也是对自己的积累。

第一步: 需要创建一个colorConfig.ts文件,用于配置主题信息 (我创建的目录是src/config/colorConfig.ts)

colorConfig.ts文件的主要定义的内容

 /**
 * 全局颜色配置项,换肤配置
 * 主题名称theme1以及对应的颜色名称color1后面根据实际主题名和颜色名进行修改
 * 主题名称和颜色名称可以实际情况定义
 */

const COLOR_MAP = {
   // 第一套主题颜色
  theme1: {
    color1: '#FFCDD2', // 主要背景
    color2: '#E1BEE7', // 文字颜色
    color3: '#70767f', // 按钮颜色(灰色)
    color4: '#EF9A9A',
    color5: '#F06292', //弹框背景灰色
    color6: '#7986CB', //主要内容区域背景
    color7: '#64B5F6', //选中状态
  },
  // 第二套主题颜色
  theme2: {
    color1: '#FF7043', // 主要背景
    color2: '#4E342E', // 文字颜色
    color3: '#263238', // 按钮颜色(灰色)
    color4: '#FF6E40',
    color5: '#DD2C00', //弹框背景灰色
    color6: '#616161', //主要内容区域背景
    color7: '#212121', //选中状态
  },
  // 第三套主题颜色
  theme3: {
    color1: '#E65100', // 主要背景
    color2: '#FF6D00', // 文字颜色
    color3: '#1B5E20', // 按钮颜色(灰色)
    color4: '#827717',
    color5: '#00C853', //弹框背景灰色
    color6: '#0091EA', //主要内容区域背景
    color7: '#00BFA5', //选中状态
  }
}

/**
 * 类型定义
 * 定义COLOR_MAP中的主题类型,及每个主题中颜色值的类型
 */
export type THEME_TYPE = keyof (typeof COLOR_MAP)
type THEME_ITEM = keyof (typeof COLOR_MAP['theme1'])

/**
 * 主题切换
 * @param theme 主题,默认使用主题一
 */
export function changeTheme (theme: THEME_TYPE = 'theme1'): void {
  const themeList = Object.keys(COLOR_MAP[theme]) as THEME_ITEM[]
  themeList.forEach((v: THEME_ITEM) => {
    document.body.style.setProperty(`--${v}`, COLOR_MAP[theme][v])
  })
}

第二步,根据接口获取当前主题信息,并进行切换设置

 // 在App.vue中引入主题模块
 import { changeTheme } from '@/config/colorConfig'

 // 在created读取缓存信息
 created () {
   const theme = localStorage.getItem('theme') || 'theme1'
   // 将主题获取到的主题存到vuex中,记录当前的主题信息,默认主题一 theme1
   store.commit('common/setTheme', theme)
   changeTheme(theme)

   // 如果主题信息存储在后端,此时需要获取主题信息 (不建议使用)
   getThemeInfo()
 }

 /**
 * 主题信息也可以存储在后端,定义获取后台存储的主题信息的方法(不过不建议后端存主题信息,直接  localstorage就够了,还能防止主题闪屏问题)
 */
  async getThemeInfo() {
      // 入参
      const requestData = {
        method: 'xxxx',
        params: { method: 'xxx' }
      }
      const response = await this.$axios({
        method: 'POST',
        url: `${this.$baseUrl}/xxxx/xxxx/`,
        data: requestData
      }).catch(() => {
        // 接口响应失败默认主题一
        store.commit('common/setTheme', 'theme1')
        changeTheme('theme1')
      })
      let { code, data } = response?.data || {}
      // 根据code码获取接口响应状态
      if (code === '0000') {
        const theme = data?.theme
        // 将主题获取到的主题存到vuex中,记录当前的主题信息,默认主题一 theme1
        store.commit('common/setTheme', theme ? theme : 'theme1')
        changeTheme(theme ? theme : 'theme1')
      } else {
        // 接口响应失败默认主题一
        store.commit('common/setTheme', 'theme1')
        changeTheme('theme1')
      }

}

第三步,切换主题时,更新缓存

  import { changeTheme, THEME_TYPE } from '@/config/colorConfig'

  // 主题切换
  themeChange(themeVal): void {
    changeTheme(themeVal as THEME_TYPE)
    store.commit('common/setTheme', themeVal)
    // 存储到缓存中
    localStorage.setItem('theme', themeVal)

    // 也可以通过接口调用将themeVal,保存到后端
  }

第四步, 页面上使用css变量来动态展示颜色值

  /*例如var(--color1)*/
  #app {
      width: 100%;
      height: 100%;
      background-color: var(--color1);
      box-sizing: border-box;
      color: var(--color2);
      font-size: 1rem;
   }

效果图如下图所示

到此这篇关于基于Vue2.0和Typescript实现多主题切换的示例的文章就介绍到这了,更多相关Vue Typescript多主题切换内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • vue+element-ui实现主题切换功能

    element-ui提供了自定义主题 自定义主题 一.安装 npm i element-theme -g npm i element-theme-chalk -D npm i https://github.com/ElementUI/theme-chalk -D 官网说明安装完成后需要et -i并会有element-variables.scss文件,但是我文件中并未找到 node_modules/.bin/et,所以手动生成了 下图element-variables.scss是自己写的,因为安装

  • Vue UI框架的主题切换功能实现

    目录 AntD 的方式 1. 创建黑暗主题文件 2. 创建切换主题的函数 3. 切换主题 Quasar 的方式 ElementUI 的方式 NaiveUI 的方式 在如今,很多网页已经可以手动切换明亮模式和黑暗模式,网页的主题切换已经成为了一个常用的需求,因此,本文将从常见框架的处理方式总结一些相关的操作,并探究其本质. AntD 的方式 AntD 的 config-provider 似乎不能直接修改主题,目前网络上的教程有两类,一类是通过 less 的修改变量修改来完成,另一类是操作 DOM

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

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

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

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

  • 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插件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-antd动态切换主题

    目录 vue-antd动态切换主题 安装依赖 Vue3.0 + Antd,修改antd主题色,配置全局css vue-antd动态切换主题 安装依赖 1 webpack-theme-color-replacer: yarn add webpack-theme-color-replacer@1.3.22 2 less: yarn add less@2.7.2 3 less-loader: yarn add less-loader@7.0.2 在vue.config.js中加入配置 const cr

  • 详解Weex基于Vue2.0开发模板搭建

    前言 最近有一些人反馈说在面试过程中常常被问到weex相关的知识,也侧面反映的weex的发展还是很可观的,可是目前weex的开发者大多数是中小型公司或者个人,大公司屈指可数,揪其原因可能是基于weex的开发正确的姿势大家并没有找到,而且市面上的好多轮子还是.we后缀的,众所周知,weex和vue一直在努力的进行生态互通,而且weex实现web标准化是早晚的问题,今天和大家分享一下weex基于vue2.0的开发框架模板~ 工作原理 先简单熟悉一下weex的工作原理,这里引用一下weex官网上的一直

  • 基于vue2.0+vuex的日期选择组件功能实现

    calendar vue日期选择组件 一个选择日期的vue组件 基于vue2.0 + vuex 原本是想找这样的一个组件的,查看了vuex后,发现vuex的写法还不是基于2.0的,所以就自己动手做了 demo展示&&项目中的使用 目录结构 demo 用vue-cli 的webpack-simple构建的 calendar |--dist build生成的目录 |--doc 展示图片 |--src |--assets 资源 |--components |--calendar 日期组件 |--

  • 基于vue2.0动态组件及render详解

    如下所示: <template> <div class="hello"> <h1>{{ msg }}</h1> <h2>这里是Boor</h2> <component v-bind:my-data="items" v-bind:is="currentView"> <!-- 组件在 vm.currentview 变化时改变! --> </compo

  • 基于vue2.0实现仿百度前端分页效果附实现代码

    前言 上篇文章中,已经使用vue实现前端分页效果,这篇文章我们单独将分页抽离出来实现一个分页组件 先看实现效果图 代码实现 按照惯例,我们在冻手实现的时候还是先想一想vue实现组件的思路 1.需要提前设定哪些参数需要暴露出来给父组件传递 <Paging :name="name" @change="onPageChange" :page-size="size" :total="total" layout="jum

  • 基于vue2.0的活动倒计时组件countdown(附源码下载)

    这是一款基于vue2.0的活动倒计时组件,可以使用服务端时间作为当前时间,在倒计时开始和结束时可以自定义回调函数.   查看演示       下载源码 安装 npm install vue2-countdown --save 使用组件 首先在模板部分添加: <template> <div> <count-down v-on:start_callback="countDownS_cb(1)" v-on:end_callback="countDown

  • vue2.0使用swiper组件实现轮播的示例代码

    1.安装swiper npm install swiper@3.4.1 --save-dev 2.引用组件 import Swiper from 'swiper'; import 'swiper/dist/css/swiper.min.css'; 3.html页面代码 <div class="swiper-container" id="swiper"> <div class="swiper-wrapper"> <di

  • 基于Vue2.0+ElementUI实现表格翻页功能

    Element UI 是一套采用 Vue 2.0 作为基础框架实现的组件库,它面向企业级的后台应用,能够帮助你快速地搭建网站,极大地减少研发的人力与时间成本.在这个月的 NingJS 上我们开源了这个项目,当时它的文档还没有准备好.今天,经过两周多的完善, Element UI 的文档正式上线啦!目前它处于 rc 阶段,正式版将于 Vue 2.0 发布后第一时间跟进. 欢迎大家来使用和完善,一起把它做成 Vue 最好的企业级组件库. ElementUI的表格要求的数据类型为字典数组.我使用了py

  • 基于vue2.0+vuex+localStorage开发的本地记事本示例

    本文采用vue2.0+vuex+localStorage+sass+webpack,实现一个本地存储的记事本.兼容PC端和移动端. 实现效果 功能说明 支持回车添加事件 支持事件状态切换 添加事件 -> 进入未完成列表 未完成 -> 已完成(勾选checkbox) 未完成 -> 已取消(点击取消按钮) 已完成 -> 未完成(取消勾选checkbox) 已取消 -> 未完成(点击恢复按钮) 支持控制台打印所有事件数据 支持筛选事件 支持编辑事件 支持删除事件 支持清空所有事件

  • 基于Vue2.0的分页组件

    本文实例为大家分享了Vue2.0分页组件的具体实现代码,供大家参考,具体内容如下 整个示例打包了,有需要的可以下载,有不对的地方欢迎指出:vue分页组件 组件部分代码: Vue.component('zpagenav', { template: `<nav class="zpagenav">` + `<ul class="page-ul">` + `<li v-bind:key="index" v-for="

  • 基于Angular 8和Bootstrap 4实现动态主题切换的示例代码

    效果 首先看看效果: 本文将介绍如何基于Angular 8和Bootstrap 4来实现上面的主题切换效果. 设计 遵循Bootstrap的设计,我们会使用 bootswatch.com提供的免费主题来实现上面的效果.Bootswatch为前端程序员提供了多达21种免费的Bootstrap主题,并且提供了API文档和 实例页面 ,介绍如何在HTML+jQuery的环境中实现主题切换.其实,我们也可以使用Bootstrap官网提供的主题设计工具来设计自己的主题,这些自定义的主题也是可以用在本文介绍

随机推荐