当前位置: 代码迷 >> 综合 >> VUE—ELEMENT—IVIEW—ECHARTS
  详细解决方案

VUE—ELEMENT—IVIEW—ECHARTS

热度:95   发布时间:2023-11-20 06:55:38.0

文章目录

  • 1.根据后台数据动态生成表格的表头
  • 2.html2canvas插件实现截图
  • 3.月份选择器设置初始值
  • 4.vue起服务运行dist
  • 5.在项目中按需引入loading指令
  • 6.过滤器使用
  • 7.echarts
  • 8.循环渲染/动态增删
  • 9.上传功能实现
  • 10.关于请求的三种方式
  • 11.echarts的一些配置
  • 12.升级项目中iview的版本

1.根据后台数据动态生成表格的表头

<el-table :data="tableData" border><el-table-columnv-for="item in tableColumns":key="item.prop":prop="item.prop":label="item.label"></el-table-column>
</el-table>data () {
    return {
    tableData: [],tableColumns: [ // 已知表头{
    label: '日期',prop: 'tDate'},...]}},methods: {
    get_tabledata () {
    const self = thisvar res = {
    status: 200,message: 'success',data: {
    addColumn: [ // 后台动态数据添加到表头{
    prop: 'groupMoney1',label: '渠道组1'},...],inData: [{
    tDate: '2020-11-01',sumCost: 12312313,sumMoney: 12312313,sumDAU: 2333,IosMoney: 11111,androidMoney: 23933,groupMoney1: 22222,groupMoney2: 67555},...]}}self.tableData = res.data.inDataself.tableColumns = [...self.tableColumns,...res.data.addColumn] // 合并表头数组}},

2.html2canvas插件实现截图

http://html2canvas.hertzen.com/getting-started

<!--安装插件-->
npm install html2canvas<!--在script标签中引入实例-->
import html2canvas from 'html2canvas';<!--在button点击事件或者created事件中画图-->
html2canvas(document.body).then(function(canvas) {
    document.body.appendChild(canvas);
});<!--项目中使用-->
<Button type="primary" ghost @click="explain_handle">输出分析报告</Button>explain_handle () {
    this.explain_modal = !this.explain_modalhtml2canvas(document.getElementById('table_box')).then(function (canvas) {
    document.getElementById('img_box').appendChild(canvas)})},

3.月份选择器设置初始值

/*** @description 用于将获取yyyy-mm-dd格式的当前时间,且是1号*/
export const month_now = () => {
    var d = new Date()var datetime = ''if (d.getMonth() < 9) {
    datetime = d.getFullYear() + '-0' + (d.getMonth() + 1) + '-01'} else {
    datetime = d.getFullYear() + '-' + (d.getMonth() + 1) + '-01'}return datetime
}created () {
    const self = this// 这里的空格''使得生成的中国标准时间的时分秒是00:00:00const now = new Date(month_now() + ' ')const nowdate = [now]// monthtime是时间选择器v-model的时间变量self.monthtime = nowdateconsole.log(nowdate)self.month_time = month_handle(self.monthtime)}

4.vue起服务运行dist

// console命令
npm i -D live-server// 修改package.json
"scripts": {
    "serve": "vue-cli-service serve","build": "vue-cli-service build",// 增加一个start命令"start": "live-server ./dist -o","lint": "vue-cli-service lint"},

5.在项目中按需引入loading指令

  • 去github看element的源码:
  • https://github.com/ElemeFE/element/blob/dev/src/index.js
  • 可以看到它export default了Loading
  • 在自己项目的src/main.js中去按需引入:
// 可以直接写'element-ui'是因为框架就是这么抛出的,用element-ui代表了指定路径,可以去node-modules下面去看看有没有一个名为element-ui的文件夹
// { Loading }这种方式是ES6的解构赋值
import {
     Loading } from 'element-ui'Vue.use(Loading.directive)
  • 在表格中使用:
 <el-tablev-loading="tableloading":data="tableData"style="width: 100%;">
// 默认值 
data () {
    return {
    tableloading: false,// 开始请求的时候设置为true,加载动画开始
getYYReportListByGroup (req_obj) {
    this.tableloading = true// 拿到数据之后又设置为false,停止加载
this.tableloading = false

6.过滤器使用

  • 在对表格数据进行特定展示时,一般使用filter,这样可以避免直接改变tabledata
  • 方法一:直接写
// monthHandle是方法名,也可以传参
<el-table-column prop="date" label="月份" fixed min-width="82px"><template slot-scope="scope"><span>{
    {
     scope.row.date | monthHandle }}</span></template></el-table-column>// cell是默认第一个参数(scope.row.date),传过来的参数默认在第二个位置
<script>
export default {
    name: 'groupgame_day',components: {
    },data () {
    return {
    }},
filters: {
    monthHandle (cell) {
    return cell.split('-')[1] + '月'}},
  • 方法二:在common/js中创建一个filters.js文件
  • 把这个方法抛出,在main.js中全局引入
// 日期到时月,X月
export function monthHandle (val) {
    if (!val) return valreturn val.split('-')[1] + '月'
}import * as Filter from '@/common/js/filters'// 全局过滤器
for (const key in Filter) {
    Vue.filter(key, Filter[key])
}

7.echarts

peerDependences 强制依赖,vue-echarts强制依赖vue(几十k)和echarts(比较大)

关于echarts和vue-echarts

  • 都是扩展包,然后vue-echarts其实就是用vue把echarts封装了一层
  • echarts可能更靠近浏览器,然后vue-echarts可能更靠近es6
  • 在vue项目中使用vue-echarts而不是echarts,如果要使用echarts的话,一般要自己封一层

区分cli2和cli3

  • 看有没有vue.config.js文件,如果有的话,就是3,没有的话就是2
  • 而且2比3多了一个build文件

安装和使用

https://github.com/ecomfe/vue-echarts/blob/master/README.zh_CN.md

  • 安装指定版本的echarts:npm install echarts@4.2.0-rc.2 --save
  • 安装vue-echarts:npm install echarts vue-echarts
  • 配置项可以去参考echarts的配置项
  • 按需引入不用在入口文件中去引入,全局引入才需要
// 全局引入
import VueECharts from 'vue-echarts' // 在 webpack 环境下指向 components/ECharts.vue
Vue.component('v-chart', VueECharts)//-----自己抽的组件中按需引入------
// 手动引入 ECharts 各模块来减小打包体积
import ECharts from 'vue-echarts'
import 'echarts/lib/chart/bar'
import 'echarts/lib/component/tooltip'// 以上具体模块的路径可以在node modules里面去看components: {
    'v-chart': ECharts},
  • 注意:title/legend/tooltip等等,如果需要使用的话,也都是需要按需引入的
  • 像这样:import ‘echarts/lib/chart/line’
  • 但是需要自己去node modules里面去查看路径
  • appendData添加数据;showLoading加载动画;getDataURL输出为图片;

没有显示的原因

  • 先去查看DOM,有可能是高度设置问题

8.循环渲染/动态增删

  • 在需要变化的dom上加v-for
  • :key绑定item.id
  • 循环的时候除了可以拿item,也可以加第二个默认的index参数
  • 即:(item, index) in arr
  • 可以同时使用写死的class和绑定变量的:class,但是这两个分别都最多只能存在一个(https://cn.vuejs.org/v2/guide/class-and-style.html)
  • :class后面可以是class的数组也可以是计算属性(https://cn.vuejs.org/v2/guide/computed.html)
<div class="comBox"><div v-for="(item,idx) in com_arr" :key="item.id" class="comcell" :class="{'selcomcell': item.check}" @click="selcom_handle()"><span>{
    {
    item.name}}</span><Icon type="md-close-circle" @click.stop="close_com(idx)" /></div><button type="text" class="add-btn" @click="addcom_handle()">+添加</button>
</div>

计算属性和函数的区别

  • 看上去效果并没有什么区别
  • 但是计算属性是基于响应式依赖进行缓存的,只在相关响应式依赖发生改变时才会重新求值,如果依赖没有发生改变,多次访问计算属性就会立即返回之前的计算结果,不必再次执行函数。
  • 如果不希望有缓存,就用方法代替

9.上传功能实现

http://v1.iviewui.com/components/upload

  • 通过:before-upload来实现手动上传
  • 一般情况会在action里面直接写上传地址,通过接口上传文件和进行返回数据处理的话,一般有两种
  • 一种就是action=“”
  • 另一种就是:before-upload绑定的方法返回false就可以阻止默认上传流程,手动控制文件上传。
<Upload action="" :before-upload="preUpload"><el-image class="m-image-box" :src="base64Image" fit="scale-down"></el-image>
</Upload>
  • 上传前操作,可以判断文件类型、文件大小是否符合要求
preUpload (file) {
    const {
    size, name, type} = fileif (!['image/png', 'image/jpeg'].includes(type)) {
    this.$Message.error({
    closable: true,duration: 5,content: `上传的文件名 ${
      name} 格式错误!`})return false}if (size > 300 * 1024) {
    this.$Message.error({
    closable: true,duration: 5,content: `上传的文件名 ${
      name} 超过限制大小`})return false}this.uploadFile(file)return false
},
  • FileReader这个是原生的文件阅读器,在图片加载完成之后实现一个预览的效果
uploadFile (file) {
    const reader = new FileReader()const that = thisreader.readAsDataURL(file)reader.onload = function (e) {
    that.base64Image = this.resultthat.file = file}
},

10.关于请求的三种方式

request.class.js

  • reqData: 一般请求,请求参数为{ key: value }这种模式,而且value一般是字符串格式
    ‘Content-Type’: ‘application/x-www-form-urlencoded’
  • reqFormData:文件上传的时候就是使用这种模式
  • reqJson:复杂模式,value可以是object类型或者对象嵌套对象(后端处理json类型的参数增加@RequestBody)
    ‘Content-Type’: ‘application/json’

11.echarts的一些配置

  • 参考线markLine,import ‘echarts/lib/component/markLine’
  series: [{
    name: '趋势',type: 'line',data: [],smooth: true,markLine: {
    data: [{
    type: 'average', name: '平均值'}]}},{
    name: '模拟',type: 'line',data: [],smooth: true,markLine: {
    /* 以下设置一行后,平均线就没有开始和结束标记了(即看不见箭头了) */symbol: 'none',data: [{
    name: '平均线',// 支持 'average', 'min', 'max'type: 'average',lineStyle: {
    normal: {
    color: 'green',width: 2,type: 'solid'}}}]}}]
  • Y轴分割线隐藏splitLine, splitLine.show=false
  yAxis: {
    type: 'value',splitLine: {
    show: false}}
  • 区域缩放dataZoom
dataZoom: [{
    type: 'slider',show: true,xAxisIndex: [0],start: 20,end: 100}
],
  • 折线变曲线smooth,如上smooth: true
  • 虚线lineStyleseries-line.lineStyle.type = ‘dashed’
  • 折线图和柱状图切换magicType
import 'echarts/lib/component/toolbox'toolbox: {
    feature: {
    magicType: {
    type: ['line', 'bar']}}
},

12.升级项目中iview的版本

  • 4.4.0 -> 4.5.0
  • 执行命令npm install view-design --save
  • 这时候可能会报错找不到XXX文件,只需关闭vscode,重新打开,即可享受新版本的功能
  相关解决方案