马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
利用的uniapp插件:l-echart
https://ext.dcloud.net.cn/plugin?id=4899
注意事项
1.因为小程序有主包分包大小限定,并且uni_modules中的包也会算在主包体积中,而我项目中的图表是在分包中利用的,所以我移动uni_modules中的l-echart图表组件到分包目次组件文件夹中
2.精简echarts.min.js体积,因为需求中只需要柱图和饼图,所以我去https://echarts.apache.org/zh/builder.html下载指定的 echarts 组件压缩包,然后替换l-echart中的echarts.min.js文件,只需要500kb左右大小
页面中的用法
- <template>
- <view class="charts-box">
- <l-echart ref="chart" @finished="init" class="charts-box"></l-echart>
- </view>
- </template>
- <script>
- import LEchart from "@/package-pc/pages/components/lime-echart/components/l-echart/l-echart.vue";
- import * as echarts from "@/package-pc/pages/components/lime-echart/static/echarts.min.js";
- import option from "@/package-pc/pages/monthreport/option";
- export default {
- components: {
- LEchart,
- },
- data() {
- return {
- option: option,
- };
- },
- // 使用组件的finished事件里调用
- methods: {
- async init() {
- const chart = await this.$refs.chart.init(echarts);
- chart.setOption(this.option);
- },
- },
- };
- </script>
- <style scoped>
- /* 请根据实际需求修改父元素尺寸,组件自动识别宽高 */
- .charts-box {
- width: 100%;
- height: 600px;
- }
- </style>
复制代码 第一次尝试,修改l-echart源码,简化组件用法(不推荐用法):
这样写有一个庞大问题,uniapp不支持props传递的对象里面属性有function,而echarts这样的属性很多,所以不推荐这样修改源码,这里只是记录一下我尝试封装的思途经程
1.组件中直接引入echarts.min.js
2.props增长option传参
3.watch中监听option传参
4.mounted中直接执行init方法初始化图表
5.init方法中调用setOption方法
6.加入uni.onWindowResize方法监听宽高变化,然后调用本来就实现的resize方法
- import * as echarts from "@/package-pc/pages/components/lime-echart/static/echarts.min.js";
- export default {
- name: "lime-echart",
- props: {
- ...
- option: {
- type: Object,
- },
- },
- watch: {
- option: {
- handler() {
- this.setOption(this.option);
- },
- deep: true,
- },
- },
- mounted() {
- this.$nextTick(() => {
- this.$emit("finished");
- this.init();
- });
- },
- methods:{
- ...
- async init(...args) {
- // #ifndef APP-NVUE
- // if (arguments && arguments.length < 1) {
- // console.error(
- // "缺少参数:init(echarts, theme?:string, opts?: object, callback?: function)"
- // );
- // return;
- // }
- // #endif
- ...
- this.chart = echarts.init(
- config.canvas,
- theme,
- Object.assign({}, config, opts)
- );
- this.chart.setOption(this.option ?? {});
- uni.onWindowResize(() => {
- this.resize();
- });
- ...
- },
- }
复制代码 修改后的页面用法
直接传参option给组件,哀求接口后修改option即可
- <template>
- <view class="charts-box">
- <l-echart :option="option1" class="charts-box"></l-echart>
- </view>
- </template>
- <script>
- import LEchart from "@/package-pc/pages/components/lime-echart/components/l-echart/l-echart.vue";
- import option from "@/package-pc/pages/monthreport/option";
- export default {
- components: {
- LEchart,
- },
- data() {
- return {
- option: option,
- };
- },
- // 修改option即可
- methods: {
- async setText() {
- this.option.title.text = "test"
- },
- },
- };
- </script>
- <style scoped>
- /* 请根据实际需求修改父元素尺寸,组件自动识别宽高 */
- .charts-box {
- width: 100%;
- height: 600px;
- }
- </style>
复制代码 第二次尝试,修改l-echart源码,简化组件用法(推荐用法):
做的工作实在就是把echarts放在组件里面利用了,页面中就不用导入了,同时组件内部做了init初始化图表,页面中setOption就行了
- import * as echarts from "@/package-pc/pages/components/lime-echart/static/echarts.min.js";
- export default {
- name: "lime-echart",
- mounted() {
- this.$nextTick(async () => {
- await this.init();
- this.$emit("finished");
- });
- },
- methods:{
- ...
- async init(...args) {
- // #ifndef APP-NVUE
- // if (arguments && arguments.length < 1) {
- // console.error(
- // "缺少参数:init(echarts, theme?:string, opts?: object, callback?: function)"
- // );
- // return;
- // }
- // #endif
- ...
- this.chart = echarts.init(
- config.canvas,
- theme,
- Object.assign({}, config, opts)
- );
- uni.onWindowResize(() => {
- this.resize();
- });
- ...
- },
- }
复制代码 修改后的页面用法
- <template>
- <view class="charts-box">
- <l-echart
- ref="chart"
- :option="option"
- @finished="init"
- class="charts-box"></l-echart>
- </view>
- </template>
- <script>
- import LEchart from "@/package-pc/pages/components/lime-echart/components/l-echart/l-echart.vue";
- import option from "@/package-pc/pages/monthreport/option";
- export default {
- components: {
- LEchart,
- },
- data() {
- return {
- option: option,
- };
- },
- // finished回调中设置option,接口请求图表数据也放在这里
- methods: {
- init() {
- this.$refs.chart.setOption(this.option);
- },
- },
- };
- </script>
- <style scoped>
- /* 请根据实际需求修改父元素尺寸,组件自动识别宽高 */
- .charts-box {
- width: 100%;
- height: 600px;
- }
- </style>
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |