vue项目的换肤功能

15 篇文章 0 订阅

踩坑

看到网上一个办法是在static中写好不同的样式文件。当按钮点击切换的时候,调用方法,去动态加载css文件。

export function getTheme(themeId){
    return require("../../static/css/theme/" + themeId + "/index.scss");
}

但是!这样切换的时候,后面的样式会覆盖前面的样式!皮肤切换不回来了!

进入正题

步骤一、写样式。

在styles文件夹中添加theme.scss,在里面写好不同的主题风格。我这边是.lightMode和.darkMode

步骤二、引入theme.scss (也可以直接将theme.scss引入到main.js)

@import './theme.scss'; //引入到index.scss这个全局样式中
import '@/styles/index.scss' // 在main.js中引入index.scss全局样式

步骤三、layout页面

最外层包裹上样式,获取子组件按钮切换的值的回传

用computed监听themeObj,通过themeObj中的isNightFlag动态获取样式。

methods中,写上changeTheme方法,通过子组件中的切换按钮传回来的isNight,去更改isNightFlag的数值。写入cookies,防止每次刷新的时候皮肤恢复成默认样式。

created中,每次重新加载页面的时候,通过cookies去判断当前已经选择的皮肤主题。

步骤四、子组件页面

子组件传递给父组件当前的皮肤选择,并且要注意当刷新之后的switch的皮肤选择状态(要从cookie中获取)。

<el-switch
  v-model="isNightTheme"
  active-text="夜间模式"
    active-color="#1062b5"
  inactive-color="#a0cbf6"
  @change="changeTheme">
</el-switch>
  data (){
    return{
      isNightTheme:false
    }
  },
  created(){
    //获取switch的当前状态
    Cookies.get('modeStatus') == 1 ? this.isNightTheme = true : this.isNightTheme = false
  },
  methods:{
    changeTheme(){
      this.$emit('themeClick',this.isNightTheme);
    },
  }

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值