简介
跟着大数据的蓬勃发展,各行业对数据价值的注重程度添加。大屏可视化也已经在各个企业中应用。本节介绍怎么从 0 到 1 完成一个简略大屏项目。
建立项目
- 快速建立项目,运用脚手架
create-react-app
创建。 - 建立项目,具体流程 根底-建立react项目教程。
npx create-react-app 项目名
- 进入项目根目录,添加可视化东西。
- DataV,提供了许多边框和一些大屏需求的组件。
npm i @jiaminghi/data-view-react
- echarts,图表制作东西,你能想到的它基本都有。
npm i echarts
- 一个简略的项目就建立完成了。这个示例项目中我把多余的文件都删除了。
大屏适配
- 大屏项目需求在不同分辨率下进行展现,所以在开发前就需求承认选用什么办法进行适配。
- 这儿首要介绍
3、4
两种办法,常用办法:
-
px
转vhvw
或%
比。
- 依据规划图的
px
尺度,把宽高分层100份。在开发时,一切的长度单位都按这份份额来编写。
- 媒体查询
@media
。
- 依据规划图,在不同分辨率下写出对应的款式。需求写大量的款式,定制化要求不多就不要考虑。
@media only screen and (max-width: 1000px) {
.div-class { width: 720px; }
}
@media only screen and (max-width: 1920px) {
.div-class { width: 1200px; }
}
-
px
转rem
。
-
CSS
中规定1rem
的大小便是根元素<html>
的font-size
的值。 - 当运用了其他组件,其内部设置的都是
px
。需求在添加一个依据font-size
的值核算当前份额下设置的长度转换为对应的px
值。 - 监听
onresize
办法,实时核算当前分辨率下font-size
的值。开发时全程运用rem
布局。
// 核算 fontSize
function setFontSize() {
let designWidth = 1920
let designHeight = 1080
var fontSize =
document.documentElement.clientWidth / document.documentElement.clientHeight
< designWidth / designHeight
? (document.documentElement.clientWidth / designWidth) * 100
: (document.documentElement.clientHeight / designHeight) * 100
document.querySelector('html').style.fontSize = fontSize + 'px'
}
// 防抖 在必定时间内 只执行最终一次
const debounce = (fn, delay) => {
let timer
return function () {
if (timer) {
clearTimeout(timer)
}
timer = setTimeout(() => {
fn()
}, delay)
}
}
.App {
height: 100vh;
width: 100vw;
font-size: 16px;
}
.box-x {
width: 4rem;
height: 2rem;
}
- 运用。
useEffect(() => {
setFontSize()
const cancalDebounce = debounce(setFontSize, 100)
// 监听
window.addEventListener('resize', cancalDebounce)
return () => {
// 移除
window.removeEventListener('resize', cancalDebounce)
}
}, [])
-
transform
特点的scale
办法。
- 核算缩放比,对整个元素进行缩放。
// 缩放比
function scale() {
let designWidth = 1920
let designHeight = 1080
let scale =
document.documentElement.clientWidth / document.documentElement.clientHeight
< designWidth / designHeight
? document.documentElement.clientWidth / designWidth
: document.documentElement.clientHeight / designHeight
return scale
}
.App {
width: 1920px;
height: 1080px;
transform-origin: 0 0;
position: absolute;
left: 50%;
top: 50%;
}
.box-x {
width: 400px;
height: 200px;
}
- 运用
const [state, setState] = useState({ scale: 1 })
useEffect(() => {
setState({
scale: scale()
})
window.onresize = function () {
setState({
scale: scale()
})
}
return () => {
// 铲除
window.onresize = null
}
}, [])
<div
className="App"
style={{
transform: `scale(${state.scale}) translate(-50%,-50%)`
}}
>...</div>
小结
适配计划除了本节介绍的还有有许多。现在没有完美的计划,或多或少都有一点问题。比如等比缩放,当份额不对时会呈现留白。百分比核算,当份额不对时会呈现拉伸。开发中都是依据客户需求进行一步步优化,以求达到完美。
布局
- 在拿到规划图后,通过规划图的布局来对页面进行层级划分,一般状况都是两层,布景层、图表层。当需求运用地图时,布景层就变成地图层。
- 在开发时,每个图表都应该是一个独自的组件。这样能削减代码的耦合和多人开发时的抵触。
- 这儿运用的是第4种适配计划,由于没有规划图就随意开发了。
- 运用等比缩放计划,一切布局按规划稿开发就行。
- 需求留意
CSS
命名需求必定规矩,避免不同组件中的款式抵触。
// App.js
import { useState, useEffect } from 'react'
import { scale } from './util'
import { Box1, Box2, Box3, Box4, Box5, Head } from './content'
import './App.css'
function App() {
const [state, setState] = useState({ scale: 1 })
useEffect(() => {
setState({
scale: scale()
})
window.onresize = function () {
setState({
scale: scale()
})
}
return () => {
// 铲除
window.onresize = null
}
}, [])
return (
<div
className="App"
style={{
transform: `scale(${state.scale}) translate(-50%,-50%)`
}}
>
<Head></Head>
<Box1 />
<Box2 />
<Box3 />
<Box4 />
<Box5 />
</div>
)
}
export default App
- 代码比较多,这儿就展现下目录。
- 图表层的内容,都是存放在
content
目录下的。
制作图表
- 可视化开发东西许多,挑选合适自己项目的就行了。
- 本节选用的是
echarts
图表库,先简略的介绍一下它。
运用echarts
- echarts 官网
- 可随意切换
Canvas、SVG
两种烘托办法。 - 企业中常用的图表都支持。
- 是高级图表库,通过装备信息制作图表。
- 能配合百度地图进行可视化开发。
// content/Box1/Box.jsx
import { useEffect } from 'react'
import { BorderBox1 } from '@jiaminghi/data-view-react'
import * as echarts from 'echarts'
import './box.css'
function Box() {
useEffect(() => {
const chartDom = document.getElementById('box1-main')
const myChart = echarts.init(chartDom)
const option = {
tooltip: {
trigger: 'item'
},
legend: {
top: '5%',
left: 'center',
textStyle: {
color: '#fff'
}
},
series: [
{
name: '职位',
type: 'pie',
radius: ['40%', '70%'],
avoidLabelOverlap: false,
itemStyle: {
borderRadius: 10,
borderColor: '#fff',
borderWidth: 2
},
label: {
show: false,
position: 'center',
textStyle: {
color: '#fff'
}
},
emphasis: {
label: {
show: true,
fontSize: '40',
fontWeight: 'bold'
}
},
labelLine: {
show: false
},
data: [
{ value: 1048, name: '后端' },
{ value: 735, name: '前端' },
{ value: 580, name: 'IOS' },
{ value: 484, name: '安卓' },
{ value: 300, name: '大数据' }
]
}
]
}
option && myChart.setOption(option)
}, [])
return (
<div className="box-1">
<BorderBox1>
<div id="box1-main" style={{ width: '590px', height: '500px' }}></div>
</BorderBox1>
</div>
)
}
export default Box
-
echarts
的运用就这么简略,装备好option
特点就会主动制作图表。 - 想深入了解的多去看看示例,echarts 示例。
- 在每一个组件中完善图表,一个简略的大屏可视化项目就完成了。
总结
大屏可视化项目最重要的是尺度适配,后续出问题多的都是适配没做好。当然做的时分也需求仔细,关注规划搞的色彩、尺度、图表款式等。一些小的差异在放大后也会影响美观。
- 代码地址
我正在参与技术社区创作者签约计划招募活动,点击链接报名投稿。