代码拉取完成,页面将自动刷新
datazoom
,并将自动触发Option类中onDatazoom(option, event, callJsMethod)
函数,在此函数中使用callJsMethod
方法通知到父组件。inited
事件通知。template:
<view class="my-echarts">
<!-- id为option类的静态属性name -->
<my-echarts
id="TestOption"
:data="data"
:events="['click', 'datazoom']"
@inited="onInited"
@click="onClick"
@datazoom="onDatazoom"
></my-echarts>
</view>
script: 设置echart需要展示数据
import MyEcharts from '@/components/my-echarts/my-echarts.vue'
export default {
components: { MyEcharts },
data() {
return {
data: []
}
},
onLoad() {
/** 获取数据 */
this.setData()
}
}
renderjs: 在renderjs层注册自定义TestOption
类
import myEChartsReflect from '@/components/my-echarts/MyEcharts.js'
import TestOption from '@/pages/index/TestOption.js'
export default {
created() {
myEChartsReflect.registOptConstructor(TestOption)
}
}
TestOption: 自定义option类,本示例中定义y轴formatter函数和serires label展示函数。
请一定要手动设置每个option类的静态属性name。
export default class TestOption extends MyEChartsOption {
/**
* 构造函数名称,实际上可以赋值任何字符串,但建议是变量名称。
* fix bug: 修复在uni-app打包时,视图层的this.constructor.name
* 和逻辑层this.constructor.name不一致情况
* 导致无法在renderjs层重新实例化逻辑层的option构造类。
*/
static name = 'TestOption'
/**
* 资源异步加载
* @params {string} id 元素的id,这里和上面name一样
* @return {Promise<void>}
*/
async onCreate(id) {
await super.onCreate(id)
// 加载别的资源,写在这里
}
/**
* @params {Object} context echarts.init返回值
*/
onStart(context) {
super.onStart(context)
}
/**
* 数据data变化触发事件
* 在echarts初始化完成之后,默认会触发一次
*/
onDatachange(option, data = [], callJsMethod) {
if (data.length === 0) {
this.showLoading()
} else {
this.hideLoading()
}
const total = data.reduce((prev, val) => {
return prev + val
}, 0)
this.option = {
// 自定义option
yAxis: {
axisLabel: {
formatter: function (value, index) {
return value.toFixed(2)
}
},
},
series: [{
data: [],
label: {
formatter: function (params) {
if (total === 0) return '0%'
return Math.floor(params.data / total * 100) + '%'
}
}
}],
// 自定义option
}
/** 需要手动返回,不要忘记他 */
return this.option
}
/**
* 触发datazoom事件
* @return {Object|undefined} 可以返回放入setOption中的对象。
*/
onDatazoom(option, event, callJsMethod) {
/** 给父组件发送事件 */
callJsMethod('datazoom', {type: event.type})
return {}
}
/**
* touch 事件
* @params {Object} option echarts.getOption()返回值
* @params {Object} event echarts事件对象或者html事件对象
* @params {function} callJsMethod 通知父组件事件
*/
onTouchstart(option, event, callJsMethod) {
}
}
key | type | desc |
---|---|---|
data | any |
需要展示的数据 |
events | string[] |
触发指定 echarts 支持的事件名称 |
<my-echarts>
的id为option
类静态属性name
,建议全局唯一,不然新会覆盖老的。option
类应类似TestOption
那样,继承MyEChartsOption
。onDatachange
类中修改入参data
对象,这个会触发vue setter,导致无限触发change:prop函数,如果一定需要改变原入参对象请深拷贝原对象。e.g JSON.parse(JSON.stringify(data))
或者使用MyEcharts.clone
工具函数。option
类onDatachange
方法入参data
做大量数据计算,请在逻辑层预先处理好。option
类中事件方法定义,比如onDatazoom
,则是datazoom
事件首字母大写并添加on
前缀方式得来。作者从java中的反射机制得到灵感,在代码运行的时候,动态实例化新对象。
所以在renderjs层先注册了echarts option的类(T extends MyEChartsOption
)。
在渲染echarts时候,只用逻辑层data实际上重新实列化了option
,这一步的意义是保留option
中函数设置。
这样就和在浏览器中编写方式一样。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。