vue2+vuex+less 实现主题切换

1.首先初始化 vue2 项目并安装 less 相关插件

npm install less --save
npm install less-loader@5.0.0 --save

2.安装样式处理插件

npm install style-resources-loader -D
npm install vue-cli-plugin-style-resources-loader -D

3.在 src 目录下创建 theme 文件夹并创建文件 style.less (定义样式)写代码

// 默认的主题颜色
@primaryColor: var(--primaryColor);
@primaryTextColor: var(--primaryTextColor);

 4.在根目录下创建 vue.config.js 文件 写代码

const path = require("path");
module.exports = {
  pluginOptions: {
    "style-resources-loader": {
      preProcessor: "less",
      patterns: [
        // 加上自己的路径
        path.resolve(__dirname, "./src/theme/style.less"),
      ],
    },
  },
};

5.在 theme 文件夹下创建文件 model.js (主题文件) 写代码

// 一套默认主题以及一套暗黑主题

export const themes = {
  default: {
    primaryColor: "#fff",
    primaryTextColor: "#000",
  },
  dark: {
    primaryColor: "#000",
    primaryTextColor: "#fff",
  },
};

6.在 theme 文件夹下创建文件 theme.js (修改主题文件)

import { themes } from "./model";
// 修改页面中的样式变量值
const changeStyle = (obj) => {
  for (let key in obj) {
    document
      .getElementsByTagName("body")[0]
      .style.setProperty(`--${key}`, obj[key]);
  }
};
// 改变主题的方法
export const setTheme = (themeName) => {
  localStorage.setItem("theme", themeName); // 保存主题到本地,下次进入使用该主题
  const themeConfig = themes[themeName];
  // 如果有主题名称,那么则采用我们定义的主题
  if (themeConfig) {
    changeStyle(themeConfig); // 改变样式
  } else {
    changeStyle(themeConfig);
  }
};

 7.组件中使用

<template>
  <div>
    <div class="text">文字</div>
    <button @click="defaultTheme">默认</button>
    <button @click="dark">黑色</button>
  </div>
</template>

<script>
import { mapMutations } from "vuex";
export default {
  pass: true,
  name: "index",
  data() {
    return {};
  },
  mounted() {
    this.init(); // 调用初始化主题方法
  },
  created() {},
  methods: {

    // 将存在 vuex 中的更改主题方法拿过来
    ...mapMutations(["setThemeStore"]),

    // 主题初始化
    init() {
      this.setThemeStore(this.$store.state.theme);
    },
    // 更改为默认主题
    defaultTheme() {
      this.setThemeStore("default");
    },
    // 更改为暗黑主题
    dark() {
      this.setThemeStore("dark");
    },
  },
};
</script>

<style lang="less" scoped>
.text {
  width: 100vw;
  height: 100px;
  background-color: @primaryColor;
  color: @primaryTextColor;
}
</style>

8. 在 store 文件夹下 创建 index.js 文件 写代码

import Vuex from "vuex";
import { setTheme } from "../theme/theme";

Vue.use(Vuex);

const store = new Vuex.Store({
  state: {
    theme: localStorage.getItem("theme") || "default",
  },
  mutations: {
    setThemeStore(state, theme) {
    setTheme(theme);
    }
  },
})

export default store;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微光无限

破晓的日子还有很多!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值