{"id":13535748,"url":"https://github.com/SimonZhangITer/DataVisualization","last_synced_at":"2025-04-02T02:31:19.193Z","repository":{"id":41453095,"uuid":"78825356","full_name":"SimonZhangITer/DataVisualization","owner":"SimonZhangITer","description":":smiling_imp: by vue2.x with echarts3.3.2","archived":false,"fork":false,"pushed_at":"2020-09-16T07:44:07.000Z","size":6304,"stargazers_count":1732,"open_issues_count":3,"forks_count":507,"subscribers_count":93,"default_branch":"master","last_synced_at":"2025-04-01T07:45:40.348Z","etag":null,"topics":["echarts","vue","vue-router"],"latest_commit_sha":null,"homepage":"https://simonzhangiter.github.io/DataVisualization","language":"Vue","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/SimonZhangITer.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-01-13T07:17:34.000Z","updated_at":"2025-03-26T14:54:40.000Z","dependencies_parsed_at":"2022-09-06T03:51:41.653Z","dependency_job_id":null,"html_url":"https://github.com/SimonZhangITer/DataVisualization","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SimonZhangITer%2FDataVisualization","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SimonZhangITer%2FDataVisualization/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SimonZhangITer%2FDataVisualization/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SimonZhangITer%2FDataVisualization/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/SimonZhangITer","download_url":"https://codeload.github.com/SimonZhangITer/DataVisualization/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246743611,"owners_count":20826562,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["echarts","vue","vue-router"],"created_at":"2024-08-01T09:00:25.423Z","updated_at":"2025-04-02T02:31:19.161Z","avatar_url":"https://github.com/SimonZhangITer.png","language":"Vue","readme":"# 数据可视化\n\n\u003e 将数据通过图表的形式展现出来将大大的提升可读性和阅读效率\n\n\u003e 本例包含柱状图、折线图、散点图、热力图、复杂柱状图、预览面板等\n\n后续会有新的版本，欢迎大家关注 \n\n# 技术栈\n\n- vue2.x\n- vuex _存储公共变量，如色值等_\n- vue-router _路由_\n- element-ui _饿了么基于vue2开发组件库，本例使用了其中的datePicker_\n- [Apache ECharts (incubating)](https://github.com/apache/incubator-echarts) _一款丰富的图表库_\n- webpack、ES6、Babel、Stylus...\n\n# 演示\n\n\u003cdiv align=center style=\"margin-top:30px\"\u003e此项目为PC端数据可视化，请在电脑端查看\u003c/div\u003e\n\u003cdiv align=center\u003e\u003ca href=\"https://simonzhangiter.github.io/DataVisualization\" target=_blank\u003e在线演示戳我\u003c/a\u003e\u003c/div\u003e\n\n# 项目截图\n\n\u003cdiv align=center\u003e\u003cimg src=\"https://github.com/SimonZhangITer/DataVisualization/blob/master/static/img/demo.jpg?raw=true\"\u003e\u003c/div\u003e\n\n# 开发\n\n## 组件化\n\n本项目完全采用组件化的思想进行开发。使用vue-router作为路由，每个页面都是一个组件，每个组件里又包含多个组件。可以看到，多种图表的标题和日期筛选等都是类似的格式，所以这两个都分别做成了组件。\n\n除此之外，在筛选产品的时候用到的checkbox也被我写成了组件，有需要的朋友也可以剥离出去单独使用（不过写的比较粗糙~）\n\n每个图表都是一个单独的组件，也可以单独的剥离出去使用。\n\n## 柱状图\n\n本项目包含多种图表，这里挑“柱状图”说一说，其他的图标实现方式类似。\n\n```html\n\u003ctemplate\u003e\n\u003cdiv class=\"multipleColumn\"\u003e\n  \u003cv-header :name=\"name\" :legendArr=\"legendArr\" :myChart=\"myChart\"\u003e\u003c/v-header\u003e\n  \u003cv-filter :myChart=\"myChart\" v-if=\"myChart._dom\"\u003e\u003c/v-filter\u003e\n  \u003cdiv class=\"main\"\u003e\u003c/div\u003e\n\u003c/div\u003e\n\u003c/template\u003e\n```\n页面HTML可以看到，一个完整的图标是由三个部分组成：\n\n\n\n### v-header\n头组件，存放标题以及不同类型的筛选等\n\n- name _图表的标题_\n- legendArr _图表所包含的多种类型_\n- myChart _当前图表对象_\n\n### v-filter\n\n筛选组件，日期的筛选以及不同产品的筛选\n\n- myChart _当前图表对象_\n\nv-if=\"myChart._dom\"表示在当前图表dom元素渲染完成之后再渲染filter组件\n\n### main\n\n_图表的主体文件_\n\n需要注意的是：\u003cfont color=red\u003emain必须要指定宽高，否则echarts无法渲染dom\u003c/font\u003e\n\n### 初始化\n\n初始化需要在vue的mounted()方法里执行，因为这里能保证当前的页面元素都已经被加载完成。\n\n```javascript\nmounted() {\n  // 基于准备好的dom，初始化echarts实例\n  this.myChart = echarts.init(document.querySelector('.multipleColumn .main'))\n  this.myChart.setOption(this.options) //this.options为echarts的配置，详情可去我的gitHub查看\n}\n```\n\n如果要在created()方法里执行，则需要另外加上\n\n```javascript\nthis.$nextTick(() =\u003e {\n  this._init()\n})\n```\n\n## DashBoard\n\ndashboard是一个所有图表的预览，并且有一个点击切换的动画效果，这里大概讲解一个实现方式。\n\n### html\n\n```html\n\u003ctemplate lang=\"html\"\u003e\n  \u003cdiv class=\"dashboard\"\u003e\n    \u003cdiv class=\"flex-container column\"\u003e\n        \u003cdiv class=\"item one\" @click=\"clickChart('1')\" style=\"transform: translate(-22.4%,-33.5%) scale(0.33)\"\u003e\n          \u003cmultipleColumn\u003e\u003c/multipleColumn\u003e\n        \u003c/div\u003e\n        \u003cdiv class=\"item two\" @click=\"clickChart('2')\" style=\"transform: translate(-22.4%,0.5%) scale(0.33)\"\u003e\n          \u003ccolumn\u003e\u003c/column\u003e\n        \u003c/div\u003e\n        \u003cdiv class=\"item three\" @click=\"clickChart('3')\" style=\"transform: translate(-22.4%,34.5%) scale(0.33)\"\u003e\n          \u003cv-line\u003e\u003c/v-line\u003e\n        \u003c/div\u003e\n        \u003cdiv class=\"item four active\" @click=\"clickChart('4')\" style=\"transform: translate(43.7%, 0) scale(1)\"\u003e\n          \u003cpoint\u003e\u003c/point\u003e\n        \u003c/div\u003e\n    \u003c/div\u003e\n  \u003c/div\u003e\n\u003c/template\u003e\n```\n可以看到，这里是设置了四张图表的Wrapper，每个Wrapper里面装一个图表组件。通过动态的改变style样式来切换。\n\n整体的思想为：\n\n- 使用百分比布局，这样才能在不能大小的屏幕做到自适应\n- 确定图表显示比例，长宽比\n- 只做一个transform变换，这样才能提高性能\n\n### 性能\n\n关于性能方面，这里多说一句：\n\n相信大家都看过在线演示的demo了，不同图表间的切换不仅有位置的变换，还有大小的变换。那么大小的变换大家都知道是用transform的scale变换，但是位置的变换呢，使用left、top？\n\n很显然这样是不对的，但是这样确实也能实现效果，但是会非常的消耗性能。一个CSS属性的变化就相当于一个线程，那么如果使用了left、top以及transform的话就是三个线程同时开启，那你的电脑温度将会很快飙升的\n\n正确的解决方案还是继续使用transform，使用它的\u003cfont color=red\u003e translate \u003c/font\u003e，如：\n\n```css\ntransform: translate(-22.4%,0) scale(0.33)\n```\n\n# 结语\n\n这个项目还是挺实用的一个项目，较好的运用了vue的组件化思想。\n\n大家感兴趣的可以去看看代码，希望对大家有帮助。\n\n\n## Build Setup\n\n``` bash\n# install dependencies\nnpm install\n\n# serve with hot reload at localhost:8080\nnpm run dev\n\n# build for production with minification\nnpm run build\n```\n## 交流\n\n欢迎热爱学习、忠于分享的胖友一起来交流\n\n- QQ：745913574\n\n- QQ群：149683643\n\n- WeChat\n\n\u003cimg src=\"https://p0.meituan.net/dpgroup/749d8a79cd0a9bbc4e25b2f474a398d91256770.png?\" width=\"25%\"\u003e\n\n\n## Donation\n\nIf you find this project useful, you can buy me a cup of coffee\n\n\u003cimg width=\"650\" src=\"https://static.oschina.net/uploads/space/2017/0223/201225_oQrz_2493500.jpeg\" alt=\"\"\u003e\n","funding_links":[],"categories":["UI组件","Vue"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FSimonZhangITer%2FDataVisualization","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FSimonZhangITer%2FDataVisualization","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FSimonZhangITer%2FDataVisualization/lists"}