在 Vue 3 + TypeScript 项目中实现主题切换功能

在 Vue 3 + TypeScript 项目中实现主题切换功能,可以通过以下步骤完成。以下是一个完整的示例,展示如何在 Vue 3 + TypeScript 项目中实现主题切换,并动态应用主题样式。

  1. 创建配置文件
    首先,创建一个配置文件 config.ts,用于定义主题列表和默认主题。
javascript 复制代码
// src/config.ts
export const config = {
  Theme: "lightTheme",
  ThemeList: ["lightTheme", "darkTheme", "blackTheme"]
};
  1. 创建主题切换逻辑
    在 main.ts 文件中,添加主题切换逻辑。这个逻辑会在应用初始化时运行,并根据配置文件中的主题设置动态应用主题样式。
javascript 复制代码
// src/main.ts
import { createApp } from "vue";
import App from "./App.vue";
import { config } from "./config";

const initTheme = () => {
  let theme = config.ThemeList.includes(config.Theme)
    ? config.Theme
    : "blackTheme";
  document.documentElement.className = "";
  document.documentElement.classList.add(theme);
};

const app = createApp(App);

app.mount("#app");

initTheme();
  1. 定义主题样式
    在 styles 文件夹中,创建主题样式文件,例如 themes.css,定义不同主题的样式。
javascript 复制代码
/* src/styles/themes.css */
.lightTheme {
  --background-color: #ffffff;
  --text-color: #000000;
}

.darkTheme {
  --background-color: #000000;
  --text-color: #ffffff;
}

.blackTheme {
  --background-color: #000000;
  --text-color: #ffffff;
}

也可以创建多个scss文件,每个文件对应不一样的主题

javascript 复制代码
dark.scss
html.dark{}
black.scss
html.black{}

在 main.ts 中引入主题样式文件:

javascript 复制代码
// src/main.ts
import { createApp } from "vue";
import App from "./App.vue";
import { config } from "./config";
import "./styles/themes.css";

const initTheme = () => {
  let theme = config.ThemeList.includes(config.Theme)
    ? config.Theme
    : "blackTheme";
  document.documentElement.className = "";
  document.documentElement.classList.add(theme);
};

const app = createApp(App);

app.mount("#app");

initTheme();
  1. 动态切换主题
    在 Vue 组件中,添加一个方法来动态切换主题。例如,在 App.vue 文件中:
javascript 复制代码
<template>
  <div>
    <h1>Theme Switcher</h1>
    <button @click="switchTheme('lightTheme')">Light Theme</button>
    <button @click="switchTheme('darkTheme')">Dark Theme</button>
    <button @click="switchTheme('blackTheme')">Black Theme</button>
  </div>
</template>

<script lang="ts">
import { defineComponent } from "vue";
import { config } from "./config";

export default defineComponent({
  name: "App",
  methods: {
    switchTheme(theme: string) {
      if (config.ThemeList.includes(theme)) {
        config.Theme = theme;
        document.documentElement.className = "";
        document.documentElement.classList.add(theme);
      }
    }
  }
});
</script>

<style>
body {
  background-color: var(--background-color);
  color: var(--text-color);
}
</style>
  1. 使用 CSS 变量
    在主题样式中使用 CSS 变量,这样可以在组件中动态应用主题样式。例如:
javascript 复制代码
/* src/styles/themes.css */
.lightTheme {
  --background-color: #ffffff;
  --text-color: #000000;
}

.darkTheme {
  --background-color: #000000;
  --text-color: #ffffff;
}

.blackTheme {
  --background-color: #000000;
  --text-color: #ffffff;
}

在组件中使用 CSS 变量:

javascript 复制代码
<template>
  <div>
    <h1>Theme Switcher</h1>
    <button @click="switchTheme('lightTheme')">Light Theme</button>
    <button @click="switchTheme('darkTheme')">Dark Theme</button>
    <button @click="switchTheme('blackTheme')">Black Theme</button>
  </div>
</template>

<script lang="ts">
import { defineComponent } from "vue";
import { config } from "./config";

export default defineComponent({
  name: "App",
  methods: {
    switchTheme(theme: string) {
      if (config.ThemeList.includes(theme)) {
        config.Theme = theme;
        document.documentElement.className = "";
        document.documentElement.classList.add(theme);
      }
    }
  }
});
</script>

<style>
body {
  background-color: var(--background-color);
  color: var(--text-color);
}
</style>
  1. 保存主题设置
    如果需要保存主题设置,可以使用 localStorage 或 sessionStorage。例如:
javascript 复制代码
// src/main.ts
import { createApp } from "vue";
import App from "./App.vue";
import { config } from "./config";
import "./styles/themes.css";

const initTheme = () => {
  let theme = localStorage.getItem("theme") || config.Theme;
  if (!config.ThemeList.includes(theme)) {
    theme = "blackTheme";
  }
  document.documentElement.className = "";
  document.documentElement.classList.add(theme);
  config.Theme = theme;
};

const app = createApp(App);

app.mount("#app");

initTheme();

在 App.vue 中保存主题设置:

javascript 复制代码
<script lang="ts">
import { defineComponent } from "vue";
import { config } from "./config";

export default defineComponent({
  name: "App",
  methods: {
    switchTheme(theme: string) {
      if (config.ThemeList.includes(theme)) {
        config.Theme = theme;
        document.documentElement.className = "";
        document.documentElement.classList.add(theme);
        localStorage.setItem("theme", theme);
      }
    }
  }
});
</script>

总结

通过以上步骤,你可以在 Vue 3 + TypeScript 项目中实现主题切换功能。主题切换逻辑在 main.ts 中初始化,并在组件中提供动态切换主题的方法。使用 CSS 变量可以方便地在组件中应用主题样式。

记录一下这个需求,AI生成

相关推荐
程序员海军4 小时前
用了两年多 GPT,我最近开始换模型了,还折腾了个求职避坑 Agent
前端·人工智能·后端
zttbee5 小时前
echarts图表tooltip色块失效
前端·javascript·echarts
excel6 小时前
IndexNow:让搜索引擎更快发现网站更新的主动通知协议
前端·后端·架构
子兮曰7 小时前
CSS 复现 23 种设计风格:从拟物到液态玻璃的成本阶梯与兜底写法【实战】
前端·css·视觉设计
虚无境7 小时前
如何用AI帮我写出实用的插件
前端·javascript·ai编程
柳杉8 小时前
从数字化到数智化:3D 可视化大屏的下一个五年
前端·ai编程·数据可视化
濮水大叔8 小时前
函数式与对象式:前端架构的两种成本曲线
vue.js·react.js·函数式编程
Flynt9 小时前
Cloudflare 用 Rust 重写了 TypeScript:我拿同一批代码跑了跑,报错一模一样,退出码不一样
rust·typescript·前端工程化
风骏时光牛马9 小时前
从零到实战:AI全栈学习进阶路线
前端
FRing039 小时前
JavaScript入门到精通二十六(变量提升、函数剩余参数、展开运算符、ES6箭头函数)
开发语言·前端·javascript·es6·箭头函数