07react+echart,大屏代码开发

news2025/5/15 2:07:20

react框架引入第三方插件

原链接gitHub:GitHub - hustcc/echarts-for-react: ⛳ Apache ECharts components for React wrapper. 一个简单的 Apache echarts 的 React 封装。

import ReactECharts from 'echarts-for-react';
import * as echarts from 'echarts';

一、软件简介

echarts-for-react 是一个简单的 echarts (v3.0) 的 react 封装。

  • 安装:

npm install echarts-for-react
  • 运行demo:

git clone git@github.com:hustcc/echarts-for-react.git

npm install

npm start

  • 案例:

import ReactEcharts from 'echarts-for-react';
import echarts from 'echarts';
<ReactEcharts
option={this.getOption()}
notMerge={true}
lazyUpdate={true}
onEvents={onEvents}
style={{width: '100%',height:'100%'}}
/>

二、使用步骤

  1. 下载

npm install --save echarts-for-react
  1. 引入

import ReactEcharts for 'echarts-for-react'
  1. 代码在render或return使用

<ReactEcharts 参数/>
  1. 参数

  • option:图表配置项,必填。

  • notMerge:默认false,合并。是否不跟之前设置的option合并。

  • lazyUpdata:默认false,立即更新。在option设置后,是否不立即更新。

  • style:默认{height:'300px'}。

  • className:DOM元素的style。

  • theme:在使用前需要注册。echarts.registerTheme('属性名',属性值)。

  • onChartReady:当图表渲染完成,将会调用的方法。

  • loadingOption:加载动画的配置项。

  • showLoading:默认false,显示加载动画效果。

  • onEvents:绑定echarts事件,即通过echarts事件对象回调。

  • opts:ecahrt事件,通过ecahrts附加参数,将在echarts实例的初始化时被调用。

  • autoResize:默认true,当window resize决定是否去触发 this.resize。

  1. API

ReactEcharts组件只有一个API。‘getEchartsInstance’此方法可获取echarts实例对象,从而调用echarts实例的所有API。

echart的一些参数options

官方文档:Documentation - Apache ECharts

一、概述

  • title:标题。

  • color:颜色配置。

  • tooltip:提示框配置。

  • toolBox:工具箱组件。

  • grid:调整图的位置,控制图标的大小。

  • xAxis:x轴配置。

  • yAxis:y轴配置。

  • legend:图例配置。

  • series:图表配置。

二、详细讲解

1.title:图表的title。

title标题的属性

2.tooltip:提示框配置

tooltip提示框的属性

3.grid:调整图的位置,控制图标的大小。

grid调整图的位置

4.xAxis:x轴配置。

5.yAxis:y轴配置。

x/y轴的参数

6.legend:图例配置。

legend图例配置

7.series:图表配置。

series图表的参数

三、常用的一些参数options

1.举例

    //1.标题
    title : {
        show:true, //显示策略,默认值true,可选为:true(显示) | false(隐藏)
        text: '主标题', //主标题文本,'\n'指定换行
        link:'', //主标题文本超链接,默认值true
        target: null, //指定窗口打开主标题超链接,支持'self' | 'blank',不指定等同为'blank'(新窗口)
        subtext: '副标题', //副标题文本,'\n'指定换行
        sublink: '', //副标题文本超链接
        subtarget: null, //指定窗口打开副标题超链接,支持'self' | 'blank',不指定等同为'blank'(新窗口)
        x:'center' //水平安放位置,默认为'left',可选为:'center' | 'left' | 'right' | {number}(x坐标,单位px)
        y: 'top', //垂直安放位置,默认为top,可选为:'top' | 'bottom' | 'center' | {number}(y坐标,单位px)
        textAlign: null ,//水平对齐方式,默认根据x设置自动调整,可选为: left' | 'right' | 'center
        backgroundColor: 'rgba(0,0,0,0)', //标题背景颜色,默认'rgba(0,0,0,0)'透明
        borderColor: '#ccc', //标题边框颜色,默认'#ccc'
        borderWidth: 0, //标题边框线宽,单位px,默认为0(无边框)
        padding: 5, //标题内边距,单位px,默认各方向内边距为5,接受数组分别设定上右下左边距
        itemGap: 10, //主副标题纵向间隔,单位px,默认为10
        textStyle: { //主标题文本样式{"fontSize": 18,"fontWeight": "bolder","color": "#333"}
            fontFamily: 'Arial, Verdana, sans...',
            fontSize: 12,
            fontStyle: 'normal',
            fontWeight: 'normal',
        },
        subtextStyle: {//副标题文本样式{"color": "#aaa"}
            fontFamily: 'Arial, Verdana, sans...',
            fontSize: 12,
            fontStyle: 'normal',
            fontWeight: 'normal',
        },
        zlevel: 0, //一级层叠控制。默认0,每一个不同的zlevel将产生一个独立的canvas,相同zlevel的组件或图标将在同一个canvas上渲染。zlevel越高越靠顶层,canvas对象增多会消耗更多的内存和性能,并不建议设置过多的zlevel,大部分情况可以通过二级层叠控制z实现层叠控制。
        z: 6, //二级层叠控制,默认6,同一个canvas(相同zlevel)上z越高约靠顶层。
    },
    //2.提示框,鼠标悬浮交互时的信息提示
    tooltip : {
        trigger: 'item',
        formatter: "{a} <br/>{b} : {c} ({d}%)"
    },
    //3.图例,每个图表最多仅有一个图例
    legend: {
        orient: 'vertical',
        left: 'left',
        data: ['第一部分','第二部分','第三部分','第四部分']
    },
    // 4.图表,每个系列通过 type 决定自己的图表类型
    series : [
        {
            name: '访问',
            type: 'pie',
            radius : '62%',
            center: ['50%', '65%'],/
            minAngle:'15',
            data:[
                {name:"第一部分",value:4},
                {name:"第二部分",value:7},
                {name:"第三部分",value:3},
                {name:"第四部分",value:1},
            ],
            itemStyle: {
                normal:{
                    label:{
                        show:true,
                        formatter: "{b} :\n  {c} \n ({d}%)",
                        position:"inner"
                    }
                }
            }
        }
    ],
};

2.tooltip图表摸上去的工具提示框的formatter的a/b/c/d的代表的含义不一样

大屏的一些配置

一、背景概述

农业项目的首页要展示一些可视化数据,会考虑放置场景,例如大屏、电脑、笔记本等。考虑适配、以及大屏显示效果。

二、实现思路:布局考虑flex+rem,左右侧占比考虑使用百分数。

宽高可使用vw/vh,但是需要设置最小宽高度,以免小屏压缩排班错位。

字体尺寸使用rem。

Echarts图标尺寸使用echartsSize转换。

三、实现步骤

(一)、概述

  1. px转换rem,使用转换插件flexible.js。

  1. 安装px2rem-loader
npm install px2rem-loader --save-dev

  1. 配置px2rem-loader

  1. 其它注意事项。
注意说明:
1、有关px的样式不能写内联样式(style),只能写class
2、最外层图层宽高可使用100vw,100vh。内部模块视情况而定(可采用百分比或者px),建议高度使用vh。
3、自适应屏幕的前提需要保证最终大屏尺寸完整适配,在兼容其他设备屏幕适配。
4、文字的大小,图片的大小不能默认适配,必须设置宽高尺寸,文字尺寸,不然无法转换rem。切换大屏尺寸大小不会改变。

(二)、详细解释

  1. flexible.js文件 和 安装的插件一样吗?
(function(win, lib) {
  let doc = win.document
  let docEl = doc.documentElement
  let metaEl = doc.querySelector('meta[name="viewport"]')
  let flexibleEl = doc.querySelector('meta[name="flexible"]')
  let dpr = 0
  let scale = 0
  let tid
  let flexible = lib.flexible || (lib.flexible = {})

  if (metaEl) {
    console.warn('将根据已有的meta标签来设置缩放比例')
    let match = metaEl.getAttribute('content').match(/initial\-scale=([\d\.]+)/)
    if (match) {
      scale = parseFloat(match[1])
      dpr = parseInt(1 / scale)
    }
  } else if (flexibleEl) {
    let content = flexibleEl.getAttribute('content')
    if (content) {
      let initialDpr = content.match(/initial\-dpr=([\d\.]+)/)
      let maximumDpr = content.match(/maximum\-dpr=([\d\.]+)/)
      if (initialDpr) {
        dpr = parseFloat(initialDpr[1])
        scale = parseFloat((1 / dpr).toFixed(2))
      }
      if (maximumDpr) {
        dpr = parseFloat(maximumDpr[1])
        scale = parseFloat((1 / dpr).toFixed(2))
      }
    }
  }

  if (!dpr && !scale) {
    let isAndroid = win.navigator.appVersion.match(/android/gi)
    let isIPhone = win.navigator.appVersion.match(/iphone/gi)
    let devicePixelRatio = win.devicePixelRatio
    if (isIPhone) {
      // iOS下,对于2和3的屏,用2倍的方案,其余的用1倍方案
      if (devicePixelRatio >= 3 && (!dpr || dpr >= 3)) {
        dpr = 3
      } else if (devicePixelRatio >= 2 && (!dpr || dpr >= 2)) {
        dpr = 2
      } else {
        dpr = 1
      }
    } else {
      // 其他设备下,仍旧使用1倍的方案
      dpr = 1
    }
    scale = 1 / dpr
  }

  docEl.setAttribute('data-dpr', dpr)
  if (!metaEl) {
    metaEl = doc.createElement('meta')
    metaEl.setAttribute('name', 'viewport')
    metaEl.setAttribute('content', 'initial-scale=' + scale + ', maximum-scale=' + scale + ', minimum-scale=' + scale + ', user-scalable=no')
    if (docEl.firstElementChild) {
      docEl.firstElementChild.appendChild(metaEl)
    } else {
      let wrap = doc.createElement('div')
      wrap.appendChild(metaEl)
      doc.write(wrap.innerHTML)
    }
  }

  function refreshRem() {
    let width = docEl.getBoundingClientRect().width
    if (width / dpr > 540) {
      width = width * dpr
    }
    let rem = width / 10
    docEl.style.fontSize = rem + 'px'
    flexible.rem = win.rem = rem
  }

  win.addEventListener('resize', function() {
    clearTimeout(tid)
    tid = setTimeout(refreshRem, 300)
  }, false)
  win.addEventListener('pageshow', function(e) {
    if (e.persisted) {
      clearTimeout(tid)
      tid = setTimeout(refreshRem, 300)
    }
  }, false)

  if (doc.readyState === 'complete') {
    doc.body.style.fontSize = 12 * dpr + 'px'
  } else {
    doc.addEventListener('DOMContentLoaded', function(e) {
      doc.body.style.fontSize = 12 * dpr + 'px'
    }, false)
  }


  refreshRem()

  flexible.dpr = win.dpr = dpr
  flexible.refreshRem = refreshRem
  flexible.rem2px = function(d) {
    let val = parseFloat(d) * this.rem
    if (typeof d === 'string' && d.match(/rem$/)) {
      val += 'px'
    }
    return val
  }
  flexible.px2rem = function(d) {
    let val = parseFloat(d) / this.rem
    if (typeof d === 'string' && d.match(/px$/)) {
      val += 'rem'
    }
    return val
  }

})(window, window['lib'] || (window['lib'] = {}))
2.在根目录新建config-override.js文件

代码配置flexible的文件:

/**
 * 一、配置flexible文件
 *   由于react未暴露webpack文件。有两种方法
 *   1. 通过npm run eject命令可以将隐藏的wabpack文件暴露出来,但此方法不可逆
 *   2. 通过 react-app-rewired 插件来覆盖配置文件
 * 二、在根目录新建config-override.js文件
 */
const { override, addPostcssPlugins } = require('customize-cra');
const path = require('path'); //配置别名
module.exports = override(
  /**
   * 对大屏的插件进行配置1,可选
   */
  addPostcssPlugins([
    require('postcss-px2rem-exclude'),
    {
      remUnit: 75, //设计图大小
      remPrecision: 2, //只转换到两位小数
      exclude: /node_modules/i, //插件不需要转rem
    },
  ]),
  /**
   * 对大屏的插件进行配置2,可选
   */
  require('@njleonzhang/postcss-px-to-rem')({
    unitToConvert: 'px',
    viewportwidth: 1920, //视口的宽度。
    unitPrecision: 3, //允许REN单位增长到的十进制数。
    selecterBlackList: ['.ignore', '.hairines'], //(数组)要忽略的选择器的一个minPixelValue:1,//(数字)设置要替换的最小像素值。
    mediaQuery: false, // 允许在媒体查询中转换px。
  }),

  /**
   * React + typescript 配置别名
   * 1.在`config-overrides.js`中配置
   * 2.创建`tsconfig.extend.json`文件
   * 3.配置`tsconfig.json`
   */
  addWebpackAlias({
    '@': path.resolve(__dirname, './src'),
    '@components': path.resolve(__dirname, './src/components'),
    '@pages': path.resolve(__dirname, './src/pages'),
    '@utils': path.resolve(__dirname, './src/utils'),
    '@assets': path.resolve(__dirname, './src/assets'),
    '@app': path.resolve(__dirname, './src/app'),
  }),
);

二、Echarts适配方案实现思路:

(一)、实现思路

1、画布的大小可设置百分比,让画布随着父视图改变,也可设置px。

2、Echarts 文字大小,布局位置可按函数(echartsSize)转换。

(二)、实现步骤(Vue框架)

/* Echarts图表字体、间距自适应  */
// 以设计稿1920为例
export const echartsSize = (size, defalteWidth = 1920) => {
  let clientWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth
  if (!clientWidth) return size
  let scale = (clientWidth / defalteWidth)
  return Number((size * scale).toFixed(3))
}
// 将其挂载到原型链上,方便全局可使用
Vue.prototype.echartsSize = echartsSize

(三)、使用举例

使用说明案列:

fontSize: this.echartsSize(12),

radius: [this.echartsSize(30), this.echartsSize(140)],

二、媒体查询px转vh vw

(一)、实现思路

使用@mixin @include

(二)、实现代码:

$defalteWidth: 1920;  // 设计尺寸
$defalteHeight: 1080;
$widthScale: 100/$defalteWidth;
$heightScale: 100/$defalteHeight;
@mixin height($radius) {
    height:($radius*heightScale)*1vh;
  }
  @mixin line-height($radius) {
    // line-height: $radius;
    line-height:($radius*heightScale)*1vh;
  }
  @mixin width($radius) {
    // width: $radius;
    width:($radius*defalteWidth)*1vw;
  }
  @mixin p-l($radius) {
    // padding-left: $radius;
    padding-left:($radius*defalteWidth)*1vw;
  }
  @mixin p-r($radius) {
    // padding-right: $radius;
    padding-right:($radius*defalteWidth)*1vw;
  }
  @mixin p-t($radius) {
    // padding-top: $radius;
    padding-top:($radius*defalteWidth)*1vh;
  }
  @mixin p-b($radius) {
    // padding-bottom: $radius;
    padding-bottom:($radius*defalteWidth)*1vh;
  }
  @mixin m-l($radius) {
    // margin-left: $radius;
     margin-left:($radius*defalteWidth)*1vw;
  }
  @mixin m-r($radius) {
    // margin-right: $radius;
    margin-right:($radius*defalteWidth)*1vw;
  }
  @mixin m-t($radius) {
    // margin-top: $radius;
    margin-top:($radius*defalteWidth)*1vh;
  }
  @mixin m-b($radius) {
    // margin-bottom: $radius;
    margin-bottom:($radius*defalteWidth)*1vh;
  }
  @mixin top($radius) {
    // margin-bottom: $radius;
    top:($radius*defalteWidth)*1vh;
  }
  @mixin bottom($radius) {
    // margin-bottom: $radius;
    bottom:($radius*defalteWidth)*1vh;
  }
  @mixin right($radius) {
    // margin-bottom: $radius;
    right:($radius*defalteWidth)*1vh;
  }
  @mixin left($radius) {
    // margin-bottom: $radius;
    left:($radius*defalteWidth)*1vh;
  }
 // 自行添加需要的属性

(三)、实现案例

@include height(240px);

(四)、使用建议

宽高可使用vw/vh,但是需要设置最小宽高度,以免小屏压缩排班错位

字体尺寸使用rem

Echarts图标尺寸使用echartsSize转换

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/391771.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微机原理和计算机组成原理复习

1&#xff1a;冯诺依曼机器的主要特点&#xff1f; 1&#xff09;计算机由运算器、存储器、控制器、输入设备和输出设备五大部分组成&#xff1b; 2&#xff09;指令和数据存储在存储器中&#xff0c;并可以按地址访问&#xff1b; 3&#xff09;指令和数据均以二进制表示&…

2023年软考中级信息安全工程师考什么?

信息安全工程师是属于软考中级科目&#xff0c;含金量很高的&#xff0c;信息安全工程师在社会上的需求是蛮大的。 信息安全工程师主要涉及计算机信息安全方面&#xff0c;在计算机软硬件、网络、应用相关领域从事安全系统设计、安全产品开发、产品集成、信息系统安全检测与审计…

小程序容器作为软件中间件技术不可忽视的价值

随着移动互联网的不断发展&#xff0c;越来越多的应用程序被广泛应用于各种行业和领域中。然而&#xff0c;不同的平台和设备之间的差异性和复杂性&#xff0c;给应用程序的开发和部署带来了很大的挑战。这时&#xff0c;小程序容器作为软件中间件技术的其中一环&#xff0c;成…

格密码学习笔记(三):闵可夫斯基第一定理

文章目录NNN维超球体体积结论闵可夫斯基凸体定理闵可夫斯基第一定理闵可夫斯基第二定理致谢NNN维超球体体积结论 在nnn维空间中&#xff0c;对半径为rrr的超球体&#xff08;Ball&#xff09;&#xff0c;有vol(B(0,r))≥(2rn)n\mathrm{vol}(\mathcal{B}(0, r)) \geq \left( \…

java基础:浅聊实例化和初始化

其实如果了解python的化&#xff0c;其在生成一个实例对象的时候会调用两个系统方法__new__ 和__init__。 这个可以通过看生成的class文件看到&#xff0c;比如创建一个test.java&#xff0c;然后通过jclasslib这个软件查看class文件&#xff0c;当然ide也可以安装这个软件的插…

ggplot2的组图拓展包(1):patchwork(上篇)

专注系列化、高质量的R语言教程推文索引 | 联系小编 | 付费合集patchwork是ggplot绘图系统的拓展包&#xff0c;主要功能是将多个ggplot格式的图形组合成一幅大图&#xff0c;即组图。patchwork工具包十分好用&#xff0c;它主要利用几个类似四则运算符号的操作符进行组图&…

Python——函数(重点内容)

函数 函数是组织好的&#xff0c;可重复使用的&#xff0c;用来实现单一&#xff0c;或相关联功能的代码段。 函数能提高应用的模块性&#xff0c;和代码的重复利用率。你已经知道Python提供了许多内建函数&#xff0c;比如print()。但你也可以自己创建函数&#xff0c;这被叫…

Linux 常用软件安装(jdk,redis,mysql,minio,kkFileView)

1.jdk安装 查询所有跟Java相关的安装的rpm包 rpm -qa | grep java卸载所有跟openjdk相关的包&#xff1a; 执行命令。删除以上除了noarch 结尾的所有文件 rpm -e --nodeps java-1.8.0-openjdk-1.8.0.252.b09-2.el8_1.x86_64 rpm -e --nodeps java-1.8.0-openjdk-headless-1.8.0…

钉钉端H5开发调试怎么搞

H5开发本地调试教程 作为一名前端开发,大家平时工作中或多或少都有接触或需要开发H5页面的场景,在开发过程中,如何像PC端页面一样有有丝滑的体验呢? 不同的情况需要在不同的端调试更方便有效: 1. 在画UI的时候,更适合在PC端调试,更改代码或者直接在浏览器调试,都是实…

LeetCode链表(单链表,双链表,反转链表)

文章目录前言1.链表定义2.链表操作3.技巧链表常见操作1.lc203 移除链表元素2.lc2 两数相加3.lc328 奇偶链表反转链表1.lc206 反转链表2.lc92 反转链表II链表双指针1.lc19 删除链表的倒数第 N 个结点2.lc21 合并两个有序链表3.lc24 两两交换链表中的节点4.lc234 回文链表前言 本…

Vue3倒计时组件(Countdown)

可自定义设置以下属性&#xff1a; 倒计时数值&#xff08;countdown&#xff09;&#xff0c;单位s&#xff0c;必传倒计时标题&#xff08;title&#xff09;&#xff0c;默认Countdown&#xff0c;string | v-slot格式化倒计时展示&#xff08;format&#xff09;&#xff…

“操作无法完成,因为其中的文件或文件夹一再另一程序打开”解决方法

windows系统中&#xff0c;有时时候我们想要修改某个文件&#xff0c;就出现出现如下提示&#xff1a;操作无法完成&#xff0c;因为其中的文件或文件夹已在另一程序打开请关闭该文件或文件夹&#xff0c;然后重试出现这个上面提示的原因是&#xff0c;我们要修改的文件或文件夹…

网络基础(1)

目录1. 网络1.1 网络是什么1.2 网络在哪里2. 协议3. TCP/IP五层(或四层)模型3.1 分层细节3.2 报头3.2.1 封装与解包4. 数据传输4.1 局域网4.2 IP地址与Mac地址1. 网络 1.1 网络是什么 网络本质是一个软件&#xff0c;软件是可以进行分层的。例如STL库&#xff0c;实际上分为了…

文件包含漏洞1 | iwebsec

文章目录00-文件包含漏洞原理环境01-本地文件包含读取敏感文件信息配合文件上传getshell配合日志文件getshell配合SSH日志配合运行环境00-文件包含漏洞原理 为什么要文件包含&#xff1f; 为什么会有文件包含漏洞? 因为将被包含的文件设置为变量&#xff0c;用来进行动态调用…

169_技巧_Power BI 依据促销日历计算销售金额

169_技巧_Power BI 依据促销日历计算销售金额 一、背景 在各位表格表姐们计算销售金额的时候&#xff0c;有一个绕不开的问题&#xff1a;商品有促销的问题&#xff0c;需要使用对应的促销价来计算销售额。 按照惯例还是先来看看结果 Power BI 公共 web 效果&#xff1a;htt…

使用docker进行Mongoyapi安装,Mongo重启yapi重启

在这里我使用Linux虚拟机作为docker服务器&#xff0c;本机通过xshell进行远程操作。 Mongo安装&#xff1a;docker run -d --name mongo-yapi mongo; yapi安装&#xff1a;1&#xff09;拉取yapi docker pull registry.cn-hangzhou.aliyuncs.com/anoy/yapi 2&#xff09;初…

2023款欧拉好猫上市,12.98万起

上周&#xff0c;2023款欧拉好猫焕新上市。2023款好猫共推出5个车型&#xff1a; •401km标续航&#xff0c;舒享型/豪华型/尊贵型&#xff0c;分别是12.98/13.98/14.98万元&#xff1b; •501km长续航&#xff0c;豪华型/尊贵型&#xff0c;分别是15.58/16.58万元&#xff1b;…

00后整顿职场,当摸鱼测试员遇上了内卷00后。

在程序员职场上&#xff0c;什么样的人最让人反感呢? 是技术不好的人吗?并不是。技术不好的同事&#xff0c;我们可以帮他。 是技术太强的人吗?也不是。技术很强的同事&#xff0c;可遇不可求&#xff0c;向他学习还来不及呢。 真正让人反感的&#xff0c;是技术平平&…

【PaddleOCR-kie】一、关键信息抽取:使用VI-LayoutXLM模型推理预测(SER+RE)

背景&#xff1a;在训练自己数据集进行kie之前&#xff0c;想跑一下md里面的例程&#xff0c;但md教程内容混乱&#xff0c;而且同一个内容有多个手册&#xff0c;毕竟是多人合作的项目&#xff0c;可能是为了工程解耦&#xff0c;方便更新考虑……需要运行的模型和运行步骤散落…

没有钱怎么创业?一分钱没有如何能创业成功?

限制人创业成功的从来都不是资金&#xff0c;而是能力&#xff0c;这个道理很多人都可能不懂&#xff0c;多数人习惯了庸庸碌碌、日复一日地打工行为&#xff0c;却不知如何创业&#xff0c;那么&#xff0c;没有钱怎么创业&#xff1f;一分钱没有如何能创业成功呢&#xff1f;…