vue+element+echarts 换肤功能

demo中的换肤效果没有用到css预编译处理

整体的思路是 预先定义好多套css样式表分别放到static文件中,根据按钮切换在DOM上挂载相对应的CSS,听上去是个比较笨的方法,下面直接上代码

1.预先在准备好自己写好的css文件、element官方主题样式、echarts官方样式(这里下载是js格式)

2. 将默认的主题放在vuex中

import Vue from 'vue'
import Vuex from 'vuex'

//挂载Vuex
Vue.use(Vuex)

//创建VueX对象
const store = new Vuex.Store({
    state:{
        //存放的键值对就是所要管理的状态
        echThemeName:sessionStorage.getItem("echartTheme") || "essos", //echarts主题
        elementName:sessionStorage.getItem("elementtheme") || "static/elementThem2.css", //element主题
        htmlTheme:sessionStorage.getItem("htmlTheme") || "static/htmlTheme.css", //html主题


    },
    getters:{
        GEt_echThemeName:(state)=>{
            return state.echThemeName
        },
        Get_elementName:(state)=>{
            return state.elementName
        },
        Get_htmlThemeURl:(state)=>{
            return state.htmlTheme
        },

    }

})

export default store

然后在mian.js中挂载vuex

import store from './store'
/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  store,
  components: { App },
  template: '<App/>'
})

3.下面将echarts主题在vue.app中引入,这样全局的组件都可使用这个主题文件


<script>
import '../static/echarts_essos' // 引入echarts主题文件
import "../static/echarts_dark" // 引入echarts主题文件
export default {
  name: 'App'
}
</script>

4.在index.html中预先定义好两个link 用于更换不同的主题css文件

<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <link rel="stylesheet" id="elementTheme" href="static/index.css">
    <link rel="stylesheet" id="styleTheme" href="static/theme.css">
    <title>vue换肤</title>
  </head>
  <body>
    <div id="app"></div>
    <!-- built files will be auto injected -->
  </body>
</html>

5.在页面上绑定一个按钮用作换肤的切换

<script>
import echarts from "../components/echarts"
import {mapGetters,mapActions} from "vuex"
export default {
  components:{
    echarts
  },
  props:{},
  data(){
    return {}
  },
  watch:{
    
  },
  computed:{
    /**vuex数据映射 */
    ...mapGetters({
      GetEchsName:'GEt_echThemeName',
      GetelementName:"Get_elementName",
      GethtmlTheme:"Get_htmlThemeURl",
    }),
  },
  created(){},
  mounted(){
    //页面初始化获取vuex的默认主题挂载到DOM上
    document.getElementById('styleTheme').href = this.GethtmlTheme; 
    document.getElementById("elementTheme").href = this.GetelementName;
  },
  methods:{
    switchFun(){
      let styleDom = document.getElementById('styleTheme')
      let elemetDom = document.getElementById("elementTheme")
      //判断echarts主题的文件名称,在session中存取相对应的主题文件地址
      switch (this.GetEchsName) {
        case "essos":
          sessionStorage.setItem("echartTheme","dark");
          sessionStorage.setItem("elementtheme","static/elementThem.css");
          sessionStorage.setItem("htmlTheme","static/htmlTheme2.css");
                
          break;
        default:
          sessionStorage.setItem("echartTheme","essos");
          sessionStorage.setItem("elementtheme","static/elementThem2.css");
          sessionStorage.setItem("htmlTheme","static/htmlTheme.css"); 
          break;
      }
      location.reload()
    }
  },
}
</script>

6.echarts组件 在渲染时需要在vuex中获取echarts主题的名称,并需要刷新页面才会渲染新的主题文件

<script>
var echarts = require("echarts/lib/echarts");
require("echarts/lib/chart/bar");
require("echarts/lib/chart/radar");
require("echarts/lib/component/tooltip");
require("echarts/lib/component/title");
import {mapGetters,mapActions} from "vuex"
export default {
  components: {},
  props: {},
  data() {
    return {
      option: {
        title: {
          text: "堆叠区域图"
        },
        tooltip: {
          trigger: "axis",
          axisPointer: {
            type: "cross",
            label: {
              backgroundColor: "#6a7985"
            }
          }
        },
        legend: {
          data: ["邮件营销", "联盟广告", "视频广告", "直接访问", "搜索引擎"]
        },
        toolbox: {
          feature: {
            saveAsImage: {}
          }
        },
        grid: {
          left: "3%",
          right: "4%",
          bottom: "3%",
          containLabel: true
        },
        xAxis: [
          {
            type: "category",
            boundaryGap: false,
            data: ["周一", "周二", "周三", "周四", "周五", "周六", "周日"]
          }
        ],
        yAxis: [
          {
            type: "value"
          }
        ],
        series: [
          {
            name: "邮件营销",
            type: "line",
            stack: "总量",
            areaStyle: {},
            data: [120, 132, 101, 134, 90, 230, 210]
          },
          {
            name: "联盟广告",
            type: "line",
            stack: "总量",
            areaStyle: {},
            data: [220, 182, 191, 234, 290, 330, 310]
          },
          {
            name: "视频广告",
            type: "line",
            stack: "总量",
            areaStyle: {},
            data: [150, 232, 201, 154, 190, 330, 410]
          },
          {
            name: "直接访问",
            type: "line",
            stack: "总量",
            areaStyle: {},
            data: [320, 332, 301, 334, 390, 330, 320]
          },
          {
            name: "搜索引擎",
            type: "line",
            stack: "总量",
            label: {
              normal: {
                show: true,
                position: "top"
              }
            },
            areaStyle: {},
            data: [820, 932, 901, 934, 1290, 1330, 1320]
          }
        ]
      }
    };
  },
  watch: {
    GetEchsName(value,ovalue){
      this.echartsFun(value)
    }
  },
  computed: {
    /**vuex数据映射 */
    ...mapGetters({
      GetEchsName:'GEt_echThemeName'
    }),
  },
  created() {},
  mounted() {
    this.echartsFun()
  },
  methods: {
    echartsFun(theme){
      let text = theme
      let myEch = echarts.init(document.getElementById('echElement'),this.GetEchsName);
      myEch.setOption(this.option)
    }
  }
};

经测试换肤效果成功

获取全平台学习资源

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值