前言的前言:
有一段时间没有更新<<基于Vue的后台管理模板>>专栏了
看了一眼,最近的一次更新还是在8月23日,算起来也间隔了1个多月
中间这段时间一直在看TypeScript,做了些笔记并做了一次TS的学习分享
目前是十一长假期间,在TS告一段落后,回过头来继续连载后台管理模板
先一起来同步一下之前的项目进度:
->创建项目
->集成UI库实现按需加载
->创建后台管理布局
->路由配置,登录,注册,菜单
->根据路由动态生成菜单
->完善Header组件
->完善登录页,保存用户信息
->Axios封装
->mock server配置和使用
->多环境配置+proxy代理配置
->Vuex最佳实践+持久化
到目前为止,一个大体的"框架"已经差不多了,能够投入使用,但还有很大的优化空间
后续安排:
后续将集中精力对框架进行优化,解决IE兼容性问题,添加权限模块,表单等常用菜单页面
框架布局支持响应式,针对移动端提供适配和解决方案,根据浏览器进行构建
集成代码检查,一键部署,单元测试,端到端测试,自动生成雪碧图等实用功能
引入多种webpack插件对项目进行性能优化,再集成N多日常开发常用工具
最后,此项目将被制作成为代码模板,通过cli工具一键生成可直接用于生产的后台管理模板
沉淀团队技术,提高开发效率,统一编码规范和风格,屏蔽技术细节,降低Bug产生概率
回归后的第一篇:
先解决IE兼容性问题,刚好和前面内容无关
不对,换一个,先来ECharts封装和使用,也和前面内容无关
(之所以将Echarts放在前面,因为ECharts封装时会产生一个IE兼容性问题)
ECharts:
Enterprise Charts
百度开源数据可视化工具(纯JS图表库),底层依赖轻量级Canvas库ZRender
兼容绝大部分浏览器(IE6/7/8/9/10/11,chrome,firefox,Safari等)
提供柱状图、折线图、饼图、气泡图及四象限图,地图等,模板,API,文档丰富
vue-echarts:
基于ECharts依赖Vue封装后的插件库
轻量,高效,按需绑定事件
支持按需导入ECharts.js图表和组件
支持组件调整大小事件自动更新视图
ps:
本篇将分别介绍如何将ECharts封装为Vue组件 和 vue-echarts的使用
"组件调整大小事件自动更新视图"使用resize-detector实现
而这正是产生IE兼容性的问题所在,可使用babel修复
安装依赖:
npm install --save echarts
创建components/Chart.vue:
创建Chart.vue组件用来封装ECharts,通过ref绑定echarts实例
组件销毁时,回收资源
<template>
<div ref="chartDom">ECharts</div>
</template>
<script>
import echarts from "echarts";
export default {
props: ["chartData"],
mounted() {
this.drawChart();
},
methods: {
drawChart() {
this.chart = echarts.init(this.$refs.chartDom);
var option = {
tooltip: {},
xAxis: {
// axisLabel:{
// rotate:45, // 旋转角度
// interval:0 // 间隔显示
// },
data: this.chartData.xAxisArr
},
yAxis: [
{
name: "数量",
type: "value",
show: true,
// splitNumber: 10, //坐标轴的分割段数
axisLabel: {
fontSize: 14,
color: "#333"
},
splitLine: {
show: true
}
},
{
name: "金额",
type: "value",
min: "0",
max: function(value) {
return value.max;
},
axisLabel: {
fontSize: 14,
color: "#333",
// formatter: '{value} %'
},
splitLine: {
show: false
}
}
],
series: [
{
name: "数量",
type: "bar",
data: this.chartData.quantityArr,
itemStyle: {
normal: {
color: "#009C82"
}
}
},
{
name: "金额",
type: "line",
data: this.chartData.priceArr,
yAxisIndex: 1,
itemStyle: {
normal: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
offset: 0,
color: 'rgb(255, 204, 102)'
}, {
offset: 1,
color: 'rgb(255, 153, 51)'
}]),
label : {
show : true,
position : 'top',
textStyle : {
fontSize : '14',
color: 'rgb(255, 156, 54)',
}
}
}
}
}
]
};
this.chart.setOption(option);
},
},
beforeDestroy() {
this.chart.dispose();
this.chart = null;
}
};
</script>
<style></style>
在main.js中引入了antd的Card组件:
Card可用于表单页面的Title显示,包裹标签中的内容
import {
Card
} from "ant-design-vue";
Vue.use(Card);
views/Dashboard/Dashboard.vue中引入Chart.vue:
<template>
<!-- <div>首页Dashboard仪表盘-单层路由,在菜单显示</div> -->
<a-card title="首页Dashboard仪表盘-单层路由,在菜单显示">
<Chart style="marginTop: 20px; height: 500px" :chartData="chartData" />
</a-card>
</template>
<script>
import Chart from "../../components/Chart";
export default {
components: {
Chart
},
name: "Dashboard",
data() {
return {
chartData: {
xAxisArr: ["SKU1001", "SKU1002", "SKU1003", "SKU1004", "SKU1005"],
quantityArr: ["10000", "20000", "30000", "40000", "50000"],
priceArr: ["100000", "200000", "300000", "400000", "500000"]
}
};
}
};
</script>
<style></style>
echart的使用教程网上一抓一大把,这里就随便举个简单的例子演示一下
Dashboard视图组件中引入了封装好的Chart组件,通过chartData传递参数
示例中仅对x轴(商品名称),左侧y轴(数量),右侧y轴(金额) 三种数据进行传参
虽然能够"正常"显示,但仍有一些问题需要解决:
当视窗变化时,Chart组件不能重绘实现随视窗动态改变宽度
为了实现chart组件根据视窗变化重新绘制,需要使用resize-detector插件:
npm install --save resize-detector
components/Chart.vue中使用resize-detector:
1,引入resize-detector中addListener, removeListener
2,创建resize方法,触发echarts实例的resize重绘
3,echarts实例初始化完成后,绑定resize重绘方法到chartDom上
4,组件销毁时i,释放资源
<template>
<div ref="chartDom">ECharts</div>
</template>
<script>
import echarts from "echarts";
// 引入resize-detector中addListener, removeListener
import { addListener, removeListener } from "resize-detector";
export default {
props: ["chartData"],
mounted() {
this.drawChart();
},
methods: {
drawChart() {
this.chart = echarts.init(this.$refs.chartDom);
// 注册事件监听
addListener(this.$refs.chartDom, this.resize);
...
this.chart.setOption(option);
},
// 重绘chart实例
resize() {
console.log("chart-resize")
this.chart.resize();
}
},
beforeDestroy() {
// 移除事件监听
removeListener(this.$refs.chartDom, this.resize);
this.chart.dispose();
this.chart = null;
}
};
</script>
<style></style>
这样就实现了根据chartDom改变事件,触发echart实例重绘:
此时,观察控制台chart组件resize方法中的log,又发现一个问题:
当拖动改变浏览器视窗大小时,会不断的触发resize事件
因此,我们需要控制一下触发resize方法的频率,以改善性能
使用lodash的debounce方法消除抖动:
npm install --save lodash
components/Chart.vue中使用lodash/debounce:
<script>
// 消除resize抖动
import debounce from "lodash/debounce";
export default {
...
created() {
// 设置300ms间隔
this.resize = debounce(this.resize, 300);
},
...
};
</script>
到这里echart的封装,使用以及创建问题就完成了
如果需要更新Chart.vue组件数据,可以使用watch方式监听传参变化,触发重绘
<script>
export default {
...
// 监听数据变化,重绘chart
watch: {
chartData() {
this.chartData = this.chartData;
console.log("watch-chartData", this.chartData);
this.drawChart();
}
},
...
};
</script>
安装vue-echarts:
npm install --save vue-echarts
views/Dashboard/Dashboard.vue中使用vue-echarts:
<template>
<a-card title="首页Dashboard仪表盘-单层路由,在菜单显示">
<Chart style="marginTop: 20px; height: 500px" :chartData="chartData" />
<v-chart style="marginTop: 20px; height: 500px" :options="polar"/>
</a-card>
</template>
<script>
import Chart from "../../components/Chart";
// vue-echarts
import ECharts from 'vue-echarts'
import 'echarts/lib/chart/line'
import 'echarts/lib/component/polar'
export default {
components: {
Chart,
'v-chart': ECharts
},
name: "Dashboard",
data() {
let data = []
for (let i = 0; i <= 360; i++) {
let t = i / 180 * Math.PI
let r = Math.sin(2 * t) * Math.cos(2 * t)
data.push([r, i])
}
return {
chartData: {
xAxisArr: ["SKU1001", "SKU1002", "SKU1003", "SKU1004", "SKU1005"],
quantityArr: ["10000", "20000", "30000", "40000", "50000"],
priceArr: ["100000", "200000", "300000", "400000", "500000"]
},
polar: {
title: {
text: '极坐标双数值轴'
},
legend: {
data: ['line']
},
polar: {
center: ['50%', '54%']
},
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'cross'
}
},
angleAxis: {
type: 'value',
startAngle: 0
},
radiusAxis: {
min: 0
},
series: [
{
coordinateSystem: 'polar',
name: 'line',
type: 'line',
showSymbol: false,
data: data
}
],
animationDuration: 2000
}
};
}
};
</script>
运行查看效果:
这里直接使用了vue-charts的Demo:
https://github.com/ecomfe/vue-echarts
当组件大小发生变化(触发事件)时,会自动更新视图
此功能使用resize-detector插件实现,导致IE兼容性问题
报错截图:
默认情况下 babel-loader 会忽略所有 node_modules 中的文件
此时需要使用Babel 显式转译resize-detector依赖
vue-cli3.x添加配置:
module.exports = {
transpileDependencies: [
// 'vue-echarts',
'resize-detector',
]
}
本篇介绍了Vue项目中如何使用ECharts和vue-echarts,
以及使用resize-detector实现响应式过程中导致的浏览器兼容问题及解决方法
下一篇来看Vue-cli3.x在IE上的一些问题及解决方法
传送门:CSDN下载
传送门:GitHub下载-vue-framework-admin-v0.0.12
20191006:
博客创建
20191007:
完善:二,Vue封装ECharts组件及问题解决
完善:三,vue-echarts的使用
20191008:
完善:五,IE兼容性问题,添加报错截图
添加代码下载链接地址
20191016:
更新CSDN下载链接