uniapp通过renderjs对echarts 的使用记录

1.下载echarts.js放到static目录

npm i echarts@3.6.2 --save // 使用版本一定要注意,这里3.6.2是测试过没问题的版本,高版本点击事件会报错

然后将js文件放到对应目录

2.创建组件,这里直接贴代码,map.vue:

<template>
    <view id="map-chart" @tap="echarts.onClick" :propData="propData" :change:propData="echarts.changePropData"
        :mapOption="mapOption" :change:mapOption="echarts.changeMapOption" style="height: 100%;width: 100%;"></view>
</template>

<script>
    export default {
        props: {
            propData: {
                type: Object,
                default: () => ({
                    areaName: 'china',
                    scatterDara: []
                })
            }, 
            mapOption: {
                type: Object,
                default: () => ({})
            }
        },
        data() {
            return {}
        },
        methods: {
            onViewClick(name) {
                this.$emit('chartClick', name)
            }
        }
    }
</script>

<script module="echarts" lang="renderjs">
    import {
        provinceNameList,
        baseOption,
        provinceNameObj
    } from '@/config/js/mapConfig.js'
    export default {
        data() {
            return {
                myChart: null,
                ownerInstance: null,
                echartsInstance: null,
                option: {},
                propChangeTimer: null
            }
        },
        mounted() {
            this.initEcharts()
            window.addEventListener('resize', this.resize)
        },
        methods: {
            initEcharts() {
                const {
                    areaName,
                    scatterDara
                } = this.propData
                // 动态引入类库
                const script = document.createElement('script')
                script.src = 'static/js/echarts.js'
                script.onload = () => {
                    this.initMap(areaName, scatterDara)
                    this.echartsInstance = echarts
                }
                document.head.appendChild(script)
            },
            initMap(areaStr = 'china', scatterDara = []) {
                if (!this.echartsInstance) {
                    return
                }
                if (this.myChart) {
                    this.myChart.dispose()
                }
                const filePathName = provinceNameObj[areaStr]
                const areaJson = require(`@/config/mapJson/${filePathName}.json`)
                this.echartsInstance.registerMap(areaStr, areaJson)
                this.myChart = this.echartsInstance.init(document.getElementById('map-chart'))
                const { zoom, layoutCenterTwo } = this.mapOption
                this.option = baseOption({
                    areaStr,
                    scatterDara,
                    zoom,
                    layoutCenterTwo
                })
                this.myChart.setOption(this.option)
                this.myChart.on('click', params => {
                    if (provinceNameList.includes(params.name)) {
                        setTimeout(() => {
                            this.ownerInstance.callMethod('onViewClick', params.name)
                        }, 200)
                    }
                })
            },
            resize() {
                this.myChart.resize()
            },
            onClick(event, ownerInstance) {
                this.ownerInstance = ownerInstance;
            },
            changePropData(val) {
                const {
                    areaName,
                    scatterDara
                } = val
                if (this.propChangeTimer) {
                    clearTimeout(this.propChangeTimer)
                    this.propChangeTimer = null
                }
                this.propChangeTimer = setTimeout(() => {
                    this.initMap(areaName, scatterDara)
                }, 300)
            },
            changeMapOption() {}
        }
    }
</script>

3.注意点

1)第一个注意点,因为这里使用的renderjs,所以数据监听这里会有所不用。

 <view id="map-chart" @tap="echarts.onClick" :propData="propData" :change:propData="echarts.changePropData"
        :mapOption="mapOption" :change:mapOption="echarts.changeMapOption" style="height: 100%;width: 100%;"></view>

注意我标红的代码,首先propData一定是定义在非renderjs的script里面:

 

然后事件必须监听变化数据,将需要的操作放到监听事件里面,上文中的changePropData事件,这个事件必须定义在renderjs的script中

2)事件定义,如图所示定义就可以,事件必须定义在renderjs的script中

 

3)双向数据绑定:

这个稍微研究一下就能明白,操作数据要用到传递事件:

首先,dom的操作事件要放在renderjs的script中,事件定义还是在标签上:<view id="map-chart" @tap="echarts.eventName"></view>

 

随后,又回到基础script触发传过来的事件,进行你要操作的逻辑,赋值或者与组件通讯都可以!

 

 

 

 

 

 真实情况使用的时候还要根据实际情况进行修改,这里只是提供参考!!!

 

posted @ 2022-07-28 17:14  玛卡巴鉲  阅读(795)  评论(3编辑  收藏  举报