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

 更新时间:2023年04月20日 08:58:22   作者:syySummer48303  
本文主要介绍了基于Vue2.0和Typescript实现多主题切换的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

之前在项目中用了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;
   }

效果图如下图所示

theme1.png

theme2.png

theme3.png

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

相关文章

  • 详解Vue中组件的缓存

    详解Vue中组件的缓存

    这篇文章主要介绍了Vue中组件的缓存,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • 详解mpvue小程序中怎么引入iconfont字体图标

    详解mpvue小程序中怎么引入iconfont字体图标

    这篇文章主要介绍了详解mpvue小程序中怎么引入iconfont字体图标,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-10-10
  • Vue+Echarts实现简单折线图

    Vue+Echarts实现简单折线图

    这篇文章主要为大家详细介绍了Vue+Echarts实现简单折线图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • vue实现显示消息提示框功能

    vue实现显示消息提示框功能

    这篇文章主要介绍了vue实现显示消息提示框功能,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • vue3 el-upload单张图片回显、编辑、删除功能实现

    vue3 el-upload单张图片回显、编辑、删除功能实现

    这篇文章主要介绍了vue3 el-upload单张图片回显、编辑、删除功能实现,图片回显时隐藏上传区域,鼠标悬浮显示遮罩层进行编辑、删除操作,删除图片后显示上传区域,本文通过实例代码分享实现方法,感兴趣的朋友一起看看吧
    2023-12-12
  • Vue中 v-if/v-show/插值表达式导致闪现的原因及解决办法

    Vue中 v-if/v-show/插值表达式导致闪现的原因及解决办法

    在开发过程中经常会发现当页面明明不应该出现的元素或内容会闪现一下然后消失,这篇文章给大家分享Vue中 v-if/v-show/插值表达式导致闪现的原因及解决办法,一起看看吧
    2018-10-10
  • vue+iview使用树形控件的具体使用

    vue+iview使用树形控件的具体使用

    这篇文章主要介绍了vue+iview使用树形控件的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • vue中报错“error‘xxx‘ is defined but never used”问题及解决

    vue中报错“error‘xxx‘ is defined but never used”问题及解决

    介绍了两种解决代码导入问题的方法:单一代码解决和全局解决,第一种方法是在代码前面添加特定代码并保存;第二种方法是在package.json中添加代码后重启项目,这些方法可以有效解决导包错误提示,希望对大家有帮助
    2024-10-10
  • vue3 定义使用全局变量的示例详解

    vue3 定义使用全局变量的示例详解

    全局变量(函数等)可以在任意组件内访问,可以当组件间的传值使用,这篇文章给大家介绍vue3 定义使用全局变量的示例详解,感兴趣的朋友跟随小编一起看看吧
    2023-10-10
  • vue中使用axios请求post接口发送两次

    vue中使用axios请求post接口发送两次

    这篇文章主要为大家介绍了vue中使用axios请求post接口,请求会发送两次原因解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11

最新评论