Before Width: | Height: | Size: 254 KiB After Width: | Height: | Size: 9.0 KiB |
Before Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 44 KiB |
Before Width: | Height: | Size: 44 KiB |
Before Width: | Height: | Size: 77 KiB After Width: | Height: | Size: 29 KiB |
@ -0,0 +1,320 @@
|
||||
## 2.5.0-20230101(2023-01-01) |
||||
- 秋云图表组件 修改条件编译顺序,确保uniapp的cli方式的项目依赖不完整时可以正常显示 |
||||
- 秋云图表组件 恢复props属性directory的使用,以修复vue3项目中,开启echarts后,echarts目录识别错误的bug |
||||
- uCharts.js 修复区域图、混合图只有一个数据时图表显示不正确的bug |
||||
- uCharts.js 修复折线图、区域图中时间轴类别图表tooltip指示点显示不正确的bug |
||||
- uCharts.js 修复x轴使用labelCount时,并且boundaryGap = 'justify' 并且关闭Y轴显示的时候,最后一个坐标值不显示的bug |
||||
- uCharts.js 修复折线图只有一组数据时 ios16 渲染颜色不正确的bug |
||||
- uCharts.js 修复玫瑰图半径显示不正确的bug |
||||
- uCharts.js 柱状图、山峰图增加正负图功能,y轴网格如果需要显示0轴则由 min max 及 splitNumber 确定,后续版本优化自动显示0轴 |
||||
- uCharts.js 柱状图column增加 opts.extra.column.labelPosition,数据标签位置,有效值为 outside外部, insideTop内顶部, center内中间, bottom内底部 |
||||
- uCharts.js 雷达图radar增加 opts.extra.radar.labelShow,否显示各项标识文案是,默认true |
||||
- uCharts.js 提示窗tooltip增加 opts.extra.tooltip.boxPadding,提示窗边框填充距离,默认3px |
||||
- uCharts.js 提示窗tooltip增加 opts.extra.tooltip.fontSize,提示窗字体大小配置,默认13px |
||||
- uCharts.js 提示窗tooltip增加 opts.extra.tooltip.lineHeight,提示窗文字行高,默认20px |
||||
- uCharts.js 提示窗tooltip增加 opts.extra.tooltip.legendShow,是否显示左侧图例,默认true |
||||
- uCharts.js 提示窗tooltip增加 opts.extra.tooltip.legendShape,图例形状,图例标识样式,有效值为 auto自动跟随图例, diamond◆, circle●, triangle▲, square■, rect▬, line- |
||||
- uCharts.js 标记线markLine增加 opts.extra.markLine.labelFontSize,字体大小配置,默认13px |
||||
- uCharts.js 标记线markLine增加 opts.extra.markLine.labelPadding,标签边框内填充距离,默认6px |
||||
- uCharts.js 折线图line增加 opts.extra.line.linearType,渐变色类型,可选值 none关闭渐变色,custom 自定义渐变色。使用自定义渐变色时请赋值serie.linearColor作为颜色值 |
||||
- uCharts.js 折线图line增加 serie.linearColor,渐变色数组,格式为2维数组[起始位置,颜色值],例如[[0,'#0EE2F8'],[0.3,'#2BDCA8'],[0.6,'#1890FF'],[1,'#9A60B4']] |
||||
- uCharts.js 折线图line增加 opts.extra.line.onShadow,是否开启折线阴影,开启后请赋值serie.setShadow阴影设置 |
||||
- uCharts.js 折线图line增加 serie.setShadow,阴影配置,格式为4位数组:[offsetX,offsetY,blur,color] |
||||
- uCharts.js 折线图line增加 opts.extra.line.animation,动画效果方向,可选值为vertical 垂直动画效果,horizontal 水平动画效果 |
||||
- uCharts.js X轴xAxis增加 opts.xAxis.lineHeight,X轴字体行高,默认20px |
||||
- uCharts.js X轴xAxis增加 opts.xAxis.marginTop,X轴文字距离轴线的距离,默认0px |
||||
- uCharts.js X轴xAxis增加 opts.xAxis.title,当前X轴标题 |
||||
- uCharts.js X轴xAxis增加 opts.xAxis.titleFontSize,标题字体大小,默认13px |
||||
- uCharts.js X轴xAxis增加 opts.xAxis.titleOffsetY,标题纵向偏移距离,负数为向上偏移,正数向下偏移 |
||||
- uCharts.js X轴xAxis增加 opts.xAxis.titleOffsetX,标题横向偏移距离,负数为向左偏移,正数向右偏移 |
||||
- uCharts.js X轴xAxis增加 opts.xAxis.titleFontColor,标题字体颜色,默认#666666 |
||||
|
||||
## 报错TypeError: Cannot read properties of undefined (reading 'length') |
||||
- 如果是uni-modules版本组件,请先登录HBuilderX账号; |
||||
- 在HBuilderX中的manifest.json,点击重新获取uniapp的appid,或者删除appid重新粘贴,重新运行; |
||||
- 如果是cli项目请使用码云上的非uniCloud版本组件; |
||||
- 或者添加uniCloud的依赖; |
||||
- 或者使用原生uCharts; |
||||
## 2.4.5-20221130(2022-11-30) |
||||
- uCharts.js 优化tooltip当文字很多变为左侧显示时,如果画布仍显显示不下,提示框错位置变为以左侧0位置起画 |
||||
- uCharts.js 折线图修复特殊情况下只有单点数据,并改变线宽后点变为圆形的bug |
||||
- uCharts.js 修复Y轴disabled启用后无效并报错的bug |
||||
- uCharts.js 修复仪表盘起始结束角度特殊情况下显示不正确的bug |
||||
- uCharts.js 雷达图新增参数 opts.extra.radar.radius , 自定义雷达图半径 |
||||
- uCharts.js 折线图、区域图增加tooltip指示点,opts.extra.line.activeType/opts.extra.area.activeType,可选值"none"不启用激活指示点,"hollow"空心点模式,"solid"实心点模式 |
||||
## 2.4.4-20221102(2022-11-02) |
||||
- 秋云图表组件 修复使用echarts时reload、reshow无法调用重新渲染的bug,[详见码云PR](https://gitee.com/uCharts/uCharts/pulls/40) |
||||
- 秋云图表组件 修复使用echarts时,初始化时宽高不正确的bug,[详见码云PR](https://gitee.com/uCharts/uCharts/pulls/42) |
||||
- 秋云图表组件 修复uniapp的h5使用history模式时,无法加载echarts的bug |
||||
- 秋云图表组件 小程序端@complete、@scrollLeft、@scrollRight、@getTouchStart、@getTouchMove、@getTouchEnd事件增加opts参数传出,方便一些特殊需求的交互获取数据。 |
||||
|
||||
- uCharts.js 修复calTooltipYAxisData方法内formatter格式化方法未与y轴方法同步的问题,[详见码云PR](https://gitee.com/uCharts/uCharts/pulls/43) |
||||
- uCharts.js 地图新增参数opts.series[i].fillOpacity,以透明度方式来设置颜色过度效果,[详见码云PR](https://gitee.com/uCharts/uCharts/pulls/38) |
||||
- uCharts.js 地图新增参数opts.extra.map.active,是否启用点击激活变色 |
||||
- uCharts.js 地图新增参数opts.extra.map.activeTextColor,是否启用点击激活变色 |
||||
- uCharts.js 地图新增渲染完成事件renderComplete |
||||
- uCharts.js 漏斗图修复当部分数据相同时tooltip提示窗点击错误的bug |
||||
- uCharts.js 漏斗图新增参数series.data[i].centerText 居中标签文案 |
||||
- uCharts.js 漏斗图新增参数series.data[i].centerTextSize 居中标签文案字体大小,默认opts.fontSize |
||||
- uCharts.js 漏斗图新增参数series.data[i].centerTextColor 居中标签文案字体颜色,默认#FFFFFF |
||||
- uCharts.js 漏斗图新增参数opts.extra.funnel.minSize 最小值的最小宽度,默认0 |
||||
- uCharts.js 进度条新增参数opts.extra.arcbar.direction,动画方向,可选值为cw顺时针、ccw逆时针 |
||||
- uCharts.js 混合图新增参数opts.extra.mix.line.width,折线的宽度,默认2 |
||||
- uCharts.js 修复tooltip开启horizentalLine水平横线标注时,图表显示错位的bug |
||||
- uCharts.js 优化tooltip当文字很多变为左侧显示时,如果画布仍显显示不下,提示框错位置变为以左侧0位置起画 |
||||
- uCharts.js 修复开启滚动条后X轴文字超出绘图区域后的隐藏逻辑 |
||||
- uCharts.js 柱状图、条状图修复堆叠模式不能通过{value,color}赋值单个柱子颜色的问题 |
||||
- uCharts.js 气泡图修复不识别series.textSize和series.textColor的bug |
||||
|
||||
## 报错TypeError: Cannot read properties of undefined (reading 'length') |
||||
1. 如果是uni-modules版本组件,请先登录HBuilderX账号; |
||||
2. 在HBuilderX中的manifest.json,点击重新获取uniapp的appid,或者删除appid重新粘贴,重新运行; |
||||
3. 如果是cli项目请使用码云上的非uniCloud版本组件; |
||||
4. 或者添加uniCloud的依赖; |
||||
5. 或者使用原生uCharts; |
||||
## 2.4.3-20220505(2022-05-05) |
||||
- 秋云图表组件 修复开启canvas2d后将series赋值为空数组显示加载图标时,再次赋值后画布闪动的bug |
||||
- 秋云图表组件 修复升级hbx最新版后ECharts的highlight方法报错的bug |
||||
- uCharts.js 雷达图新增参数opts.extra.radar.gridEval,数据点位网格抽希,默认1 |
||||
- uCharts.js 雷达图新增参数opts.extra.radar.axisLabel, 是否显示刻度点值,默认false |
||||
- uCharts.js 雷达图新增参数opts.extra.radar.axisLabelTofix,刻度点值小数位数,默认0 |
||||
- uCharts.js 雷达图新增参数opts.extra.radar.labelPointShow,是否显示末端刻度圆点,默认false |
||||
- uCharts.js 雷达图新增参数opts.extra.radar.labelPointRadius,刻度圆点的半径,默认3 |
||||
- uCharts.js 雷达图新增参数opts.extra.radar.labelPointColor,刻度圆点的颜色,默认#cccccc |
||||
- uCharts.js 雷达图新增参数opts.extra.radar.linearType,渐变色类型,可选值"none"关闭渐变,"custom"开启渐变 |
||||
- uCharts.js 雷达图新增参数opts.extra.radar.customColor,自定义渐变颜色,数组类型对应series的数组长度以匹配不同series颜色的不同配色方案,例如["#FA7D8D", "#EB88E2"] |
||||
- uCharts.js 雷达图优化支持series.textColor、series.textSize属性 |
||||
- uCharts.js 柱状图中温度计式图标,优化支持全圆角类型,修复边框有缝隙的bug,详见官网【演示】中的温度计图表 |
||||
- uCharts.js 柱状图新增参数opts.extra.column.activeWidth,当前点击柱状图的背景宽度,默认一个单元格单位 |
||||
- uCharts.js 混合图增加opts.extra.mix.area.gradient 区域图是否开启渐变色 |
||||
- uCharts.js 混合图增加opts.extra.mix.area.opacity 区域图透明度,默认0.2 |
||||
- uCharts.js 饼图、圆环图、玫瑰图、漏斗图,增加opts.series[0].data[i].labelText,自定义标签文字,避免formatter格式化的繁琐,详见官网【演示】中的饼图 |
||||
- uCharts.js 饼图、圆环图、玫瑰图、漏斗图,增加opts.series[0].data[i].labelShow,自定义是否显示某一个指示标签,避免因饼图类别太多导致标签重复或者居多导致图形变形的问题,详见官网【演示】中的饼图 |
||||
- uCharts.js 增加opts.series[i].legendText/opts.series[0].data[i].legendText(与series.name同级)自定义图例显示文字的方法 |
||||
- uCharts.js 优化X轴、Y轴formatter格式化方法增加形参,统一为fromatter:function(value,index,opts){} |
||||
- uCharts.js 修复横屏模式下无法使用双指缩放方法的bug |
||||
- uCharts.js 修复当只有一条数据或者多条数据值相等的时候Y轴自动计算的最大值错误的bug |
||||
- 【官网模板】增加外部自定义图例与图表交互的例子,[点击跳转](https://www.ucharts.cn/v2/#/layout/info?id=2) |
||||
|
||||
## 注意:非unimodules 版本如因更新 hbx 至 3.4.7 导致报错如下,请到码云更新非 unimodules 版本组件,[点击跳转](https://gitee.com/uCharts/uCharts/tree/master/uni-app/uCharts-%E7%BB%84%E4%BB%B6) |
||||
> Error in callback for immediate watcher "uchartsOpts": "SyntaxError: Unexpected token u in JSON at position 0" |
||||
## 2.4.2-20220421(2022-04-21) |
||||
- 秋云图表组件 修复HBX升级3.4.6.20220420版本后echarts报错的问题 |
||||
## 2.4.2-20220420(2022-04-20) |
||||
## 重要!此版本uCharts新增了很多功能,修复了诸多已知问题 |
||||
- 秋云图表组件 新增onzoom开启双指缩放功能(仅uCharts),前提需要直角坐标系类图表类型,并且ontouch为true、opts.enableScroll为true,详见实例项目K线图 |
||||
- 秋云图表组件 新增optsWatch是否监听opts变化,关闭optsWatch后,动态修改opts不会触发图表重绘 |
||||
- 秋云图表组件 修复开启canvas2d功能后,动态更新数据后画布闪动的bug |
||||
- 秋云图表组件 去除directory属性,改为自动获取echarts.min.js路径(升级不受影响) |
||||
- 秋云图表组件 增加getImage()方法及@getImage事件,通过ref调用getImage()方法获,触发@getImage事件获取当前画布的base64图片文件流。 |
||||
- 秋云图表组件 支付宝、字节跳动、飞书、快手小程序支持开启canvas2d同层渲染设置。 |
||||
- 秋云图表组件 新增加【非uniCloud】版本组件,避免有些不需要uniCloud的使用组件发布至小程序需要提交隐私声明问题,请到码云[【非uniCloud版本】](https://gitee.com/uCharts/uCharts/tree/master/uni-app/uCharts-%E7%BB%84%E4%BB%B6),或npm[【非uniCloud版本】](https://www.npmjs.com/package/@qiun/uni-ucharts)下载使用。 |
||||
- uCharts.js 新增dobuleZoom双指缩放功能 |
||||
- uCharts.js 新增山峰图type="mount",数据格式为饼图类格式,不需要传入categories,具体详见新版官网在线演示 |
||||
- uCharts.js 修复折线图当数据中存在null时tooltip报错的bug |
||||
- uCharts.js 修复饼图类当画布比较小时自动计算的半径是负数报错的bug |
||||
- uCharts.js 统一各图表类型的series.formatter格式化方法的形参为(val, index, series, opts),方便格式化时有更多参数可用 |
||||
- uCharts.js 标记线功能增加labelText自定义显示文字,增加labelAlign标签显示位置(左侧或右侧),增加标签显示位置微调labelOffsetX、labelOffsetY |
||||
- uCharts.js 修复条状图当数值很小时开启圆角后样式错误的bug |
||||
- uCharts.js 修复X轴开启disabled后,X轴仍占用空间的bug |
||||
- uCharts.js 修复X轴开启滚动条并且开启rotateLabel后,X轴文字与滚动条重叠的bug |
||||
- uCharts.js 增加X轴rotateAngle文字旋转自定义角度,取值范围(-90至90) |
||||
- uCharts.js 修复地图文字标签层级显示不正确的bug |
||||
- uCharts.js 修复饼图、圆环图、玫瑰图当数据全部为0的时候不显示数据标签的bug |
||||
- uCharts.js 修复当opts.padding上边距为0时,Y轴顶部刻度标签位置不正确的bug |
||||
|
||||
## 另外我们还开发了各大原生小程序组件,已发布至码云和npm |
||||
[https://gitee.com/uCharts/uCharts](https://gitee.com/uCharts/uCharts) |
||||
[https://www.npmjs.com/~qiun](https://www.npmjs.com/~qiun) |
||||
|
||||
## 对于原生uCharts文档我们已上线新版官方网站,详情点击下面链接进入官网 |
||||
[https://www.uCharts.cn/v2/](https://www.ucharts.cn/v2/) |
||||
## 2.3.7-20220122(2022-01-22) |
||||
## 重要!使用vue3编译,请使用cli模式并升级至最新依赖,HbuilderX编译需要使用3.3.8以上版本 |
||||
- uCharts.js 修复uni-app平台组件模式使用vue3编译到小程序报错的bug。 |
||||
## 2.3.7-20220118(2022-01-18) |
||||
## 注意,使用vue3的前提是需要3.3.8.20220114-alpha版本的HBuilder! |
||||
## 2.3.67-20220118(2022-01-18) |
||||
- 秋云图表组件 组件初步支持vue3,全端编译会有些问题,具体详见下面修改: |
||||
1. 小程序端运行时,在uni_modules文件夹的qiun-data-charts.js中搜索 new uni_modules_qiunDataCharts_js_sdk_uCharts_uCharts.uCharts,将.uCharts去掉。 |
||||
2. 小程序端发行时,在uni_modules文件夹的qiun-data-charts.js中搜索 new e.uCharts,将.uCharts去掉,变为 new e。 |
||||
3. 如果觉得上述步骤比较麻烦,如果您的项目只编译到小程序端,可以修改u-charts.js最后一行导出方式,将 export default uCharts;变更为 export default { uCharts: uCharts }; 这样变更后,H5和App端的renderjs会有问题,请开发者自行选择。(此问题非组件问题,请等待DC官方修复Vue3的小程序端) |
||||
## 2.3.6-20220111(2022-01-11) |
||||
- 秋云图表组件 修改组件 props 属性中的 background 默认值为 rgba(0,0,0,0) |
||||
## 2.3.6-20211201(2021-12-01) |
||||
- uCharts.js 修复bar条状图开启圆角模式时,值很小时圆角渲染错误的bug |
||||
## 2.3.5-20211014(2021-10-15) |
||||
- uCharts.js 增加vue3的编译支持(仅原生uCharts,qiun-data-charts组件后续会支持,请关注更新) |
||||
## 2.3.4-20211012(2021-10-12) |
||||
- 秋云图表组件 修复 mac os x 系统 mouseover 事件丢失的 bug |
||||
## 2.3.3-20210706(2021-07-06) |
||||
- uCharts.js 增加雷达图开启数据点值(opts.dataLabel)的显示 |
||||
## 2.3.2-20210627(2021-06-27) |
||||
- 秋云图表组件 修复tooltipCustom个别情况下传值不正确报错TypeError: Cannot read property 'name' of undefined的bug |
||||
## 2.3.1-20210616(2021-06-16) |
||||
- uCharts.js 修复圆角柱状图使用4角圆角时,当数值过大时不正确的bug |
||||
## 2.3.0-20210612(2021-06-12) |
||||
- uCharts.js 【重要】uCharts增加nvue兼容,可在nvue项目中使用gcanvas组件渲染uCharts,[详见码云uCharts-demo-nvue](https://gitee.com/uCharts/uCharts) |
||||
- 秋云图表组件 增加tapLegend属性,是否开启图例点击交互事件 |
||||
- 秋云图表组件 getIndex事件中增加返回uCharts实例中的opts参数,以便在页面中调用参数 |
||||
- 示例项目 pages/other/other.vue增加app端自定义tooltip的方法,详见showOptsTooltip方法 |
||||
## 2.2.1-20210603(2021-06-03) |
||||
- uCharts.js 修复饼图、圆环图、玫瑰图,当起始角度不为0时,tooltip位置不准确的bug |
||||
- uCharts.js 增加温度计式柱状图开启顶部半圆形的配置 |
||||
## 2.2.0-20210529(2021-05-29) |
||||
- uCharts.js 增加条状图type="bar" |
||||
- 示例项目 pages/ucharts/ucharts.vue增加条状图的demo |
||||
## 2.1.7-20210524(2021-05-24) |
||||
- uCharts.js 修复大数据量模式下曲线图不平滑的bug |
||||
## 2.1.6-20210523(2021-05-23) |
||||
- 秋云图表组件 修复小程序端开启滚动条更新数据后滚动条位置不符合预期的bug |
||||
## 2.1.5-2021051702(2021-05-17) |
||||
- uCharts.js 修复自定义Y轴min和max值为0时不能正确显示的bug |
||||
## 2.1.5-20210517(2021-05-17) |
||||
- uCharts.js 修复Y轴自定义min和max时,未按指定的最大值最小值显示坐标轴刻度的bug |
||||
## 2.1.4-20210516(2021-05-16) |
||||
- 秋云图表组件 优化onWindowResize防抖方法 |
||||
- 秋云图表组件 修复APP端uCharts更新数据时,清空series显示loading图标后再显示图表,图表抖动的bug |
||||
- uCharts.js 修复开启canvas2d后,x轴、y轴、series自定义字体大小未按比例缩放的bug |
||||
- 示例项目 修复format-e.vue拼写错误导致app端使用uCharts渲染图表 |
||||
## 2.1.3-20210513(2021-05-13) |
||||
- 秋云图表组件 修改uCharts变更chartData数据为updateData方法,支持带滚动条的数据动态打点 |
||||
- 秋云图表组件 增加onWindowResize防抖方法 fix by ど誓言,如尘般染指流年づ |
||||
- 秋云图表组件 H5或者APP变更chartData数据显示loading图表时,原数据闪现的bug |
||||
- 秋云图表组件 props增加errorReload禁用错误点击重新加载的方法 |
||||
- uCharts.js 增加tooltip显示category(x轴对应点位)标题的功能,opts.extra.tooltip.showCategory,默认为false |
||||
- uCharts.js 修复mix混合图只有柱状图时,tooltip的分割线显示位置不正确的bug |
||||
- uCharts.js 修复开启滚动条,图表在拖动中动态打点,滚动条位置不正确的bug |
||||
- uCharts.js 修复饼图类数据格式为echarts数据格式,series为空数组报错的bug |
||||
- 示例项目 修改uCharts.js更新到v2.1.2版本后,@getIndex方法获取索引值变更为e.currentIndex.index |
||||
- 示例项目 pages/updata/updata.vue增加滚动条拖动更新(数据动态打点)的demo |
||||
- 示例项目 pages/other/other.vue增加errorReload禁用错误点击重新加载的demo |
||||
## 2.1.2-20210509(2021-05-09) |
||||
秋云图表组件 修复APP端初始化时就传入chartData或lacaldata不显示图表的bug |
||||
## 2.1.1-20210509(2021-05-09) |
||||
- 秋云图表组件 变更ECharts的eopts配置在renderjs内执行,支持在config-echarts.js配置文件内写function配置。 |
||||
- 秋云图表组件 修复APP端报错Prop being mutated: "onmouse"错误的bug。 |
||||
- 秋云图表组件 修复APP端报错Error: Not Found:Page[6][-1,27] at view.umd.min.js:1的bug。 |
||||
## 2.1.0-20210507(2021-05-07) |
||||
- 秋云图表组件 修复初始化时就有数据或者数据更新的时候loading加载动画闪动的bug |
||||
- uCharts.js 修复x轴format方法categories为字符串类型时返回NaN的bug |
||||
- uCharts.js 修复series.textColor、legend.fontColor未执行全局默认颜色的bug |
||||
## 2.1.0-20210506(2021-05-06) |
||||
- 秋云图表组件 修复极个别情况下报错item.properties undefined的bug |
||||
- 秋云图表组件 修复极个别情况下关闭加载动画reshow不起作用,无法显示图表的bug |
||||
- 示例项目 pages/ucharts/ucharts.vue 增加时间轴折线图(type="tline")、时间轴区域图(type="tarea")、散点图(type="scatter")、气泡图demo(type="bubble")、倒三角形漏斗图(opts.extra.funnel.type="triangle")、金字塔形漏斗图(opts.extra.funnel.type="pyramid") |
||||
- 示例项目 pages/format-u/format-u.vue 增加X轴format格式化示例 |
||||
- uCharts.js 升级至v2.1.0版本 |
||||
- uCharts.js 修复 玫瑰图面积模式点击tooltip位置不正确的bug |
||||
- uCharts.js 修复 玫瑰图点击图例,只剩一个类别显示空白的bug |
||||
- uCharts.js 修复 饼图类图点击图例,其他图表tooltip位置某些情况下不准的bug |
||||
- uCharts.js 修复 x轴为矢量轴(时间轴)情况下,点击tooltip位置不正确的bug |
||||
- uCharts.js 修复 词云图获取点击索引偶尔不准的bug |
||||
- uCharts.js 增加 直角坐标系图表X轴format格式化方法(原生uCharts.js用法请使用formatter) |
||||
- uCharts.js 增加 漏斗图扩展配置,倒三角形(opts.extra.funnel.type="triangle"),金字塔形(opts.extra.funnel.type="pyramid") |
||||
- uCharts.js 增加 散点图(opts.type="scatter")、气泡图(opts.type="bubble") |
||||
- 后期计划 完善散点图、气泡图,增加markPoints标记点,增加横向条状图。 |
||||
## 2.0.0-20210502(2021-05-02) |
||||
- uCharts.js 修复词云图获取点击索引不正确的bug |
||||
## 2.0.0-20210501(2021-05-01) |
||||
- 秋云图表组件 修复QQ小程序、百度小程序在关闭动画效果情况下,v-for循环使用图表,显示不正确的bug |
||||
## 2.0.0-20210426(2021-04-26) |
||||
- 秋云图表组件 修复QQ小程序不支持canvas2d的bug |
||||
- 秋云图表组件 修复钉钉小程序某些情况点击坐标计算错误的bug |
||||
- uCharts.js 增加 extra.column.categoryGap 参数,柱状图类每个category点位(X轴点)柱子组之间的间距 |
||||
- uCharts.js 增加 yAxis.data[i].titleOffsetY 参数,标题纵向偏移距离,负数为向上偏移,正数向下偏移 |
||||
- uCharts.js 增加 yAxis.data[i].titleOffsetX 参数,标题横向偏移距离,负数为向左偏移,正数向右偏移 |
||||
- uCharts.js 增加 extra.gauge.labelOffset 参数,仪表盘标签文字径向便宜距离,默认13px |
||||
## 2.0.0-20210422-2(2021-04-22) |
||||
秋云图表组件 修复 formatterAssign 未判断 args[key] == null 的情况导致栈溢出的 bug |
||||
## 2.0.0-20210422(2021-04-22) |
||||
- 秋云图表组件 修复H5、APP、支付宝小程序、微信小程序canvas2d模式下横屏模式的bug |
||||
## 2.0.0-20210421(2021-04-21) |
||||
- uCharts.js 修复多行图例的情况下,图例在上方或者下方时,图例float为左侧或者右侧时,第二行及以后的图例对齐方式不正确的bug |
||||
## 2.0.0-20210420(2021-04-20) |
||||
- 秋云图表组件 修复微信小程序开启canvas2d模式后,windows版微信小程序不支持canvas2d模式的bug |
||||
- 秋云图表组件 修改非uni_modules版本为v2.0版本qiun-data-charts组件 |
||||
## 2.0.0-20210419(2021-04-19) |
||||
## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧绿色【使用HBuilderX导入插件】即可使用,示例项目请点击右侧蓝色按钮【使用HBuilderX导入示例项目】。 |
||||
## 初次使用如果提示未注册<qiun-data-charts>组件,请重启HBuilderX,如仍不好用,请重启电脑; |
||||
## 如果是cli项目,请尝试清理node_modules,重新install,还不行就删除项目,再重新install。 |
||||
## 此问题已于DCloud官方确认,HBuilderX下个版本会修复。 |
||||
## 其他图表不显示问题详见[常见问题选项卡](https://demo.ucharts.cn) |
||||
## <font color=#FF0000> 新手请先完整阅读帮助文档及常见问题3遍,右侧蓝色按钮示例项目请看2遍! </font> |
||||
## [DEMO演示及在线生成工具(v2.0文档)https://demo.ucharts.cn](https://demo.ucharts.cn) |
||||
## [图表组件在项目中的应用参见 UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651) |
||||
- uCharts.js 修复混合图中柱状图单独设置颜色不生效的bug |
||||
- uCharts.js 修复多Y轴单独设置fontSize时,开启canvas2d后,未对应放大字体的bug |
||||
## 2.0.0-20210418(2021-04-18) |
||||
- 秋云图表组件 增加directory配置,修复H5端history模式下如果发布到二级目录无法正确加载echarts.min.js的bug |
||||
## 2.0.0-20210416(2021-04-16) |
||||
## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧绿色【使用HBuilderX导入插件】即可使用,示例项目请点击右侧蓝色按钮【使用HBuilderX导入示例项目】。 |
||||
## 初次使用如果提示未注册<qiun-data-charts>组件,请重启HBuilderX,如仍不好用,请重启电脑; |
||||
## 如果是cli项目,请尝试清理node_modules,重新install,还不行就删除项目,再重新install。 |
||||
## 此问题已于DCloud官方确认,HBuilderX下个版本会修复。 |
||||
## 其他图表不显示问题详见[常见问题选项卡](https://demo.ucharts.cn) |
||||
## <font color=#FF0000> 新手请先完整阅读帮助文档及常见问题3遍,右侧蓝色按钮示例项目请看2遍! </font> |
||||
## [DEMO演示及在线生成工具(v2.0文档)https://demo.ucharts.cn](https://demo.ucharts.cn) |
||||
## [图表组件在项目中的应用参见 UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651) |
||||
- 秋云图表组件 修复APP端某些情况下报错`Not Found Page`的bug,fix by 高级bug开发技术员 |
||||
- 示例项目 修复APP端v-for循环某些情况下报错`Not Found Page`的bug,fix by 高级bug开发技术员 |
||||
- uCharts.js 修复非直角坐标系tooltip提示窗右侧超出未变换方向显示的bug |
||||
## 2.0.0-20210415(2021-04-15) |
||||
- 秋云图表组件 修复H5端发布到二级目录下echarts无法加载的bug |
||||
- 秋云图表组件 修复某些情况下echarts.off('finished')移除监听事件报错的bug |
||||
## 2.0.0-20210414(2021-04-14) |
||||
## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧绿色【使用HBuilderX导入插件】即可使用,示例项目请点击右侧蓝色按钮【使用HBuilderX导入示例项目】。 |
||||
## 初次使用如果提示未注册<qiun-data-charts>组件,请重启HBuilderX,如仍不好用,请重启电脑; |
||||
## 如果是cli项目,请尝试清理node_modules,重新install,还不行就删除项目,再重新install。 |
||||
## 此问题已于DCloud官方确认,HBuilderX下个版本会修复。 |
||||
## 其他图表不显示问题详见[常见问题选项卡](https://demo.ucharts.cn) |
||||
## <font color=#FF0000> 新手请先完整阅读帮助文档及常见问题3遍,右侧蓝色按钮示例项目请看2遍! </font> |
||||
## [DEMO演示及在线生成工具(v2.0文档)https://demo.ucharts.cn](https://demo.ucharts.cn) |
||||
## [图表组件在项目中的应用参见 UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651) |
||||
- 秋云图表组件 修复H5端在cli项目下ECharts引用地址错误的bug |
||||
- 示例项目 增加ECharts的formatter用法的示例(详见示例项目format-e.vue) |
||||
- uCharts.js 增加圆环图中心背景色的配置extra.ring.centerColor |
||||
- uCharts.js 修复微信小程序安卓端柱状图开启透明色后显示不正确的bug |
||||
## 2.0.0-20210413(2021-04-13) |
||||
- 秋云图表组件 修复百度小程序多个图表真机未能正确获取根元素dom尺寸的bug |
||||
- 秋云图表组件 修复百度小程序横屏模式方向不正确的bug |
||||
- 秋云图表组件 修改ontouch时,@getTouchStart@getTouchMove@getTouchEnd的触发条件 |
||||
- uCharts.js 修复饼图类数据格式series属性不生效的bug |
||||
- uCharts.js 增加时序区域图 详见示例项目中ucharts.vue |
||||
## 2.0.0-20210412-2(2021-04-12) |
||||
## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧绿色【使用HBuilderX导入插件】即可使用,示例项目请点击右侧蓝色按钮【使用HBuilderX导入示例项目】。 |
||||
## 初次使用如果提示未注册<qiun-data-charts>组件,请重启HBuilderX。如仍不好用,请重启电脑,此问题已于DCloud官方确认,HBuilderX下个版本会修复。 |
||||
## [DEMO演示及在线生成工具(v2.0文档)https://demo.ucharts.cn](https://demo.ucharts.cn) |
||||
## [图表组件在uniCloudAdmin中的应用 UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651) |
||||
- 秋云图表组件 修复uCharts在APP端横屏模式下不能正确渲染的bug |
||||
- 示例项目 增加ECharts柱状图渐变色、圆角柱状图、横向柱状图(条状图)的示例 |
||||
## 2.0.0-20210412(2021-04-12) |
||||
- 秋云图表组件 修复created中判断echarts导致APP端无法识别,改回mounted中判断echarts初始化 |
||||
- uCharts.js 修复2d模式下series.textOffset未乘像素比的bug |
||||
## 2.0.0-20210411(2021-04-11) |
||||
## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧绿色【使用HBuilderX导入插件】即可使用,示例项目请点击右侧蓝色按钮【使用HBuilderX导入示例项目】。 |
||||
## 初次使用如果提示未注册<qiun-data-charts>组件,请重启HBuilderX,并清空小程序开发者工具缓存。 |
||||
## [DEMO演示及在线生成工具(v2.0文档)https://demo.ucharts.cn](https://demo.ucharts.cn) |
||||
## [图表组件在uniCloudAdmin中的应用 UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651) |
||||
- uCharts.js 折线图区域图增加connectNulls断点续连的功能,详见示例项目中ucharts.vue |
||||
- 秋云图表组件 变更初始化方法为created,变更type2d默认值为true,优化2d模式下组件初始化后dom获取不到的bug |
||||
- 秋云图表组件 修复左右布局时,右侧图表点击坐标错误的bug,修复tooltip柱状图自定义颜色显示object的bug |
||||
## 2.0.0-20210410(2021-04-10) |
||||
- 修复左右布局时,右侧图表点击坐标错误的bug,修复柱状图自定义颜色tooltip显示object的bug |
||||
- 增加标记线及柱状图自定义颜色的demo |
||||
## 2.0.0-20210409(2021-04-08) |
||||
## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧【使用HBuilderX导入插件】即可体验,DEMO演示及在线生成工具(v2.0文档)[https://demo.ucharts.cn](https://demo.ucharts.cn) |
||||
## 图表组件在uniCloudAdmin中的应用 [UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651) |
||||
- uCharts.js 修复钉钉小程序百度小程序measureText不准确的bug,修复2d模式下饼图类activeRadius为按比例放大的bug |
||||
- 修复组件在支付宝小程序端点击位置不准确的bug |
||||
## 2.0.0-20210408(2021-04-07) |
||||
- 修复组件在支付宝小程序端不能显示的bug(目前支付宝小程不能点击交互,后续修复) |
||||
- uCharts.js 修复高分屏下柱状图类,圆弧进度条 自定义宽度不能按比例放大的bug |
||||
## 2.0.0-20210407(2021-04-06) |
||||
## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧【使用HBuilderX导入插件】即可体验,DEMO演示及在线生成工具(v2.0文档)[https://demo.ucharts.cn](https://demo.ucharts.cn) |
||||
## 增加 通过tofix和unit快速格式化y轴的demo add by `howcode` |
||||
## 增加 图表组件在uniCloudAdmin中的应用 [UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651) |
||||
## 2.0.0-20210406(2021-04-05) |
||||
# 秋云图表组件+uCharts v2.0版本同步上线,使用方法详见https://demo.ucharts.cn帮助页 |
||||
## 2.0.0(2021-04-05) |
||||
# 秋云图表组件+uCharts v2.0版本同步上线,使用方法详见https://demo.ucharts.cn帮助页 |
@ -0,0 +1,162 @@
|
||||
<template> |
||||
<view class="container loading1"> |
||||
<view class="shape shape1"></view> |
||||
<view class="shape shape2"></view> |
||||
<view class="shape shape3"></view> |
||||
<view class="shape shape4"></view> |
||||
</view> |
||||
</template> |
||||
|
||||
<script> |
||||
export default { |
||||
name: 'loading1', |
||||
data() { |
||||
return { |
||||
|
||||
}; |
||||
} |
||||
} |
||||
</script> |
||||
|
||||
<style scoped="true"> |
||||
.container { |
||||
width: 30px; |
||||
height: 30px; |
||||
position: relative; |
||||
} |
||||
.container.loading1 { |
||||
-webkit-transform: rotate(45deg); |
||||
transform: rotate(45deg); |
||||
} |
||||
|
||||
.container .shape { |
||||
position: absolute; |
||||
width: 10px; |
||||
height: 10px; |
||||
border-radius: 1px; |
||||
} |
||||
.container .shape.shape1 { |
||||
left: 0; |
||||
background-color: #1890FF; |
||||
} |
||||
.container .shape.shape2 { |
||||
right: 0; |
||||
background-color: #91CB74; |
||||
} |
||||
.container .shape.shape3 { |
||||
bottom: 0; |
||||
background-color: #FAC858; |
||||
} |
||||
.container .shape.shape4 { |
||||
bottom: 0; |
||||
right: 0; |
||||
background-color: #EE6666; |
||||
} |
||||
|
||||
.loading1 .shape1 { |
||||
-webkit-animation: animation1shape1 0.5s ease 0s infinite alternate; |
||||
animation: animation1shape1 0.5s ease 0s infinite alternate; |
||||
} |
||||
|
||||
@-webkit-keyframes animation1shape1 { |
||||
from { |
||||
-webkit-transform: translate(0, 0); |
||||
transform: translate(0, 0); |
||||
} |
||||
to { |
||||
-webkit-transform: translate(16px, 16px); |
||||
transform: translate(16px, 16px); |
||||
} |
||||
} |
||||
|
||||
@keyframes animation1shape1 { |
||||
from { |
||||
-webkit-transform: translate(0, 0); |
||||
transform: translate(0, 0); |
||||
} |
||||
to { |
||||
-webkit-transform: translate(16px, 16px); |
||||
transform: translate(16px, 16px); |
||||
} |
||||
} |
||||
.loading1 .shape2 { |
||||
-webkit-animation: animation1shape2 0.5s ease 0s infinite alternate; |
||||
animation: animation1shape2 0.5s ease 0s infinite alternate; |
||||
} |
||||
|
||||
@-webkit-keyframes animation1shape2 { |
||||
from { |
||||
-webkit-transform: translate(0, 0); |
||||
transform: translate(0, 0); |
||||
} |
||||
to { |
||||
-webkit-transform: translate(-16px, 16px); |
||||
transform: translate(-16px, 16px); |
||||
} |
||||
} |
||||
|
||||
@keyframes animation1shape2 { |
||||
from { |
||||
-webkit-transform: translate(0, 0); |
||||
transform: translate(0, 0); |
||||
} |
||||
to { |
||||
-webkit-transform: translate(-16px, 16px); |
||||
transform: translate(-16px, 16px); |
||||
} |
||||
} |
||||
.loading1 .shape3 { |
||||
-webkit-animation: animation1shape3 0.5s ease 0s infinite alternate; |
||||
animation: animation1shape3 0.5s ease 0s infinite alternate; |
||||
} |
||||
|
||||
@-webkit-keyframes animation1shape3 { |
||||
from { |
||||
-webkit-transform: translate(0, 0); |
||||
transform: translate(0, 0); |
||||
} |
||||
to { |
||||
-webkit-transform: translate(16px, -16px); |
||||
transform: translate(16px, -16px); |
||||
} |
||||
} |
||||
|
||||
@keyframes animation1shape3 { |
||||
from { |
||||
-webkit-transform: translate(0, 0); |
||||
transform: translate(0, 0); |
||||
} |
||||
to { |
||||
-webkit-transform: translate(16px, -16px); |
||||
transform: translate(16px, -16px); |
||||
} |
||||
} |
||||
.loading1 .shape4 { |
||||
-webkit-animation: animation1shape4 0.5s ease 0s infinite alternate; |
||||
animation: animation1shape4 0.5s ease 0s infinite alternate; |
||||
} |
||||
|
||||
@-webkit-keyframes animation1shape4 { |
||||
from { |
||||
-webkit-transform: translate(0, 0); |
||||
transform: translate(0, 0); |
||||
} |
||||
to { |
||||
-webkit-transform: translate(-16px, -16px); |
||||
transform: translate(-16px, -16px); |
||||
} |
||||
} |
||||
|
||||
@keyframes animation1shape4 { |
||||
from { |
||||
-webkit-transform: translate(0, 0); |
||||
transform: translate(0, 0); |
||||
} |
||||
to { |
||||
-webkit-transform: translate(-16px, -16px); |
||||
transform: translate(-16px, -16px); |
||||
} |
||||
} |
||||
|
||||
|
||||
</style> |
@ -0,0 +1,170 @@
|
||||
<template> |
||||
<view class="container loading2"> |
||||
<view class="shape shape1"></view> |
||||
<view class="shape shape2"></view> |
||||
<view class="shape shape3"></view> |
||||
<view class="shape shape4"></view> |
||||
</view> |
||||
</template> |
||||
|
||||
<script> |
||||
export default { |
||||
name: 'loading2', |
||||
data() { |
||||
return { |
||||
|
||||
}; |
||||
} |
||||
} |
||||
</script> |
||||
|
||||
<style scoped="true"> |
||||
.container { |
||||
width: 30px; |
||||
height: 30px; |
||||
position: relative; |
||||
} |
||||
|
||||
.container.loading2 { |
||||
-webkit-transform: rotate(10deg); |
||||
transform: rotate(10deg); |
||||
} |
||||
.container.loading2 .shape { |
||||
border-radius: 5px; |
||||
} |
||||
.container.loading2{ |
||||
-webkit-animation: rotation 1s infinite; |
||||
animation: rotation 1s infinite; |
||||
} |
||||
|
||||
.container .shape { |
||||
position: absolute; |
||||
width: 10px; |
||||
height: 10px; |
||||
border-radius: 1px; |
||||
} |
||||
.container .shape.shape1 { |
||||
left: 0; |
||||
background-color: #1890FF; |
||||
} |
||||
.container .shape.shape2 { |
||||
right: 0; |
||||
background-color: #91CB74; |
||||
} |
||||
.container .shape.shape3 { |
||||
bottom: 0; |
||||
background-color: #FAC858; |
||||
} |
||||
.container .shape.shape4 { |
||||
bottom: 0; |
||||
right: 0; |
||||
background-color: #EE6666; |
||||
} |
||||
|
||||
|
||||
.loading2 .shape1 { |
||||
-webkit-animation: animation2shape1 0.5s ease 0s infinite alternate; |
||||
animation: animation2shape1 0.5s ease 0s infinite alternate; |
||||
} |
||||
|
||||
@-webkit-keyframes animation2shape1 { |
||||
from { |
||||
-webkit-transform: translate(0, 0); |
||||
transform: translate(0, 0); |
||||
} |
||||
to { |
||||
-webkit-transform: translate(20px, 20px); |
||||
transform: translate(20px, 20px); |
||||
} |
||||
} |
||||
|
||||
@keyframes animation2shape1 { |
||||
from { |
||||
-webkit-transform: translate(0, 0); |
||||
transform: translate(0, 0); |
||||
} |
||||
to { |
||||
-webkit-transform: translate(20px, 20px); |
||||
transform: translate(20px, 20px); |
||||
} |
||||
} |
||||
.loading2 .shape2 { |
||||
-webkit-animation: animation2shape2 0.5s ease 0s infinite alternate; |
||||
animation: animation2shape2 0.5s ease 0s infinite alternate; |
||||
} |
||||
|
||||
@-webkit-keyframes animation2shape2 { |
||||
from { |
||||
-webkit-transform: translate(0, 0); |
||||
transform: translate(0, 0); |
||||
} |
||||
to { |
||||
-webkit-transform: translate(-20px, 20px); |
||||
transform: translate(-20px, 20px); |
||||
} |
||||
} |
||||
|
||||
@keyframes animation2shape2 { |
||||
from { |
||||
-webkit-transform: translate(0, 0); |
||||
transform: translate(0, 0); |
||||
} |
||||
to { |
||||
-webkit-transform: translate(-20px, 20px); |
||||
transform: translate(-20px, 20px); |
||||
} |
||||
} |
||||
.loading2 .shape3 { |
||||
-webkit-animation: animation2shape3 0.5s ease 0s infinite alternate; |
||||
animation: animation2shape3 0.5s ease 0s infinite alternate; |
||||
} |
||||
|
||||
@-webkit-keyframes animation2shape3 { |
||||
from { |
||||
-webkit-transform: translate(0, 0); |
||||
transform: translate(0, 0); |
||||
} |
||||
to { |
||||
-webkit-transform: translate(20px, -20px); |
||||
transform: translate(20px, -20px); |
||||
} |
||||
} |
||||
|
||||
@keyframes animation2shape3 { |
||||
from { |
||||
-webkit-transform: translate(0, 0); |
||||
transform: translate(0, 0); |
||||
} |
||||
to { |
||||
-webkit-transform: translate(20px, -20px); |
||||
transform: translate(20px, -20px); |
||||
} |
||||
} |
||||
.loading2 .shape4 { |
||||
-webkit-animation: animation2shape4 0.5s ease 0s infinite alternate; |
||||
animation: animation2shape4 0.5s ease 0s infinite alternate; |
||||
} |
||||
|
||||
@-webkit-keyframes animation2shape4 { |
||||
from { |
||||
-webkit-transform: translate(0, 0); |
||||
transform: translate(0, 0); |
||||
} |
||||
to { |
||||
-webkit-transform: translate(-20px, -20px); |
||||
transform: translate(-20px, -20px); |
||||
} |
||||
} |
||||
|
||||
@keyframes animation2shape4 { |
||||
from { |
||||
-webkit-transform: translate(0, 0); |
||||
transform: translate(0, 0); |
||||
} |
||||
to { |
||||
-webkit-transform: translate(-20px, -20px); |
||||
transform: translate(-20px, -20px); |
||||
} |
||||
} |
||||
|
||||
</style> |
@ -0,0 +1,173 @@
|
||||
<template> |
||||
<view class="container loading3"> |
||||
<view class="shape shape1"></view> |
||||
<view class="shape shape2"></view> |
||||
<view class="shape shape3"></view> |
||||
<view class="shape shape4"></view> |
||||
</view> |
||||
</template> |
||||
|
||||
<script> |
||||
export default { |
||||
name: 'loading3', |
||||
data() { |
||||
return { |
||||
|
||||
}; |
||||
} |
||||
} |
||||
</script> |
||||
|
||||
<style scoped="true"> |
||||
.container { |
||||
width: 30px; |
||||
height: 30px; |
||||
position: relative; |
||||
} |
||||
|
||||
.container.loading3 { |
||||
-webkit-animation: rotation 1s infinite; |
||||
animation: rotation 1s infinite; |
||||
} |
||||
.container.loading3 .shape1 { |
||||
border-top-left-radius: 10px; |
||||
} |
||||
.container.loading3 .shape2 { |
||||
border-top-right-radius: 10px; |
||||
} |
||||
.container.loading3 .shape3 { |
||||
border-bottom-left-radius: 10px; |
||||
} |
||||
.container.loading3 .shape4 { |
||||
border-bottom-right-radius: 10px; |
||||
} |
||||
|
||||
.container .shape { |
||||
position: absolute; |
||||
width: 10px; |
||||
height: 10px; |
||||
border-radius: 1px; |
||||
} |
||||
.container .shape.shape1 { |
||||
left: 0; |
||||
background-color: #1890FF; |
||||
} |
||||
.container .shape.shape2 { |
||||
right: 0; |
||||
background-color: #91CB74; |
||||
} |
||||
.container .shape.shape3 { |
||||
bottom: 0; |
||||
background-color: #FAC858; |
||||
} |
||||
.container .shape.shape4 { |
||||
bottom: 0; |
||||
right: 0; |
||||
background-color: #EE6666; |
||||
} |
||||
|
||||
.loading3 .shape1 { |
||||
-webkit-animation: animation3shape1 0.5s ease 0s infinite alternate; |
||||
animation: animation3shape1 0.5s ease 0s infinite alternate; |
||||
} |
||||
|
||||
@-webkit-keyframes animation3shape1 { |
||||
from { |
||||
-webkit-transform: translate(0, 0); |
||||
transform: translate(0, 0); |
||||
} |
||||
to { |
||||
-webkit-transform: translate(5px, 5px); |
||||
transform: translate(5px, 5px); |
||||
} |
||||
} |
||||
|
||||
@keyframes animation3shape1 { |
||||
from { |
||||
-webkit-transform: translate(0, 0); |
||||
transform: translate(0, 0); |
||||
} |
||||
to { |
||||
-webkit-transform: translate(5px, 5px); |
||||
transform: translate(5px, 5px); |
||||
} |
||||
} |
||||
.loading3 .shape2 { |
||||
-webkit-animation: animation3shape2 0.5s ease 0s infinite alternate; |
||||
animation: animation3shape2 0.5s ease 0s infinite alternate; |
||||
} |
||||
|
||||
@-webkit-keyframes animation3shape2 { |
||||
from { |
||||
-webkit-transform: translate(0, 0); |
||||
transform: translate(0, 0); |
||||
} |
||||
to { |
||||
-webkit-transform: translate(-5px, 5px); |
||||
transform: translate(-5px, 5px); |
||||
} |
||||
} |
||||
|
||||
@keyframes animation3shape2 { |
||||
from { |
||||
-webkit-transform: translate(0, 0); |
||||
transform: translate(0, 0); |
||||
} |
||||
to { |
||||
-webkit-transform: translate(-5px, 5px); |
||||
transform: translate(-5px, 5px); |
||||
} |
||||
} |
||||
.loading3 .shape3 { |
||||
-webkit-animation: animation3shape3 0.5s ease 0s infinite alternate; |
||||
animation: animation3shape3 0.5s ease 0s infinite alternate; |
||||
} |
||||
|
||||
@-webkit-keyframes animation3shape3 { |
||||
from { |
||||
-webkit-transform: translate(0, 0); |
||||
transform: translate(0, 0); |
||||
} |
||||
to { |
||||
-webkit-transform: translate(5px, -5px); |
||||
transform: translate(5px, -5px); |
||||
} |
||||
} |
||||
|
||||
@keyframes animation3shape3 { |
||||
from { |
||||
-webkit-transform: translate(0, 0); |
||||
transform: translate(0, 0); |
||||
} |
||||
to { |
||||
-webkit-transform: translate(5px, -5px); |
||||
transform: translate(5px, -5px); |
||||
} |
||||
} |
||||
.loading3 .shape4 { |
||||
-webkit-animation: animation3shape4 0.5s ease 0s infinite alternate; |
||||
animation: animation3shape4 0.5s ease 0s infinite alternate; |
||||
} |
||||
|
||||
@-webkit-keyframes animation3shape4 { |
||||
from { |
||||
-webkit-transform: translate(0, 0); |
||||
transform: translate(0, 0); |
||||
} |
||||
to { |
||||
-webkit-transform: translate(-5px, -5px); |
||||
transform: translate(-5px, -5px); |
||||
} |
||||
} |
||||
|
||||
@keyframes animation3shape4 { |
||||
from { |
||||
-webkit-transform: translate(0, 0); |
||||
transform: translate(0, 0); |
||||
} |
||||
to { |
||||
-webkit-transform: translate(-5px, -5px); |
||||
transform: translate(-5px, -5px); |
||||
} |
||||
} |
||||
</style> |
@ -0,0 +1,222 @@
|
||||
<template> |
||||
<view class="container loading5"> |
||||
<view class="shape shape1"></view> |
||||
<view class="shape shape2"></view> |
||||
<view class="shape shape3"></view> |
||||
<view class="shape shape4"></view> |
||||
</view> |
||||
</template> |
||||
|
||||
<script> |
||||
export default { |
||||
name: 'loading5', |
||||
data() { |
||||
return { |
||||
|
||||
}; |
||||
} |
||||
} |
||||
</script> |
||||
|
||||
<style scoped="true"> |
||||
.container { |
||||
width: 30px; |
||||
height: 30px; |
||||
position: relative; |
||||
} |
||||
|
||||
.container.loading5 .shape { |
||||
width: 15px; |
||||
height: 15px; |
||||
} |
||||
|
||||
.container .shape { |
||||
position: absolute; |
||||
width: 10px; |
||||
height: 10px; |
||||
border-radius: 1px; |
||||
} |
||||
.container .shape.shape1 { |
||||
left: 0; |
||||
background-color: #1890FF; |
||||
} |
||||
.container .shape.shape2 { |
||||
right: 0; |
||||
background-color: #91CB74; |
||||
} |
||||
.container .shape.shape3 { |
||||
bottom: 0; |
||||
background-color: #FAC858; |
||||
} |
||||
.container .shape.shape4 { |
||||
bottom: 0; |
||||
right: 0; |
||||
background-color: #EE6666; |
||||
} |
||||
|
||||
.loading5 .shape1 { |
||||
animation: animation5shape1 2s ease 0s infinite reverse; |
||||
} |
||||
|
||||
@-webkit-keyframes animation5shape1 { |
||||
0% { |
||||
-webkit-transform: translate(0, 0); |
||||
transform: translate(0, 0); |
||||
} |
||||
25% { |
||||
-webkit-transform: translate(0, 15px); |
||||
transform: translate(0, 15px); |
||||
} |
||||
50% { |
||||
-webkit-transform: translate(15px, 15px); |
||||
transform: translate(15px, 15px); |
||||
} |
||||
75% { |
||||
-webkit-transform: translate(15px, 0); |
||||
transform: translate(15px, 0); |
||||
} |
||||
} |
||||
|
||||
@keyframes animation5shape1 { |
||||
0% { |
||||
-webkit-transform: translate(0, 0); |
||||
transform: translate(0, 0); |
||||
} |
||||
25% { |
||||
-webkit-transform: translate(0, 15px); |
||||
transform: translate(0, 15px); |
||||
} |
||||
50% { |
||||
-webkit-transform: translate(15px, 15px); |
||||
transform: translate(15px, 15px); |
||||
} |
||||
75% { |
||||
-webkit-transform: translate(15px, 0); |
||||
transform: translate(15px, 0); |
||||
} |
||||
} |
||||
.loading5 .shape2 { |
||||
animation: animation5shape2 2s ease 0s infinite reverse; |
||||
} |
||||
|
||||
@-webkit-keyframes animation5shape2 { |
||||
0% { |
||||
-webkit-transform: translate(0, 0); |
||||
transform: translate(0, 0); |
||||
} |
||||
25% { |
||||
-webkit-transform: translate(-15px, 0); |
||||
transform: translate(-15px, 0); |
||||
} |
||||
50% { |
||||
-webkit-transform: translate(-15px, 15px); |
||||
transform: translate(-15px, 15px); |
||||
} |
||||
75% { |
||||
-webkit-transform: translate(0, 15px); |
||||
transform: translate(0, 15px); |
||||
} |
||||
} |
||||
|
||||
@keyframes animation5shape2 { |
||||
0% { |
||||
-webkit-transform: translate(0, 0); |
||||
transform: translate(0, 0); |
||||
} |
||||
25% { |
||||
-webkit-transform: translate(-15px, 0); |
||||
transform: translate(-15px, 0); |
||||
} |
||||
50% { |
||||
-webkit-transform: translate(-15px, 15px); |
||||
transform: translate(-15px, 15px); |
||||
} |
||||
75% { |
||||
-webkit-transform: translate(0, 15px); |
||||
transform: translate(0, 15px); |
||||
} |
||||
} |
||||
.loading5 .shape3 { |
||||
animation: animation5shape3 2s ease 0s infinite reverse; |
||||
} |
||||
|
||||
@-webkit-keyframes animation5shape3 { |
||||
0% { |
||||
-webkit-transform: translate(0, 0); |
||||
transform: translate(0, 0); |
||||
} |
||||
25% { |
||||
-webkit-transform: translate(15px, 0); |
||||
transform: translate(15px, 0); |
||||
} |
||||
50% { |
||||
-webkit-transform: translate(15px, -15px); |
||||
transform: translate(15px, -15px); |
||||
} |
||||
75% { |
||||
-webkit-transform: translate(0, -15px); |
||||
transform: translate(0, -15px); |
||||
} |
||||
} |
||||
|
||||
@keyframes animation5shape3 { |
||||
0% { |
||||
-webkit-transform: translate(0, 0); |
||||
transform: translate(0, 0); |
||||
} |
||||
25% { |
||||
-webkit-transform: translate(15px, 0); |
||||
transform: translate(15px, 0); |
||||
} |
||||
50% { |
||||
-webkit-transform: translate(15px, -15px); |
||||
transform: translate(15px, -15px); |
||||
} |
||||
75% { |
||||
-webkit-transform: translate(0, -15px); |
||||
transform: translate(0, -15px); |
||||
} |
||||
} |
||||
.loading5 .shape4 { |
||||
animation: animation5shape4 2s ease 0s infinite reverse; |
||||
} |
||||
|
||||
@-webkit-keyframes animation5shape4 { |
||||
0% { |
||||
-webkit-transform: translate(0, 0); |
||||
transform: translate(0, 0); |
||||
} |
||||
25% { |
||||
-webkit-transform: translate(0, -15px); |
||||
transform: translate(0, -15px); |
||||
} |
||||
50% { |
||||
-webkit-transform: translate(-15px, -15px); |
||||
transform: translate(-15px, -15px); |
||||
} |
||||
75% { |
||||
-webkit-transform: translate(-15px, 0); |
||||
transform: translate(-15px, 0); |
||||
} |
||||
} |
||||
|
||||
@keyframes animation5shape4 { |
||||
0% { |
||||
-webkit-transform: translate(0, 0); |
||||
transform: translate(0, 0); |
||||
} |
||||
25% { |
||||
-webkit-transform: translate(0, -15px); |
||||
transform: translate(0, -15px); |
||||
} |
||||
50% { |
||||
-webkit-transform: translate(-15px, -15px); |
||||
transform: translate(-15px, -15px); |
||||
} |
||||
75% { |
||||
-webkit-transform: translate(-15px, 0); |
||||
transform: translate(-15px, 0); |
||||
} |
||||
} |
||||
|
||||
</style> |
@ -0,0 +1,229 @@
|
||||
<template> |
||||
<view class="container loading6"> |
||||
<view class="shape shape1"></view> |
||||
<view class="shape shape2"></view> |
||||
<view class="shape shape3"></view> |
||||
<view class="shape shape4"></view> |
||||
</view> |
||||
</template> |
||||
|
||||
<script> |
||||
export default { |
||||
name: 'loading6', |
||||
data() { |
||||
return { |
||||
|
||||
}; |
||||
} |
||||
} |
||||
</script> |
||||
<style scoped="true"> |
||||
.container { |
||||
width: 30px; |
||||
height: 30px; |
||||
position: relative; |
||||
} |
||||
|
||||
.container.loading6 { |
||||
-webkit-animation: rotation 1s infinite; |
||||
animation: rotation 1s infinite; |
||||
} |
||||
.container.loading6 .shape { |
||||
width: 12px; |
||||
height: 12px; |
||||
border-radius: 2px; |
||||
} |
||||
.container .shape { |
||||
position: absolute; |
||||
width: 10px; |
||||
height: 10px; |
||||
border-radius: 1px; |
||||
} |
||||
.container .shape.shape1 { |
||||
left: 0; |
||||
background-color: #1890FF; |
||||
} |
||||
.container .shape.shape2 { |
||||
right: 0; |
||||
background-color: #91CB74; |
||||
} |
||||
.container .shape.shape3 { |
||||
bottom: 0; |
||||
background-color: #FAC858; |
||||
} |
||||
.container .shape.shape4 { |
||||
bottom: 0; |
||||
right: 0; |
||||
background-color: #EE6666; |
||||
} |
||||
|
||||
|
||||
.loading6 .shape1 { |
||||
-webkit-animation: animation6shape1 2s linear 0s infinite normal; |
||||
animation: animation6shape1 2s linear 0s infinite normal; |
||||
} |
||||
|
||||
@-webkit-keyframes animation6shape1 { |
||||
0% { |
||||
-webkit-transform: translate(0, 0); |
||||
transform: translate(0, 0); |
||||
} |
||||
25% { |
||||
-webkit-transform: translate(0, 18px); |
||||
transform: translate(0, 18px); |
||||
} |
||||
50% { |
||||
-webkit-transform: translate(18px, 18px); |
||||
transform: translate(18px, 18px); |
||||
} |
||||
75% { |
||||
-webkit-transform: translate(18px, 0); |
||||
transform: translate(18px, 0); |
||||
} |
||||
} |
||||
|
||||
@keyframes animation6shape1 { |
||||
0% { |
||||
-webkit-transform: translate(0, 0); |
||||
transform: translate(0, 0); |
||||
} |
||||
25% { |
||||
-webkit-transform: translate(0, 18px); |
||||
transform: translate(0, 18px); |
||||
} |
||||
50% { |
||||
-webkit-transform: translate(18px, 18px); |
||||
transform: translate(18px, 18px); |
||||
} |
||||
75% { |
||||
-webkit-transform: translate(18px, 0); |
||||
transform: translate(18px, 0); |
||||
} |
||||
} |
||||
.loading6 .shape2 { |
||||
-webkit-animation: animation6shape2 2s linear 0s infinite normal; |
||||
animation: animation6shape2 2s linear 0s infinite normal; |
||||
} |
||||
|
||||
@-webkit-keyframes animation6shape2 { |
||||
0% { |
||||
-webkit-transform: translate(0, 0); |
||||
transform: translate(0, 0); |
||||
} |
||||
25% { |
||||
-webkit-transform: translate(-18px, 0); |
||||
transform: translate(-18px, 0); |
||||
} |
||||
50% { |
||||
-webkit-transform: translate(-18px, 18px); |
||||
transform: translate(-18px, 18px); |
||||
} |
||||
75% { |
||||
-webkit-transform: translate(0, 18px); |
||||
transform: translate(0, 18px); |
||||
} |
||||
} |
||||
|
||||
@keyframes animation6shape2 { |
||||
0% { |
||||
-webkit-transform: translate(0, 0); |
||||
transform: translate(0, 0); |
||||
} |
||||
25% { |
||||
-webkit-transform: translate(-18px, 0); |
||||
transform: translate(-18px, 0); |
||||
} |
||||
50% { |
||||
-webkit-transform: translate(-18px, 18px); |
||||
transform: translate(-18px, 18px); |
||||
} |
||||
75% { |
||||
-webkit-transform: translate(0, 18px); |
||||
transform: translate(0, 18px); |
||||
} |
||||
} |
||||
.loading6 .shape3 { |
||||
-webkit-animation: animation6shape3 2s linear 0s infinite normal; |
||||
animation: animation6shape3 2s linear 0s infinite normal; |
||||
} |
||||
|
||||
@-webkit-keyframes animation6shape3 { |
||||
0% { |
||||
-webkit-transform: translate(0, 0); |
||||
transform: translate(0, 0); |
||||
} |
||||
25% { |
||||
-webkit-transform: translate(18px, 0); |
||||
transform: translate(18px, 0); |
||||
} |
||||
50% { |
||||
-webkit-transform: translate(18px, -18px); |
||||
transform: translate(18px, -18px); |
||||
} |
||||
75% { |
||||
-webkit-transform: translate(0, -18px); |
||||
transform: translate(0, -18px); |
||||
} |
||||
} |
||||
|
||||
@keyframes animation6shape3 { |
||||
0% { |
||||
-webkit-transform: translate(0, 0); |
||||
transform: translate(0, 0); |
||||
} |
||||
25% { |
||||
-webkit-transform: translate(18px, 0); |
||||
transform: translate(18px, 0); |
||||
} |
||||
50% { |
||||
-webkit-transform: translate(18px, -18px); |
||||
transform: translate(18px, -18px); |
||||
} |
||||
75% { |
||||
-webkit-transform: translate(0, -18px); |
||||
transform: translate(0, -18px); |
||||
} |
||||
} |
||||
.loading6 .shape4 { |
||||
-webkit-animation: animation6shape4 2s linear 0s infinite normal; |
||||
animation: animation6shape4 2s linear 0s infinite normal; |
||||
} |
||||
|
||||
@-webkit-keyframes animation6shape4 { |
||||
0% { |
||||
-webkit-transform: translate(0, 0); |
||||
transform: translate(0, 0); |
||||
} |
||||
25% { |
||||
-webkit-transform: translate(0, -18px); |
||||
transform: translate(0, -18px); |
||||
} |
||||
50% { |
||||
-webkit-transform: translate(-18px, -18px); |
||||
transform: translate(-18px, -18px); |
||||
} |
||||
75% { |
||||
-webkit-transform: translate(-18px, 0); |
||||
transform: translate(-18px, 0); |
||||
} |
||||
} |
||||
|
||||
@keyframes animation6shape4 { |
||||
0% { |
||||
-webkit-transform: translate(0, 0); |
||||
transform: translate(0, 0); |
||||
} |
||||
25% { |
||||
-webkit-transform: translate(0, -18px); |
||||
transform: translate(0, -18px); |
||||
} |
||||
50% { |
||||
-webkit-transform: translate(-18px, -18px); |
||||
transform: translate(-18px, -18px); |
||||
} |
||||
75% { |
||||
-webkit-transform: translate(-18px, 0); |
||||
transform: translate(-18px, 0); |
||||
} |
||||
} |
||||
</style> |
@ -0,0 +1,36 @@
|
||||
<template> |
||||
<view> |
||||
<Loading1 v-if="loadingType==1"/> |
||||
<Loading2 v-if="loadingType==2"/> |
||||
<Loading3 v-if="loadingType==3"/> |
||||
<Loading4 v-if="loadingType==4"/> |
||||
<Loading5 v-if="loadingType==5"/> |
||||
</view> |
||||
</template> |
||||
|
||||
<script> |
||||
import Loading1 from "./loading1.vue"; |
||||
import Loading2 from "./loading2.vue"; |
||||
import Loading3 from "./loading3.vue"; |
||||
import Loading4 from "./loading4.vue"; |
||||
import Loading5 from "./loading5.vue"; |
||||
export default { |
||||
components:{Loading1,Loading2,Loading3,Loading4,Loading5}, |
||||
name: 'qiun-loading', |
||||
props: { |
||||
loadingType: { |
||||
type: Number, |
||||
default: 2 |
||||
}, |
||||
}, |
||||
data() { |
||||
return { |
||||
|
||||
}; |
||||
}, |
||||
} |
||||
</script> |
||||
|
||||
<style> |
||||
|
||||
</style> |
@ -0,0 +1,422 @@
|
||||
/* |
||||
* uCharts® |
||||
* 高性能跨平台图表库,支持H5、APP、小程序(微信/支付宝/百度/头条/QQ/360)、Vue、Taro等支持canvas的框架平台 |
||||
* Copyright (c) 2021 QIUN®秋云 https://www.ucharts.cn All rights reserved.
|
||||
* Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
|
||||
* 复制使用请保留本段注释,感谢支持开源! |
||||
*
|
||||
* uCharts®官方网站 |
||||
* https://www.uCharts.cn
|
||||
*
|
||||
* 开源地址: |
||||
* https://gitee.com/uCharts/uCharts
|
||||
*
|
||||
* uni-app插件市场地址: |
||||
* http://ext.dcloud.net.cn/plugin?id=271
|
||||
*
|
||||
*/ |
||||
|
||||
// 通用配置项
|
||||
|
||||
// 主题颜色配置:如每个图表类型需要不同主题,请在对应图表类型上更改color属性
|
||||
const color = ['#1890FF', '#91CB74', '#FAC858', '#EE6666', '#73C0DE', '#3CA272', '#FC8452', '#9A60B4', '#ea7ccc']; |
||||
|
||||
const cfe = { |
||||
//demotype为自定义图表类型
|
||||
"type": ["pie", "ring", "rose", "funnel", "line", "column", "area", "radar", "gauge","candle","demotype"], |
||||
//增加自定义图表类型,如果需要categories,请在这里加入您的图表类型例如最后的"demotype"
|
||||
"categories": ["line", "column", "area", "radar", "gauge", "candle","demotype"], |
||||
//instance为实例变量承载属性,option为eopts承载属性,不要删除
|
||||
"instance": {}, |
||||
"option": {}, |
||||
//下面是自定义format配置,因除H5端外的其他端无法通过props传递函数,只能通过此属性对应下标的方式来替换
|
||||
"formatter":{ |
||||
"tooltipDemo1":function(res){ |
||||
let result = '' |
||||
for (let i in res) { |
||||
if (i == 0) { |
||||
result += res[i].axisValueLabel + '年销售额' |
||||
} |
||||
let value = '--' |
||||
if (res[i].data !== null) { |
||||
value = res[i].data |
||||
} |
||||
// #ifdef H5
|
||||
result += '\n' + res[i].seriesName + ':' + value + ' 万元' |
||||
// #endif
|
||||
|
||||
// #ifdef APP-PLUS
|
||||
result += '<br/>' + res[i].marker + res[i].seriesName + ':' + value + ' 万元' |
||||
// #endif
|
||||
} |
||||
return result; |
||||
}, |
||||
legendFormat:function(name){ |
||||
return "自定义图例+"+name; |
||||
}, |
||||
yAxisFormatDemo:function (value, index) { |
||||
return value + '元'; |
||||
}, |
||||
seriesFormatDemo:function(res){ |
||||
return res.name + '年' + res.value + '元'; |
||||
} |
||||
}, |
||||
//这里演示了自定义您的图表类型的option,可以随意命名,之后在组件上 type="demotype" 后,组件会调用这个花括号里的option,如果组件上还存在eopts参数,会将demotype与eopts中option合并后渲染图表。
|
||||
"demotype":{ |
||||
"color": color, |
||||
//在这里填写echarts的option即可
|
||||
|
||||
}, |
||||
//下面是自定义配置,请添加项目所需的通用配置
|
||||
"column": { |
||||
"color": color, |
||||
"title": { |
||||
"text": '' |
||||
}, |
||||
"tooltip": { |
||||
"trigger": 'axis' |
||||
}, |
||||
"grid": { |
||||
"top": 30, |
||||
"bottom": 50, |
||||
"right": 15, |
||||
"left": 40 |
||||
}, |
||||
"legend": { |
||||
"bottom": 'left', |
||||
}, |
||||
"toolbox": { |
||||
"show": false, |
||||
}, |
||||
"xAxis": { |
||||
"type": 'category', |
||||
"axisLabel": { |
||||
"color": '#666666' |
||||
}, |
||||
"axisLine": { |
||||
"lineStyle": { |
||||
"color": '#CCCCCC' |
||||
} |
||||
}, |
||||
"boundaryGap": true, |
||||
"data": [] |
||||
}, |
||||
"yAxis": { |
||||
"type": 'value', |
||||
"axisTick": { |
||||
"show": false, |
||||
}, |
||||
"axisLabel": { |
||||
"color": '#666666' |
||||
}, |
||||
"axisLine": { |
||||
"lineStyle": { |
||||
"color": '#CCCCCC' |
||||
} |
||||
}, |
||||
}, |
||||
"seriesTemplate": { |
||||
"name": '', |
||||
"type": 'bar', |
||||
"data": [], |
||||
"barwidth": 20, |
||||
"label": { |
||||
"show": true, |
||||
"color": "#666666", |
||||
"position": 'top', |
||||
}, |
||||
}, |
||||
}, |
||||
"line": { |
||||
"color": color, |
||||
"title": { |
||||
"text": '' |
||||
}, |
||||
"tooltip": { |
||||
"trigger": 'axis' |
||||
}, |
||||
"grid": { |
||||
"top": 30, |
||||
"bottom": 50, |
||||
"right": 15, |
||||
"left": 40 |
||||
}, |
||||
"legend": { |
||||
"bottom": 'left', |
||||
}, |
||||
"toolbox": { |
||||
"show": false, |
||||
}, |
||||
"xAxis": { |
||||
"type": 'category', |
||||
"axisLabel": { |
||||
"color": '#666666' |
||||
}, |
||||
"axisLine": { |
||||
"lineStyle": { |
||||
"color": '#CCCCCC' |
||||
} |
||||
}, |
||||
"boundaryGap": true, |
||||
"data": [] |
||||
}, |
||||
"yAxis": { |
||||
"type": 'value', |
||||
"axisTick": { |
||||
"show": false, |
||||
}, |
||||
"axisLabel": { |
||||
"color": '#666666' |
||||
}, |
||||
"axisLine": { |
||||
"lineStyle": { |
||||
"color": '#CCCCCC' |
||||
} |
||||
}, |
||||
}, |
||||
"seriesTemplate": { |
||||
"name": '', |
||||
"type": 'line', |
||||
"data": [], |
||||
"barwidth": 20, |
||||
"label": { |
||||
"show": true, |
||||
"color": "#666666", |
||||
"position": 'top', |
||||
}, |
||||
}, |
||||
}, |
||||
"area": { |
||||
"color": color, |
||||
"title": { |
||||
"text": '' |
||||
}, |
||||
"tooltip": { |
||||
"trigger": 'axis' |
||||
}, |
||||
"grid": { |
||||
"top": 30, |
||||
"bottom": 50, |
||||
"right": 15, |
||||
"left": 40 |
||||
}, |
||||
"legend": { |
||||
"bottom": 'left', |
||||
}, |
||||
"toolbox": { |
||||
"show": false, |
||||
}, |
||||
"xAxis": { |
||||
"type": 'category', |
||||
"axisLabel": { |
||||
"color": '#666666' |
||||
}, |
||||
"axisLine": { |
||||
"lineStyle": { |
||||
"color": '#CCCCCC' |
||||
} |
||||
}, |
||||
"boundaryGap": true, |
||||
"data": [] |
||||
}, |
||||
"yAxis": { |
||||
"type": 'value', |
||||
"axisTick": { |
||||
"show": false, |
||||
}, |
||||
"axisLabel": { |
||||
"color": '#666666' |
||||
}, |
||||
"axisLine": { |
||||
"lineStyle": { |
||||
"color": '#CCCCCC' |
||||
} |
||||
}, |
||||
}, |
||||
"seriesTemplate": { |
||||
"name": '', |
||||
"type": 'line', |
||||
"data": [], |
||||
"areaStyle": {}, |
||||
"label": { |
||||
"show": true, |
||||
"color": "#666666", |
||||
"position": 'top', |
||||
}, |
||||
}, |
||||
}, |
||||
"pie": { |
||||
"color": color, |
||||
"title": { |
||||
"text": '' |
||||
}, |
||||
"tooltip": { |
||||
"trigger": 'item' |
||||
}, |
||||
"grid": { |
||||
"top": 40, |
||||
"bottom": 30, |
||||
"right": 15, |
||||
"left": 15 |
||||
}, |
||||
"legend": { |
||||
"bottom": 'left', |
||||
}, |
||||
"seriesTemplate": { |
||||
"name": '', |
||||
"type": 'pie', |
||||
"data": [], |
||||
"radius": '50%', |
||||
"label": { |
||||
"show": true, |
||||
"color": "#666666", |
||||
"position": 'top', |
||||
}, |
||||
}, |
||||
}, |
||||
"ring": { |
||||
"color": color, |
||||
"title": { |
||||
"text": '' |
||||
}, |
||||
"tooltip": { |
||||
"trigger": 'item' |
||||
}, |
||||
"grid": { |
||||
"top": 40, |
||||
"bottom": 30, |
||||
"right": 15, |
||||
"left": 15 |
||||
}, |
||||
"legend": { |
||||
"bottom": 'left', |
||||
}, |
||||
"seriesTemplate": { |
||||
"name": '', |
||||
"type": 'pie', |
||||
"data": [], |
||||
"radius": ['40%', '70%'], |
||||
"avoidLabelOverlap": false, |
||||
"label": { |
||||
"show": true, |
||||
"color": "#666666", |
||||
"position": 'top', |
||||
}, |
||||
"labelLine": { |
||||
"show": true |
||||
}, |
||||
}, |
||||
}, |
||||
"rose": { |
||||
"color": color, |
||||
"title": { |
||||
"text": '' |
||||
}, |
||||
"tooltip": { |
||||
"trigger": 'item' |
||||
}, |
||||
"legend": { |
||||
"top": 'bottom' |
||||
}, |
||||
"seriesTemplate": { |
||||
"name": '', |
||||
"type": 'pie', |
||||
"data": [], |
||||
"radius": "55%", |
||||
"center": ['50%', '50%'], |
||||
"roseType": 'area', |
||||
}, |
||||
}, |
||||
"funnel": { |
||||
"color": color, |
||||
"title": { |
||||
"text": '' |
||||
}, |
||||
"tooltip": { |
||||
"trigger": 'item', |
||||
"formatter": "{b} : {c}%" |
||||
}, |
||||
"legend": { |
||||
"top": 'bottom' |
||||
}, |
||||
"seriesTemplate": { |
||||
"name": '', |
||||
"type": 'funnel', |
||||
"left": '10%', |
||||
"top": 60, |
||||
"bottom": 60, |
||||
"width": '80%', |
||||
"min": 0, |
||||
"max": 100, |
||||
"minSize": '0%', |
||||
"maxSize": '100%', |
||||
"sort": 'descending', |
||||
"gap": 2, |
||||
"label": { |
||||
"show": true, |
||||
"position": 'inside' |
||||
}, |
||||
"labelLine": { |
||||
"length": 10, |
||||
"lineStyle": { |
||||
"width": 1, |
||||
"type": 'solid' |
||||
} |
||||
}, |
||||
"itemStyle": { |
||||
"bordercolor": '#fff', |
||||
"borderwidth": 1 |
||||
}, |
||||
"emphasis": { |
||||
"label": { |
||||
"fontSize": 20 |
||||
} |
||||
}, |
||||
"data": [], |
||||
}, |
||||
}, |
||||
"gauge": { |
||||
"color": color, |
||||
"tooltip": { |
||||
"formatter": '{a} <br/>{b} : {c}%' |
||||
}, |
||||
"seriesTemplate": { |
||||
"name": '业务指标', |
||||
"type": 'gauge', |
||||
"detail": {"formatter": '{value}%'}, |
||||
"data": [{"value": 50, "name": '完成率'}] |
||||
}, |
||||
}, |
||||
"candle": { |
||||
"xAxis": { |
||||
"data": [] |
||||
}, |
||||
"yAxis": {}, |
||||
"color": color, |
||||
"title": { |
||||
"text": '' |
||||
}, |
||||
"dataZoom": [{ |
||||
"type": 'inside', |
||||
"xAxisIndex": [0, 1], |
||||
"start": 10, |
||||
"end": 100 |
||||
}, |
||||
{ |
||||
"show": true, |
||||
"xAxisIndex": [0, 1], |
||||
"type": 'slider', |
||||
"bottom": 10, |
||||
"start": 10, |
||||
"end": 100 |
||||
} |
||||
], |
||||
"seriesTemplate": { |
||||
"name": '', |
||||
"type": 'k', |
||||
"data": [], |
||||
}, |
||||
} |
||||
} |
||||
|
||||
export default cfe; |
@ -0,0 +1,606 @@
|
||||
/* |
||||
* uCharts® |
||||
* 高性能跨平台图表库,支持H5、APP、小程序(微信/支付宝/百度/头条/QQ/360)、Vue、Taro等支持canvas的框架平台 |
||||
* Copyright (c) 2021 QIUN®秋云 https://www.ucharts.cn All rights reserved.
|
||||
* Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
|
||||
* 复制使用请保留本段注释,感谢支持开源! |
||||
*
|
||||
* uCharts®官方网站 |
||||
* https://www.uCharts.cn
|
||||
*
|
||||
* 开源地址: |
||||
* https://gitee.com/uCharts/uCharts
|
||||
*
|
||||
* uni-app插件市场地址: |
||||
* http://ext.dcloud.net.cn/plugin?id=271
|
||||
*
|
||||
*/ |
||||
|
||||
// 主题颜色配置:如每个图表类型需要不同主题,请在对应图表类型上更改color属性
|
||||
const color = ['#1890FF', '#91CB74', '#FAC858', '#EE6666', '#73C0DE', '#3CA272', '#FC8452', '#9A60B4', '#ea7ccc']; |
||||
|
||||
//事件转换函数,主要用作格式化x轴为时间轴,根据需求自行修改
|
||||
const formatDateTime = (timeStamp, returnType)=>{ |
||||
var date = new Date(); |
||||
date.setTime(timeStamp * 1000); |
||||
var y = date.getFullYear(); |
||||
var m = date.getMonth() + 1; |
||||
m = m < 10 ? ('0' + m) : m; |
||||
var d = date.getDate(); |
||||
d = d < 10 ? ('0' + d) : d; |
||||
var h = date.getHours(); |
||||
h = h < 10 ? ('0' + h) : h; |
||||
var minute = date.getMinutes(); |
||||
var second = date.getSeconds(); |
||||
minute = minute < 10 ? ('0' + minute) : minute; |
||||
second = second < 10 ? ('0' + second) : second; |
||||
if(returnType == 'full'){return y + '-' + m + '-' + d + ' '+ h +':' + minute + ':' + second;} |
||||
if(returnType == 'y-m-d'){return y + '-' + m + '-' + d;} |
||||
if(returnType == 'h:m'){return h +':' + minute;} |
||||
if(returnType == 'h:m:s'){return h +':' + minute +':' + second;} |
||||
return [y, m, d, h, minute, second]; |
||||
} |
||||
|
||||
const cfu = { |
||||
//demotype为自定义图表类型,一般不需要自定义图表类型,只需要改根节点上对应的类型即可
|
||||
"type":["pie","ring","rose","word","funnel","map","arcbar","line","column","mount","bar","area","radar","gauge","candle","mix","tline","tarea","scatter","bubble","demotype"], |
||||
"range":["饼状图","圆环图","玫瑰图","词云图","漏斗图","地图","圆弧进度条","折线图","柱状图","山峰图","条状图","区域图","雷达图","仪表盘","K线图","混合图","时间轴折线","时间轴区域","散点图","气泡图","自定义类型"], |
||||
//增加自定义图表类型,如果需要categories,请在这里加入您的图表类型,例如最后的"demotype"
|
||||
//自定义类型时需要注意"tline","tarea","scatter","bubble"等时间轴(矢量x轴)类图表,没有categories,不需要加入categories
|
||||
"categories":["line","column","mount","bar","area","radar","gauge","candle","mix","demotype"], |
||||
//instance为实例变量承载属性,不要删除
|
||||
"instance":{}, |
||||
//option为opts及eopts承载属性,不要删除
|
||||
"option":{}, |
||||
//下面是自定义format配置,因除H5端外的其他端无法通过props传递函数,只能通过此属性对应下标的方式来替换
|
||||
"formatter":{ |
||||
"yAxisDemo1":function(val, index, opts){return val+'元'}, |
||||
"yAxisDemo2":function(val, index, opts){return val.toFixed(2)}, |
||||
"xAxisDemo1":function(val, index, opts){return val+'年';}, |
||||
"xAxisDemo2":function(val, index, opts){return formatDateTime(val,'h:m')}, |
||||
"seriesDemo1":function(val, index, series, opts){return val+'元'}, |
||||
"tooltipDemo1":function(item, category, index, opts){ |
||||
if(index==0){ |
||||
return '随便用'+item.data+'年' |
||||
}else{ |
||||
return '其他我没改'+item.data+'天' |
||||
} |
||||
}, |
||||
"pieDemo":function(val, index, series, opts){ |
||||
if(index !== undefined){ |
||||
return series[index].name+':'+series[index].data+'元' |
||||
} |
||||
}, |
||||
}, |
||||
//这里演示了自定义您的图表类型的option,可以随意命名,之后在组件上 type="demotype" 后,组件会调用这个花括号里的option,如果组件上还存在opts参数,会将demotype与opts中option合并后渲染图表。
|
||||
"demotype":{ |
||||
//我这里把曲线图当做了自定义图表类型,您可以根据需要随意指定类型或配置
|
||||
"type": "line", |
||||
"color": color, |
||||
"padding": [15,10,0,15], |
||||
"xAxis": { |
||||
"disableGrid": true, |
||||
}, |
||||
"yAxis": { |
||||
"gridType": "dash", |
||||
"dashLength": 2, |
||||
}, |
||||
"legend": { |
||||
}, |
||||
"extra": { |
||||
"line": { |
||||
"type": "curve", |
||||
"width": 2 |
||||
}, |
||||
} |
||||
}, |
||||
//下面是自定义配置,请添加项目所需的通用配置
|
||||
"pie":{ |
||||
"type": "pie", |
||||
"color": color, |
||||
"padding": [5,5,5,5], |
||||
"extra": { |
||||
"pie": { |
||||
"activeOpacity": 0.5, |
||||
"activeRadius": 10, |
||||
"offsetAngle": 0, |
||||
"labelWidth": 15, |
||||
"border": true, |
||||
"borderWidth": 3, |
||||
"borderColor": "#FFFFFF" |
||||
}, |
||||
} |
||||
}, |
||||
"ring":{ |
||||
"type": "ring", |
||||
"color": color, |
||||
"padding": [5,5,5,5], |
||||
"rotate": false, |
||||
"dataLabel": true, |
||||
"legend": { |
||||
"show": true, |
||||
"position": "right", |
||||
"lineHeight": 25, |
||||
}, |
||||
"title": { |
||||
"name": "收益率", |
||||
"fontSize": 15, |
||||
"color": "#666666" |
||||
}, |
||||
"subtitle": { |
||||
"name": "70%", |
||||
"fontSize": 25, |
||||
"color": "#7cb5ec" |
||||
}, |
||||
"extra": { |
||||
"ring": { |
||||
"ringWidth":30, |
||||
"activeOpacity": 0.5, |
||||
"activeRadius": 10, |
||||
"offsetAngle": 0, |
||||
"labelWidth": 15, |
||||
"border": true, |
||||
"borderWidth": 3, |
||||
"borderColor": "#FFFFFF" |
||||
}, |
||||
}, |
||||
}, |
||||
"rose":{ |
||||
"type": "rose", |
||||
"color": color, |
||||
"padding": [5,5,5,5], |
||||
"legend": { |
||||
"show": true, |
||||
"position": "left", |
||||
"lineHeight": 25, |
||||
}, |
||||
"extra": { |
||||
"rose": { |
||||
"type": "area", |
||||
"minRadius": 50, |
||||
"activeOpacity": 0.5, |
||||
"activeRadius": 10, |
||||
"offsetAngle": 0, |
||||
"labelWidth": 15, |
||||
"border": false, |
||||
"borderWidth": 2, |
||||
"borderColor": "#FFFFFF" |
||||
}, |
||||
} |
||||
}, |
||||
"word":{ |
||||
"type": "word", |
||||
"color": color, |
||||
"extra": { |
||||
"word": { |
||||
"type": "normal", |
||||
"autoColors": false |
||||
} |
||||
} |
||||
}, |
||||
"funnel":{ |
||||
"type": "funnel", |
||||
"color": color, |
||||
"padding": [15,15,0,15], |
||||
"extra": { |
||||
"funnel": { |
||||
"activeOpacity": 0.3, |
||||
"activeWidth": 10, |
||||
"border": true, |
||||
"borderWidth": 2, |
||||
"borderColor": "#FFFFFF", |
||||
"fillOpacity": 1, |
||||
"labelAlign": "right" |
||||
}, |
||||
} |
||||
}, |
||||
"map":{ |
||||
"type": "map", |
||||
"color": color, |
||||
"padding": [0,0,0,0], |
||||
"dataLabel": true, |
||||
"extra": { |
||||
"map": { |
||||
"border": true, |
||||
"borderWidth": 1, |
||||
"borderColor": "#666666", |
||||
"fillOpacity": 0.6, |
||||
"activeBorderColor": "#F04864", |
||||
"activeFillColor": "#FACC14", |
||||
"activeFillOpacity": 1 |
||||
}, |
||||
} |
||||
}, |
||||
"arcbar":{ |
||||
"type": "arcbar", |
||||
"color": color, |
||||
"title": { |
||||
"name": "百分比", |
||||
"fontSize": 25, |
||||
"color": "#00FF00" |
||||
}, |
||||
"subtitle": { |
||||
"name": "默认标题", |
||||
"fontSize": 15, |
||||
"color": "#666666" |
||||
}, |
||||
"extra": { |
||||
"arcbar": { |
||||
"type": "default", |
||||
"width": 12, |
||||
"backgroundColor": "#E9E9E9", |
||||
"startAngle": 0.75, |
||||
"endAngle": 0.25, |
||||
"gap": 2 |
||||
} |
||||
} |
||||
}, |
||||
"line":{ |
||||
"type": "line", |
||||
"color": color, |
||||
"padding": [15,10,0,15], |
||||
"xAxis": { |
||||
"disableGrid": true, |
||||
}, |
||||
"yAxis": { |
||||
"gridType": "dash", |
||||
"dashLength": 2, |
||||
}, |
||||
"legend": { |
||||
}, |
||||
"extra": { |
||||
"line": { |
||||
"type": "straight", |
||||
"width": 2, |
||||
"activeType": "hollow" |
||||
}, |
||||
} |
||||
}, |
||||
"tline":{ |
||||
"type": "line", |
||||
"color": color, |
||||
"padding": [15,10,0,15], |
||||
"xAxis": { |
||||
"disableGrid": false, |
||||
"boundaryGap":"justify", |
||||
}, |
||||
"yAxis": { |
||||
"gridType": "dash", |
||||
"dashLength": 2, |
||||
"data":[ |
||||
{ |
||||
"min":0, |
||||
"max":80 |
||||
} |
||||
] |
||||
}, |
||||
"legend": { |
||||
}, |
||||
"extra": { |
||||
"line": { |
||||
"type": "curve", |
||||
"width": 2, |
||||
"activeType": "hollow" |
||||
}, |
||||
} |
||||
}, |
||||
"tarea":{ |
||||
"type": "area", |
||||
"color": color, |
||||
"padding": [15,10,0,15], |
||||
"xAxis": { |
||||
"disableGrid": true, |
||||
"boundaryGap":"justify", |
||||
}, |
||||
"yAxis": { |
||||
"gridType": "dash", |
||||
"dashLength": 2, |
||||
"data":[ |
||||
{ |
||||
"min":0, |
||||
"max":80 |
||||
} |
||||
] |
||||
}, |
||||
"legend": { |
||||
}, |
||||
"extra": { |
||||
"area": { |
||||
"type": "curve", |
||||
"opacity": 0.2, |
||||
"addLine": true, |
||||
"width": 2, |
||||
"gradient": true, |
||||
"activeType": "hollow" |
||||
}, |
||||
} |
||||
}, |
||||
"column":{ |
||||
"type": "column", |
||||
"color": color, |
||||
"padding": [15,15,0,5], |
||||
"xAxis": { |
||||
"disableGrid": true, |
||||
}, |
||||
"yAxis": { |
||||
"data":[{"min":0}] |
||||
}, |
||||
"legend": { |
||||
}, |
||||
"extra": { |
||||
"column": { |
||||
"type": "group", |
||||
"width": 30, |
||||
"activeBgColor": "#000000", |
||||
"activeBgOpacity": 0.08 |
||||
}, |
||||
} |
||||
}, |
||||
"mount":{ |
||||
"type": "mount", |
||||
"color": color, |
||||
"padding": [15,15,0,5], |
||||
"xAxis": { |
||||
"disableGrid": true, |
||||
}, |
||||
"yAxis": { |
||||
"data":[{"min":0}] |
||||
}, |
||||
"legend": { |
||||
}, |
||||
"extra": { |
||||
"mount": { |
||||
"type": "mount", |
||||
"widthRatio": 1.5, |
||||
}, |
||||
} |
||||
}, |
||||
"bar":{ |
||||
"type": "bar", |
||||
"color": color, |
||||
"padding": [15,30,0,5], |
||||
"xAxis": { |
||||
"boundaryGap":"justify", |
||||
"disableGrid":false, |
||||
"min":0, |
||||
"axisLine":false |
||||
}, |
||||
"yAxis": { |
||||
}, |
||||
"legend": { |
||||
}, |
||||
"extra": { |
||||
"bar": { |
||||
"type": "group", |
||||
"width": 30, |
||||
"meterBorde": 1, |
||||
"meterFillColor": "#FFFFFF", |
||||
"activeBgColor": "#000000", |
||||
"activeBgOpacity": 0.08 |
||||
}, |
||||
} |
||||
}, |
||||
"area":{ |
||||
"type": "area", |
||||
"color": color, |
||||
"padding": [15,15,0,15], |
||||
"xAxis": { |
||||
"disableGrid": true, |
||||
}, |
||||
"yAxis": { |
||||
"gridType": "dash", |
||||
"dashLength": 2, |
||||
}, |
||||
"legend": { |
||||
}, |
||||
"extra": { |
||||
"area": { |
||||
"type": "straight", |
||||
"opacity": 0.2, |
||||
"addLine": true, |
||||
"width": 2, |
||||
"gradient": false, |
||||
"activeType": "hollow" |
||||
}, |
||||
} |
||||
}, |
||||
"radar":{ |
||||
"type": "radar", |
||||
"color": color, |
||||
"padding": [5,5,5,5], |
||||
"dataLabel": false, |
||||
"legend": { |
||||
"show": true, |
||||
"position": "right", |
||||
"lineHeight": 25, |
||||
}, |
||||
"extra": { |
||||
"radar": { |
||||
"gridType": "radar", |
||||
"gridColor": "#CCCCCC", |
||||
"gridCount": 3, |
||||
"opacity": 0.2, |
||||
"max": 200, |
||||
"labelShow": true |
||||
}, |
||||
} |
||||
}, |
||||
"gauge":{ |
||||
"type": "gauge", |
||||
"color": color, |
||||
"title": { |
||||
"name": "66Km/H", |
||||
"fontSize": 25, |
||||
"color": "#2fc25b", |
||||
"offsetY": 50 |
||||
}, |
||||
"subtitle": { |
||||
"name": "实时速度", |
||||
"fontSize": 15, |
||||
"color": "#1890ff", |
||||
"offsetY": -50 |
||||
}, |
||||
"extra": { |
||||
"gauge": { |
||||
"type": "default", |
||||
"width": 30, |
||||
"labelColor": "#666666", |
||||
"startAngle": 0.75, |
||||
"endAngle": 0.25, |
||||
"startNumber": 0, |
||||
"endNumber": 100, |
||||
"labelFormat": "", |
||||
"splitLine": { |
||||
"fixRadius": 0, |
||||
"splitNumber": 10, |
||||
"width": 30, |
||||
"color": "#FFFFFF", |
||||
"childNumber": 5, |
||||
"childWidth": 12 |
||||
}, |
||||
"pointer": { |
||||
"width": 24, |
||||
"color": "auto" |
||||
} |
||||
} |
||||
} |
||||
}, |
||||
"candle":{ |
||||
"type": "candle", |
||||
"color": color, |
||||
"padding": [15,15,0,15], |
||||
"enableScroll": true, |
||||
"enableMarkLine": true, |
||||
"dataLabel": false, |
||||
"xAxis": { |
||||
"labelCount": 4, |
||||
"itemCount": 40, |
||||
"disableGrid": true, |
||||
"gridColor": "#CCCCCC", |
||||
"gridType": "solid", |
||||
"dashLength": 4, |
||||
"scrollShow": true, |
||||
"scrollAlign": "left", |
||||
"scrollColor": "#A6A6A6", |
||||
"scrollBackgroundColor": "#EFEBEF" |
||||
}, |
||||
"yAxis": { |
||||
}, |
||||
"legend": { |
||||
}, |
||||
"extra": { |
||||
"candle": { |
||||
"color": { |
||||
"upLine": "#f04864", |
||||
"upFill": "#f04864", |
||||
"downLine": "#2fc25b", |
||||
"downFill": "#2fc25b" |
||||
}, |
||||
"average": { |
||||
"show": true, |
||||
"name": ["MA5","MA10","MA30"], |
||||
"day": [5,10,20], |
||||
"color": ["#1890ff","#2fc25b","#facc14"] |
||||
} |
||||
}, |
||||
"markLine": { |
||||
"type": "dash", |
||||
"dashLength": 5, |
||||
"data": [ |
||||
{ |
||||
"value": 2150, |
||||
"lineColor": "#f04864", |
||||
"showLabel": true |
||||
}, |
||||
{ |
||||
"value": 2350, |
||||
"lineColor": "#f04864", |
||||
"showLabel": true |
||||
} |
||||
] |
||||
} |
||||
} |
||||
}, |
||||
"mix":{ |
||||
"type": "mix", |
||||
"color": color, |
||||
"padding": [15,15,0,15], |
||||
"xAxis": { |
||||
"disableGrid": true, |
||||
}, |
||||
"yAxis": { |
||||
"disabled": false, |
||||
"disableGrid": false, |
||||
"splitNumber": 5, |
||||
"gridType": "dash", |
||||
"dashLength": 4, |
||||
"gridColor": "#CCCCCC", |
||||
"padding": 10, |
||||
"showTitle": true, |
||||
"data": [] |
||||
}, |
||||
"legend": { |
||||
}, |
||||
"extra": { |
||||
"mix": { |
||||
"column": { |
||||
"width": 20 |
||||
} |
||||
}, |
||||
} |
||||
}, |
||||
"scatter":{ |
||||
"type": "scatter", |
||||
"color":color, |
||||
"padding":[15,15,0,15], |
||||
"dataLabel":false, |
||||
"xAxis": { |
||||
"disableGrid": false, |
||||
"gridType":"dash", |
||||
"splitNumber":5, |
||||
"boundaryGap":"justify", |
||||
"min":0 |
||||
}, |
||||
"yAxis": { |
||||
"disableGrid": false, |
||||
"gridType":"dash", |
||||
}, |
||||
"legend": { |
||||
}, |
||||
"extra": { |
||||
"scatter": { |
||||
}, |
||||
} |
||||
}, |
||||
"bubble":{ |
||||
"type": "bubble", |
||||
"color":color, |
||||
"padding":[15,15,0,15], |
||||
"xAxis": { |
||||
"disableGrid": false, |
||||
"gridType":"dash", |
||||
"splitNumber":5, |
||||
"boundaryGap":"justify", |
||||
"min":0, |
||||
"max":250 |
||||
}, |
||||
"yAxis": { |
||||
"disableGrid": false, |
||||
"gridType":"dash", |
||||
"data":[{ |
||||
"min":0, |
||||
"max":150 |
||||
}] |
||||
}, |
||||
"legend": { |
||||
}, |
||||
"extra": { |
||||
"bubble": { |
||||
"border":2, |
||||
"opacity": 0.5, |
||||
}, |
||||
} |
||||
} |
||||
} |
||||
|
||||
export default cfu; |
@ -0,0 +1,5 @@
|
||||
# uCharts JSSDK说明 |
||||
1、如不使用uCharts组件,可直接引用u-charts.js,打包编译后会`自动压缩`,压缩后体积约为`120kb`。 |
||||
2、如果120kb的体积仍需压缩,请手到uCharts官网通过在线定制选择您需要的图表。 |
||||
3、config-ucharts.js为uCharts组件的用户配置文件,升级前请`自行备份config-ucharts.js`文件,以免被强制覆盖。 |
||||
4、config-echarts.js为ECharts组件的用户配置文件,升级前请`自行备份config-echarts.js`文件,以免被强制覆盖。 |
@ -0,0 +1,201 @@
|
||||
Apache License |
||||
Version 2.0, January 2004 |
||||
http://www.apache.org/licenses/ |
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION |
||||
|
||||
1. Definitions. |
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction, |
||||
and distribution as defined by Sections 1 through 9 of this document. |
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by |
||||
the copyright owner that is granting the License. |
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all |
||||
other entities that control, are controlled by, or are under common |
||||
control with that entity. For the purposes of this definition, |
||||
"control" means (i) the power, direct or indirect, to cause the |
||||
direction or management of such entity, whether by contract or |
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the |
||||
outstanding shares, or (iii) beneficial ownership of such entity. |
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity |
||||
exercising permissions granted by this License. |
||||
|
||||
"Source" form shall mean the preferred form for making modifications, |
||||
including but not limited to software source code, documentation |
||||
source, and configuration files. |
||||
|
||||
"Object" form shall mean any form resulting from mechanical |
||||
transformation or translation of a Source form, including but |
||||
not limited to compiled object code, generated documentation, |
||||
and conversions to other media types. |
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or |
||||
Object form, made available under the License, as indicated by a |
||||
copyright notice that is included in or attached to the work |
||||
(an example is provided in the Appendix below). |
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object |
||||
form, that is based on (or derived from) the Work and for which the |
||||
editorial revisions, annotations, elaborations, or other modifications |
||||
represent, as a whole, an original work of authorship. For the purposes |
||||
of this License, Derivative Works shall not include works that remain |
||||
separable from, or merely link (or bind by name) to the interfaces of, |
||||
the Work and Derivative Works thereof. |
||||
|
||||
"Contribution" shall mean any work of authorship, including |
||||
the original version of the Work and any modifications or additions |
||||
to that Work or Derivative Works thereof, that is intentionally |
||||
submitted to Licensor for inclusion in the Work by the copyright owner |
||||
or by an individual or Legal Entity authorized to submit on behalf of |
||||
the copyright owner. For the purposes of this definition, "submitted" |
||||
means any form of electronic, verbal, or written communication sent |
||||
to the Licensor or its representatives, including but not limited to |
||||
communication on electronic mailing lists, source code control systems, |
||||
and issue tracking systems that are managed by, or on behalf of, the |
||||
Licensor for the purpose of discussing and improving the Work, but |
||||
excluding communication that is conspicuously marked or otherwise |
||||
designated in writing by the copyright owner as "Not a Contribution." |
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity |
||||
on behalf of whom a Contribution has been received by Licensor and |
||||
subsequently incorporated within the Work. |
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of |
||||
this License, each Contributor hereby grants to You a perpetual, |
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable |
||||
copyright license to reproduce, prepare Derivative Works of, |
||||
publicly display, publicly perform, sublicense, and distribute the |
||||
Work and such Derivative Works in Source or Object form. |
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of |
||||
this License, each Contributor hereby grants to You a perpetual, |
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable |
||||
(except as stated in this section) patent license to make, have made, |
||||
use, offer to sell, sell, import, and otherwise transfer the Work, |
||||
where such license applies only to those patent claims licensable |
||||
by such Contributor that are necessarily infringed by their |
||||
Contribution(s) alone or by combination of their Contribution(s) |
||||
with the Work to which such Contribution(s) was submitted. If You |
||||
institute patent litigation against any entity (including a |
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work |
||||
or a Contribution incorporated within the Work constitutes direct |
||||
or contributory patent infringement, then any patent licenses |
||||
granted to You under this License for that Work shall terminate |
||||
as of the date such litigation is filed. |
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the |
||||
Work or Derivative Works thereof in any medium, with or without |
||||
modifications, and in Source or Object form, provided that You |
||||
meet the following conditions: |
||||
|
||||
(a) You must give any other recipients of the Work or |
||||
Derivative Works a copy of this License; and |
||||
|
||||
(b) You must cause any modified files to carry prominent notices |
||||
stating that You changed the files; and |
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works |
||||
that You distribute, all copyright, patent, trademark, and |
||||
attribution notices from the Source form of the Work, |
||||
excluding those notices that do not pertain to any part of |
||||
the Derivative Works; and |
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its |
||||
distribution, then any Derivative Works that You distribute must |
||||
include a readable copy of the attribution notices contained |
||||
within such NOTICE file, excluding those notices that do not |
||||
pertain to any part of the Derivative Works, in at least one |
||||
of the following places: within a NOTICE text file distributed |
||||
as part of the Derivative Works; within the Source form or |
||||
documentation, if provided along with the Derivative Works; or, |
||||
within a display generated by the Derivative Works, if and |
||||
wherever such third-party notices normally appear. The contents |
||||
of the NOTICE file are for informational purposes only and |
||||
do not modify the License. You may add Your own attribution |
||||
notices within Derivative Works that You distribute, alongside |
||||
or as an addendum to the NOTICE text from the Work, provided |
||||
that such additional attribution notices cannot be construed |
||||
as modifying the License. |
||||
|
||||
You may add Your own copyright statement to Your modifications and |
||||
may provide additional or different license terms and conditions |
||||
for use, reproduction, or distribution of Your modifications, or |
||||
for any such Derivative Works as a whole, provided Your use, |
||||
reproduction, and distribution of the Work otherwise complies with |
||||
the conditions stated in this License. |
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise, |
||||
any Contribution intentionally submitted for inclusion in the Work |
||||
by You to the Licensor shall be under the terms and conditions of |
||||
this License, without any additional terms or conditions. |
||||
Notwithstanding the above, nothing herein shall supersede or modify |
||||
the terms of any separate license agreement you may have executed |
||||
with Licensor regarding such Contributions. |
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade |
||||
names, trademarks, service marks, or product names of the Licensor, |
||||
except as required for reasonable and customary use in describing the |
||||
origin of the Work and reproducing the content of the NOTICE file. |
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or |
||||
agreed to in writing, Licensor provides the Work (and each |
||||
Contributor provides its Contributions) on an "AS IS" BASIS, |
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or |
||||
implied, including, without limitation, any warranties or conditions |
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A |
||||
PARTICULAR PURPOSE. You are solely responsible for determining the |
||||
appropriateness of using or redistributing the Work and assume any |
||||
risks associated with Your exercise of permissions under this License. |
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory, |
||||
whether in tort (including negligence), contract, or otherwise, |
||||
unless required by applicable law (such as deliberate and grossly |
||||
negligent acts) or agreed to in writing, shall any Contributor be |
||||
liable to You for damages, including any direct, indirect, special, |
||||
incidental, or consequential damages of any character arising as a |
||||
result of this License or out of the use or inability to use the |
||||
Work (including but not limited to damages for loss of goodwill, |
||||
work stoppage, computer failure or malfunction, or any and all |
||||
other commercial damages or losses), even if such Contributor |
||||
has been advised of the possibility of such damages. |
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing |
||||
the Work or Derivative Works thereof, You may choose to offer, |
||||
and charge a fee for, acceptance of support, warranty, indemnity, |
||||
or other liability obligations and/or rights consistent with this |
||||
License. However, in accepting such obligations, You may act only |
||||
on Your own behalf and on Your sole responsibility, not on behalf |
||||
of any other Contributor, and only if You agree to indemnify, |
||||
defend, and hold each Contributor harmless for any liability |
||||
incurred by, or claims asserted against, such Contributor by reason |
||||
of your accepting any such warranty or additional liability. |
||||
|
||||
END OF TERMS AND CONDITIONS |
||||
|
||||
APPENDIX: How to apply the Apache License to your work. |
||||
|
||||
To apply the Apache License to your work, attach the following |
||||
boilerplate notice, with the fields enclosed by brackets "[]" |
||||
replaced with your own identifying information. (Don't include |
||||
the brackets!) The text should be enclosed in the appropriate |
||||
comment syntax for the file format. We also recommend that a |
||||
file or class name and description of purpose be included on the |
||||
same "printed page" as the copyright notice for easier |
||||
identification within third-party archives. |
||||
|
||||
Copyright [yyyy] [name of copyright owner] |
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License"); |
||||
you may not use this file except in compliance with the License. |
||||
You may obtain a copy of the License at |
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0 |
||||
|
||||
Unless required by applicable law or agreed to in writing, software |
||||
distributed under the License is distributed on an "AS IS" BASIS, |
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
See the License for the specific language governing permissions and |
||||
limitations under the License. |
@ -0,0 +1,80 @@
|
||||
{ |
||||
"id": "qiun-data-charts", |
||||
"displayName": "秋云 ucharts echarts 高性能跨全端图表组件", |
||||
"version": "2.5.0-20230101", |
||||
"description": "uCharts 新增正负柱状图!支持H5及APP用 ucharts echarts 渲染图表,uniapp可视化首选组件", |
||||
"keywords": [ |
||||
"ucharts", |
||||
"echarts", |
||||
"f2", |
||||
"图表", |
||||
"可视化" |
||||
], |
||||
"repository": "https://gitee.com/uCharts/uCharts", |
||||
"engines": { |
||||
}, |
||||
"dcloudext": { |
||||
"sale": { |
||||
"regular": { |
||||
"price": "0.00" |
||||
}, |
||||
"sourcecode": { |
||||
"price": "0.00" |
||||
} |
||||
}, |
||||
"contact": { |
||||
"qq": "474119" |
||||
}, |
||||
"declaration": { |
||||
"ads": "无", |
||||
"data": "插件不采集任何数据", |
||||
"permissions": "无" |
||||
}, |
||||
"npmurl": "https://www.npmjs.com/~qiun", |
||||
"type": "component-vue" |
||||
}, |
||||
"uni_modules": { |
||||
"dependencies": [], |
||||
"encrypt": [], |
||||
"platforms": { |
||||
"cloud": { |
||||
"tcb": "y", |
||||
"aliyun": "y" |
||||
}, |
||||
"client": { |
||||
"App": { |
||||
"app-vue": "y", |
||||
"app-nvue": "y" |
||||
}, |
||||
"H5-mobile": { |
||||
"Safari": "y", |
||||
"Android Browser": "y", |
||||
"微信浏览器(Android)": "y", |
||||
"QQ浏览器(Android)": "y" |
||||
}, |
||||
"H5-pc": { |
||||
"Chrome": "y", |
||||
"IE": "y", |
||||
"Edge": "y", |
||||
"Firefox": "y", |
||||
"Safari": "y" |
||||
}, |
||||
"小程序": { |
||||
"微信": "y", |
||||
"阿里": "y", |
||||
"百度": "y", |
||||
"字节跳动": "y", |
||||
"QQ": "y" |
||||
}, |
||||
"快应用": { |
||||
"华为": "y", |
||||
"联盟": "y" |
||||
}, |
||||
"Vue": { |
||||
"vue2": "y", |
||||
"vue3": "y" |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,84 @@
|
||||
 |
||||
|
||||
|
||||
[](https://gitee.com/uCharts/uCharts/stargazers) |
||||
[](https://gitee.com/uCharts/uCharts/members) |
||||
[](https://www.apache.org/licenses/LICENSE-2.0.html) |
||||
[](https://www.npmjs.com/~qiun) |
||||
|
||||
|
||||
## uCharts简介 |
||||
|
||||
`uCharts`是一款基于`canvas API`开发的适用于所有前端应用的图表库,开发者编写一套代码,可运行到 Web、iOS、Android(基于 uni-app / taro )、以及各种小程序(微信/支付宝/百度/头条/飞书/QQ/快手/钉钉/淘宝)、快应用等更多支持 canvas API 的平台。 |
||||
|
||||
## 官方网站 |
||||
|
||||
## [https://www.ucharts.cn](https://www.ucharts.cn) |
||||
|
||||
## 快速体验 |
||||
|
||||
一套代码编到多个平台,依次扫描二维码,亲自体验uCharts图表跨平台效果!其他平台请自行编译。 |
||||
|
||||
 |
||||
|
||||
 |
||||
|
||||
## 致开发者 |
||||
|
||||
感谢各位开发者`五年`来对秋云及uCharts的支持,uCharts的进步离不开各位开发者的鼓励与贡献。为更好的帮助各位开发者使用图表工具,我们推出了新版官网,增加了在线定制、问答社区、在线配置等一些增值服务,为确保您能更好的应用图表组件,建议您先`仔细阅读官网指南`以及`常见问题`,而不是下载下来`直接使用`。如仍然不能解决,请到`官网社区`或开通会员后加入`专属VIP会员群`提问将会很快得到回答。 |
||||
|
||||
## 视频教程 |
||||
|
||||
## [uCharts新手入门教程](https://www.bilibili.com/video/BV1qA411Q7se/?share_source=copy_web&vd_source=42a1242f9aaade6427736af69eb2e1d9) |
||||
|
||||
|
||||
## 社群支持 |
||||
|
||||
uCharts官方拥有5个2000人的QQ群及专属VIP会员群支持,庞大的用户量证明我们一直在努力,请各位放心使用!uCharts的开源图表组件的开发,团队付出了大量的时间与精力,经过四来的考验,不会有比较明显的bug,请各位放心使用。如果您有更好的想法,可以在`码云提交Pull Requests`以帮助更多开发者完成需求,再次感谢各位对uCharts的鼓励与支持! |
||||
|
||||
#### 官方交流群 |
||||
- 交流群1:371774600(已满) |
||||
- 交流群2:619841586(已满) |
||||
- 交流群3:955340127(已满) |
||||
- 交流群4:641669795(已满) |
||||
- 交流群5:236294809(只能扫码加入) |
||||
|
||||
 |
||||
|
||||
- 口令`uniapp` |
||||
|
||||
#### 专属VIP会员群 |
||||
- 开通会员后详见【账号详情】页面中顶部的滚动通知 |
||||
- 口令`您的用户ID` |
||||
|
||||
## 版权信息 |
||||
|
||||
uCharts始终坚持开源,遵循 [Apache Licence 2.0](https://www.apache.org/licenses/LICENSE-2.0.html) 开源协议,意味着您无需支付任何费用,即可将uCharts应用到您的产品中。 |
||||
|
||||
注意:这并不意味着您可以将uCharts应用到非法的领域,比如涉及赌博,暴力等方面。如因此产生纠纷或法律问题,uCharts相关方及秋云科技不承担任何责任。 |
||||
|
||||
## 合作伙伴 |
||||
|
||||
[](https://www.diygw.com/) |
||||
[](https://gitee.com/howcode/has-chat) |
||||
[](https://www.uviewui.com/) |
||||
[](https://ext.dcloud.net.cn/plugin?id=7088) |
||||
[](https://ext.dcloud.net.cn/publisher?id=202) |
||||
[](https://www.firstui.cn/) |
||||
[](https://ext.dcloud.net.cn/plugin?id=5169) |
||||
[](https://www.graceui.com/) |
||||
|
||||
|
||||
## 更新记录 |
||||
|
||||
详见官网指南中说明,[点击此处查看](https://www.ucharts.cn/v2/#/guide/index?id=100) |
||||
|
||||
|
||||
## 相关链接 |
||||
- [uCharts官网](https://www.ucharts.cn) |
||||
- [DCloud插件市场地址](https://ext.dcloud.net.cn/plugin?id=271) |
||||
- [uCharts码云开源托管地址](https://gitee.com/uCharts/uCharts) [](https://gitee.com/uCharts/uCharts/stargazers) |
||||
- [uCharts npm开源地址](https://www.ucharts.cn) |
||||
- [ECharts官网](https://echarts.apache.org/zh/index.html) |
||||
- [ECharts配置手册](https://echarts.apache.org/zh/option.html) |
||||
- [图表组件在项目中的应用 ReportPlus数据报表](https://www.ucharts.cn/v2/#/layout/info?id=1) |
@ -1,284 +0,0 @@
|
||||
import WxCanvas from './wx-canvas'; |
||||
import * as echarts from './echarts'; |
||||
|
||||
let ctx; |
||||
|
||||
function compareVersion(v1, v2) { |
||||
v1 = v1.split('.') |
||||
v2 = v2.split('.') |
||||
const len = Math.max(v1.length, v2.length) |
||||
|
||||
while (v1.length < len) { |
||||
v1.push('0') |
||||
} |
||||
while (v2.length < len) { |
||||
v2.push('0') |
||||
} |
||||
|
||||
for (let i = 0; i < len; i++) { |
||||
const num1 = parseInt(v1[i]) |
||||
const num2 = parseInt(v2[i]) |
||||
|
||||
if (num1 > num2) { |
||||
return 1 |
||||
} else if (num1 < num2) { |
||||
return -1 |
||||
} |
||||
} |
||||
return 0 |
||||
} |
||||
|
||||
Component({ |
||||
properties: { |
||||
canvasId: { |
||||
type: String, |
||||
value: 'ec-canvas' |
||||
}, |
||||
|
||||
ec: { |
||||
type: Object |
||||
}, |
||||
|
||||
forceUseOldCanvas: { |
||||
type: Boolean, |
||||
value: false |
||||
} |
||||
}, |
||||
|
||||
data: { |
||||
isUseNewCanvas: false |
||||
}, |
||||
|
||||
ready: function () { |
||||
// Disable prograssive because drawImage doesn't support DOM as parameter
|
||||
// See https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.drawImage.html
|
||||
echarts.registerPreprocessor(option => { |
||||
if (option && option.series) { |
||||
if (option.series.length > 0) { |
||||
option.series.forEach(series => { |
||||
series.progressive = 0; |
||||
}); |
||||
} |
||||
else if (typeof option.series === 'object') { |
||||
option.series.progressive = 0; |
||||
} |
||||
} |
||||
}); |
||||
|
||||
if (!this.data.ec) { |
||||
console.warn('组件需绑定 ec 变量,例:<ec-canvas id="mychart-dom-bar" ' |
||||
+ 'canvas-id="mychart-bar" ec="{{ ec }}"></ec-canvas>'); |
||||
return; |
||||
} |
||||
|
||||
if (!this.data.ec.lazyLoad) { |
||||
this.init(); |
||||
} |
||||
}, |
||||
|
||||
methods: { |
||||
init: function (callback) { |
||||
const version = wx.getSystemInfoSync().SDKVersion |
||||
|
||||
const canUseNewCanvas = compareVersion(version, '2.9.0') >= 0; |
||||
const forceUseOldCanvas = this.data.forceUseOldCanvas; |
||||
const isUseNewCanvas = canUseNewCanvas && !forceUseOldCanvas; |
||||
this.setData({ isUseNewCanvas }); |
||||
|
||||
if (forceUseOldCanvas && canUseNewCanvas) { |
||||
console.warn('开发者强制使用旧canvas,建议关闭'); |
||||
} |
||||
|
||||
if (isUseNewCanvas) { |
||||
// console.log('微信基础库版本大于2.9.0,开始使用<canvas type="2d"/>');
|
||||
// 2.9.0 可以使用 <canvas type="2d"></canvas>
|
||||
this.initByNewWay(callback); |
||||
} else { |
||||
const isValid = compareVersion(version, '1.9.91') >= 0 |
||||
if (!isValid) { |
||||
console.error('微信基础库版本过低,需大于等于 1.9.91。' |
||||
+ '参见:https://github.com/ecomfe/echarts-for-weixin' |
||||
+ '#%E5%BE%AE%E4%BF%A1%E7%89%88%E6%9C%AC%E8%A6%81%E6%B1%82'); |
||||
return; |
||||
} else { |
||||
console.warn('建议将微信基础库调整大于等于2.9.0版本。升级后绘图将有更好性能'); |
||||
this.initByOldWay(callback); |
||||
} |
||||
} |
||||
}, |
||||
|
||||
initByOldWay(callback) { |
||||
// 1.9.91 <= version < 2.9.0:原来的方式初始化
|
||||
ctx = wx.createCanvasContext(this.data.canvasId, this); |
||||
const canvas = new WxCanvas(ctx, this.data.canvasId, false); |
||||
|
||||
if (echarts.setPlatformAPI) { |
||||
echarts.setPlatformAPI({ |
||||
createCanvas: () => canvas, |
||||
}); |
||||
} else { |
||||
echarts.setCanvasCreator(() => canvas); |
||||
}; |
||||
// const canvasDpr = wx.getSystemInfoSync().pixelRatio // 微信旧的canvas不能传入dpr
|
||||
const canvasDpr = 1 |
||||
var query = wx.createSelectorQuery().in(this); |
||||
query.select('.ec-canvas').boundingClientRect(res => { |
||||
if (typeof callback === 'function') { |
||||
this.chart = callback(canvas, res.width, res.height, canvasDpr); |
||||
} |
||||
else if (this.data.ec && typeof this.data.ec.onInit === 'function') { |
||||
this.chart = this.data.ec.onInit(canvas, res.width, res.height, canvasDpr); |
||||
} |
||||
else { |
||||
this.triggerEvent('init', { |
||||
canvas: canvas, |
||||
width: res.width, |
||||
height: res.height, |
||||
canvasDpr: canvasDpr // 增加了dpr,可方便外面echarts.init
|
||||
}); |
||||
} |
||||
}).exec(); |
||||
}, |
||||
|
||||
initByNewWay(callback) { |
||||
// version >= 2.9.0:使用新的方式初始化
|
||||
const query = wx.createSelectorQuery().in(this) |
||||
query |
||||
.select('.ec-canvas') |
||||
.fields({ node: true, size: true }) |
||||
.exec(res => { |
||||
const canvasNode = res[0].node |
||||
this.canvasNode = canvasNode |
||||
|
||||
const canvasDpr = wx.getSystemInfoSync().pixelRatio |
||||
const canvasWidth = res[0].width |
||||
const canvasHeight = res[0].height |
||||
|
||||
const ctx = canvasNode.getContext('2d') |
||||
|
||||
const canvas = new WxCanvas(ctx, this.data.canvasId, true, canvasNode) |
||||
if (echarts.setPlatformAPI) { |
||||
echarts.setPlatformAPI({ |
||||
createCanvas: () => canvas, |
||||
loadImage: (src, onload, onerror) => { |
||||
if (canvasNode.createImage) { |
||||
const image = canvasNode.createImage(); |
||||
image.onload = onload; |
||||
image.onerror = onerror; |
||||
image.src = src; |
||||
return image; |
||||
} |
||||
console.error('加载图片依赖 `Canvas.createImage()` API,要求小程序基础库版本在 2.7.0 及以上。'); |
||||
// PENDING fallback?
|
||||
} |
||||
}) |
||||
} else { |
||||
echarts.setCanvasCreator(() => canvas) |
||||
} |
||||
|
||||
if (typeof callback === 'function') { |
||||
this.chart = callback(canvas, canvasWidth, canvasHeight, canvasDpr) |
||||
} else if (this.data.ec && typeof this.data.ec.onInit === 'function') { |
||||
this.chart = this.data.ec.onInit(canvas, canvasWidth, canvasHeight, canvasDpr) |
||||
} else { |
||||
this.triggerEvent('init', { |
||||
canvas: canvas, |
||||
width: canvasWidth, |
||||
height: canvasHeight, |
||||
dpr: canvasDpr |
||||
}) |
||||
} |
||||
}) |
||||
}, |
||||
canvasToTempFilePath(opt) { |
||||
if (this.data.isUseNewCanvas) { |
||||
// 新版
|
||||
const query = wx.createSelectorQuery().in(this) |
||||
query |
||||
.select('.ec-canvas') |
||||
.fields({ node: true, size: true }) |
||||
.exec(res => { |
||||
const canvasNode = res[0].node |
||||
opt.canvas = canvasNode |
||||
wx.canvasToTempFilePath(opt) |
||||
}) |
||||
} else { |
||||
// 旧的
|
||||
if (!opt.canvasId) { |
||||
opt.canvasId = this.data.canvasId; |
||||
} |
||||
ctx.draw(true, () => { |
||||
wx.canvasToTempFilePath(opt, this); |
||||
}); |
||||
} |
||||
}, |
||||
|
||||
touchStart(e) { |
||||
if (this.chart && e.touches.length > 0) { |
||||
var touch = e.touches[0]; |
||||
var handler = this.chart.getZr().handler; |
||||
handler.dispatch('mousedown', { |
||||
zrX: touch.x, |
||||
zrY: touch.y, |
||||
preventDefault: () => {}, |
||||
stopImmediatePropagation: () => {}, |
||||
stopPropagation: () => {} |
||||
}); |
||||
handler.dispatch('mousemove', { |
||||
zrX: touch.x, |
||||
zrY: touch.y, |
||||
preventDefault: () => {}, |
||||
stopImmediatePropagation: () => {}, |
||||
stopPropagation: () => {} |
||||
}); |
||||
handler.processGesture(wrapTouch(e), 'start'); |
||||
} |
||||
}, |
||||
|
||||
touchMove(e) { |
||||
if (this.chart && e.touches.length > 0) { |
||||
var touch = e.touches[0]; |
||||
var handler = this.chart.getZr().handler; |
||||
handler.dispatch('mousemove', { |
||||
zrX: touch.x, |
||||
zrY: touch.y, |
||||
preventDefault: () => {}, |
||||
stopImmediatePropagation: () => {}, |
||||
stopPropagation: () => {} |
||||
}); |
||||
handler.processGesture(wrapTouch(e), 'change'); |
||||
} |
||||
}, |
||||
|
||||
touchEnd(e) { |
||||
if (this.chart) { |
||||
const touch = e.changedTouches ? e.changedTouches[0] : {}; |
||||
var handler = this.chart.getZr().handler; |
||||
handler.dispatch('mouseup', { |
||||
zrX: touch.x, |
||||
zrY: touch.y, |
||||
preventDefault: () => {}, |
||||
stopImmediatePropagation: () => {}, |
||||
stopPropagation: () => {} |
||||
}); |
||||
handler.dispatch('click', { |
||||
zrX: touch.x, |
||||
zrY: touch.y, |
||||
preventDefault: () => {}, |
||||
stopImmediatePropagation: () => {}, |
||||
stopPropagation: () => {} |
||||
}); |
||||
handler.processGesture(wrapTouch(e), 'end'); |
||||
} |
||||
} |
||||
} |
||||
}); |
||||
|
||||
function wrapTouch(event) { |
||||
for (let i = 0; i < event.touches.length; ++i) { |
||||
const touch = event.touches[i]; |
||||
touch.offsetX = touch.x; |
||||
touch.offsetY = touch.y; |
||||
} |
||||
return event; |
||||
} |
@ -1,4 +0,0 @@
|
||||
{ |
||||
"component": true, |
||||
"usingComponents": {} |
||||
} |
@ -1,4 +0,0 @@
|
||||
<!-- 新的:接口对其了H5 --> |
||||
<canvas wx:if="{{isUseNewCanvas}}" type="2d" class="ec-canvas" canvas-id="{{ canvasId }}" bindinit="init" bindtouchstart="{{ ec.disableTouch ? '' : 'touchStart' }}" bindtouchmove="{{ ec.disableTouch ? '' : 'touchMove' }}" bindtouchend="{{ ec.disableTouch ? '' : 'touchEnd' }}"></canvas> |
||||
<!-- 旧的 --> |
||||
<canvas wx:else class="ec-canvas" canvas-id="{{ canvasId }}" bindinit="init" bindtouchstart="{{ ec.disableTouch ? '' : 'touchStart' }}" bindtouchmove="{{ ec.disableTouch ? '' : 'touchMove' }}" bindtouchend="{{ ec.disableTouch ? '' : 'touchEnd' }}"></canvas> |
@ -1,4 +0,0 @@
|
||||
.ec-canvas { |
||||
width: 100%; |
||||
height: 100%; |
||||
} |
@ -1,111 +0,0 @@
|
||||
export default class WxCanvas { |
||||
constructor(ctx, canvasId, isNew, canvasNode) { |
||||
this.ctx = ctx; |
||||
this.canvasId = canvasId; |
||||
this.chart = null; |
||||
this.isNew = isNew |
||||
if (isNew) { |
||||
this.canvasNode = canvasNode; |
||||
} |
||||
else { |
||||
this._initStyle(ctx); |
||||
} |
||||
|
||||
// this._initCanvas(zrender, ctx);
|
||||
|
||||
this._initEvent(); |
||||
} |
||||
|
||||
getContext(contextType) { |
||||
if (contextType === '2d') { |
||||
return this.ctx; |
||||
} |
||||
} |
||||
|
||||
// canvasToTempFilePath(opt) {
|
||||
// if (!opt.canvasId) {
|
||||
// opt.canvasId = this.canvasId;
|
||||
// }
|
||||
// return wx.canvasToTempFilePath(opt, this);
|
||||
// }
|
||||
|
||||
setChart(chart) { |
||||
this.chart = chart; |
||||
} |
||||
|
||||
addEventListener() { |
||||
// noop
|
||||
} |
||||
|
||||
attachEvent() { |
||||
// noop
|
||||
} |
||||
|
||||
detachEvent() { |
||||
// noop
|
||||
} |
||||
|
||||
_initCanvas(zrender, ctx) { |
||||
zrender.util.getContext = function () { |
||||
return ctx; |
||||
}; |
||||
|
||||
zrender.util.$override('measureText', function (text, font) { |
||||
ctx.font = font || '12px sans-serif'; |
||||
return ctx.measureText(text); |
||||
}); |
||||
} |
||||
|
||||
_initStyle(ctx) { |
||||
ctx.createRadialGradient = () => { |
||||
return ctx.createCircularGradient(arguments); |
||||
}; |
||||
} |
||||
|
||||
_initEvent() { |
||||
this.event = {}; |
||||
const eventNames = [{ |
||||
wxName: 'touchStart', |
||||
ecName: 'mousedown' |
||||
}, { |
||||
wxName: 'touchMove', |
||||
ecName: 'mousemove' |
||||
}, { |
||||
wxName: 'touchEnd', |
||||
ecName: 'mouseup' |
||||
}, { |
||||
wxName: 'touchEnd', |
||||
ecName: 'click' |
||||
}]; |
||||
eventNames.forEach(name => { |
||||
this.event[name.wxName] = e => { |
||||
const touch = e.touches[0]; |
||||
this.chart.getZr().handler.dispatch(name.ecName, { |
||||
zrX: name.wxName === 'tap' ? touch.clientX : touch.x, |
||||
zrY: name.wxName === 'tap' ? touch.clientY : touch.y, |
||||
preventDefault: () => {}, |
||||
stopImmediatePropagation: () => {}, |
||||
stopPropagation: () => {} |
||||
}); |
||||
}; |
||||
}); |
||||
} |
||||
|
||||
set width(w) { |
||||
if (this.canvasNode) this.canvasNode.width = w |
||||
} |
||||
set height(h) { |
||||
if (this.canvasNode) this.canvasNode.height = h |
||||
} |
||||
|
||||
get width() { |
||||
if (this.canvasNode) |
||||
return this.canvasNode.width |
||||
return 0 |
||||
} |
||||
get height() { |
||||
if (this.canvasNode) |
||||
return this.canvasNode.height |
||||
return 0 |
||||
} |
||||
} |
@ -1,220 +0,0 @@
|
||||
import { VantComponent } from '../common/component'; |
||||
import { pickerProps } from '../picker/shared'; |
||||
import { requestAnimationFrame } from '../common/utils'; |
||||
const EMPTY_CODE = '000000'; |
||||
VantComponent({ |
||||
classes: ['active-class', 'toolbar-class', 'column-class'], |
||||
props: Object.assign(Object.assign({}, pickerProps), { showToolbar: { |
||||
type: Boolean, |
||||
value: true, |
||||
}, value: { |
||||
type: String, |
||||
observer(value) { |
||||
this.code = value; |
||||
this.setValues(); |
||||
}, |
||||
}, areaList: { |
||||
type: Object, |
||||
value: {}, |
||||
observer: 'setValues', |
||||
}, columnsNum: { |
||||
type: null, |
||||
value: 3, |
||||
}, columnsPlaceholder: { |
||||
type: Array, |
||||
observer(val) { |
||||
this.setData({ |
||||
typeToColumnsPlaceholder: { |
||||
province: val[0] || '', |
||||
city: val[1] || '', |
||||
county: val[2] || '', |
||||
}, |
||||
}); |
||||
}, |
||||
} }), |
||||
data: { |
||||
columns: [{ values: [] }, { values: [] }, { values: [] }], |
||||
typeToColumnsPlaceholder: {}, |
||||
}, |
||||
mounted() { |
||||
requestAnimationFrame(() => { |
||||
this.setValues(); |
||||
}); |
||||
}, |
||||
methods: { |
||||
getPicker() { |
||||
if (this.picker == null) { |
||||
this.picker = this.selectComponent('.van-area__picker'); |
||||
} |
||||
return this.picker; |
||||
}, |
||||
onCancel(event) { |
||||
this.emit('cancel', event.detail); |
||||
}, |
||||
onConfirm(event) { |
||||
const { index } = event.detail; |
||||
let { value } = event.detail; |
||||
value = this.parseValues(value); |
||||
this.emit('confirm', { value, index }); |
||||
}, |
||||
emit(type, detail) { |
||||
detail.values = detail.value; |
||||
delete detail.value; |
||||
this.$emit(type, detail); |
||||
}, |
||||
parseValues(values) { |
||||
const { columnsPlaceholder } = this.data; |
||||
return values.map((value, index) => { |
||||
if (value && |
||||
(!value.code || value.name === columnsPlaceholder[index])) { |
||||
return Object.assign(Object.assign({}, value), { code: '', name: '' }); |
||||
} |
||||
return value; |
||||
}); |
||||
}, |
||||
onChange(event) { |
||||
var _a; |
||||
const { index, picker, value } = event.detail; |
||||
this.code = value[index].code; |
||||
(_a = this.setValues()) === null || _a === void 0 ? void 0 : _a.then(() => { |
||||
this.$emit('change', { |
||||
picker, |
||||
values: this.parseValues(picker.getValues()), |
||||
index, |
||||
}); |
||||
}); |
||||
}, |
||||
getConfig(type) { |
||||
const { areaList } = this.data; |
||||
return (areaList && areaList[`${type}_list`]) || {}; |
||||
}, |
||||
getList(type, code) { |
||||
if (type !== 'province' && !code) { |
||||
return []; |
||||
} |
||||
const { typeToColumnsPlaceholder } = this.data; |
||||
const list = this.getConfig(type); |
||||
let result = Object.keys(list).map((code) => ({ |
||||
code, |
||||
name: list[code], |
||||
})); |
||||
if (code != null) { |
||||
// oversea code
|
||||
if (code[0] === '9' && type === 'city') { |
||||
code = '9'; |
||||
} |
||||
result = result.filter((item) => item.code.indexOf(code) === 0); |
||||
} |
||||
if (typeToColumnsPlaceholder[type] && result.length) { |
||||
// set columns placeholder
|
||||
const codeFill = type === 'province' |
||||
? '' |
||||
: type === 'city' |
||||
? EMPTY_CODE.slice(2, 4) |
||||
: EMPTY_CODE.slice(4, 6); |
||||
result.unshift({ |
||||
code: `${code}${codeFill}`, |
||||
name: typeToColumnsPlaceholder[type], |
||||
}); |
||||
} |
||||
return result; |
||||
}, |
||||
getIndex(type, code) { |
||||
let compareNum = type === 'province' ? 2 : type === 'city' ? 4 : 6; |
||||
const list = this.getList(type, code.slice(0, compareNum - 2)); |
||||
// oversea code
|
||||
if (code[0] === '9' && type === 'province') { |
||||
compareNum = 1; |
||||
} |
||||
code = code.slice(0, compareNum); |
||||
for (let i = 0; i < list.length; i++) { |
||||
if (list[i].code.slice(0, compareNum) === code) { |
||||
return i; |
||||
} |
||||
} |
||||
return 0; |
||||
}, |
||||
setValues() { |
||||
const picker = this.getPicker(); |
||||
if (!picker) { |
||||
return; |
||||
} |
||||
let code = this.code || this.getDefaultCode(); |
||||
const provinceList = this.getList('province'); |
||||
const cityList = this.getList('city', code.slice(0, 2)); |
||||
const stack = []; |
||||
const indexes = []; |
||||
const { columnsNum } = this.data; |
||||
if (columnsNum >= 1) { |
||||
stack.push(picker.setColumnValues(0, provinceList, false)); |
||||
indexes.push(this.getIndex('province', code)); |
||||
} |
||||
if (columnsNum >= 2) { |
||||
stack.push(picker.setColumnValues(1, cityList, false)); |
||||
indexes.push(this.getIndex('city', code)); |
||||
if (cityList.length && code.slice(2, 4) === '00') { |
||||
[{ code }] = cityList; |
||||
} |
||||
} |
||||
if (columnsNum === 3) { |
||||
stack.push(picker.setColumnValues(2, this.getList('county', code.slice(0, 4)), false)); |
||||
indexes.push(this.getIndex('county', code)); |
||||
} |
||||
return Promise.all(stack) |
||||
.catch(() => { }) |
||||
.then(() => picker.setIndexes(indexes)) |
||||
.catch(() => { }); |
||||
}, |
||||
getDefaultCode() { |
||||
const { columnsPlaceholder } = this.data; |
||||
if (columnsPlaceholder.length) { |
||||
return EMPTY_CODE; |
||||
} |
||||
const countyCodes = Object.keys(this.getConfig('county')); |
||||
if (countyCodes[0]) { |
||||
return countyCodes[0]; |
||||
} |
||||
const cityCodes = Object.keys(this.getConfig('city')); |
||||
if (cityCodes[0]) { |
||||
return cityCodes[0]; |
||||
} |
||||
return ''; |
||||
}, |
||||
getValues() { |
||||
const picker = this.getPicker(); |
||||
if (!picker) { |
||||
return []; |
||||
} |
||||
return this.parseValues(picker.getValues().filter((value) => !!value)); |
||||
}, |
||||
getDetail() { |
||||
const values = this.getValues(); |
||||
const area = { |
||||
code: '', |
||||
country: '', |
||||
province: '', |
||||
city: '', |
||||
county: '', |
||||
}; |
||||
if (!values.length) { |
||||
return area; |
||||
} |
||||
const names = values.map((item) => item.name); |
||||
area.code = values[values.length - 1].code; |
||||
if (area.code[0] === '9') { |
||||
area.country = names[1] || ''; |
||||
area.province = names[2] || ''; |
||||
} |
||||
else { |
||||
area.province = names[0] || ''; |
||||
area.city = names[1] || ''; |
||||
area.county = names[2] || ''; |
||||
} |
||||
return area; |
||||
}, |
||||
reset(code) { |
||||
this.code = code || ''; |
||||
return this.setValues(); |
||||
}, |
||||
}, |
||||
}); |
@ -1,6 +0,0 @@
|
||||
{ |
||||
"component": true, |
||||
"usingComponents": { |
||||
"van-picker": "../picker/index" |
||||
} |
||||
} |
@ -1,20 +0,0 @@
|
||||
<wxs src="./index.wxs" module="computed" /> |
||||
|
||||
<van-picker |
||||
class="van-area__picker" |
||||
active-class="active-class" |
||||
toolbar-class="toolbar-class" |
||||
column-class="column-class" |
||||
show-toolbar="{{ showToolbar }}" |
||||
value-key="name" |
||||
title="{{ title }}" |
||||
loading="{{ loading }}" |
||||
columns="{{ computed.displayColumns(columns, columnsNum) }}" |
||||
item-height="{{ itemHeight }}" |
||||
visible-item-count="{{ visibleItemCount }}" |
||||
cancel-button-text="{{ cancelButtonText }}" |
||||
confirm-button-text="{{ confirmButtonText }}" |
||||
bind:change="onChange" |
||||
bind:confirm="onConfirm" |
||||
bind:cancel="onCancel" |
||||
/> |
@ -1,8 +0,0 @@
|
||||
/* eslint-disable */ |
||||
function displayColumns(columns, columnsNum) { |
||||
return columns.slice(0, +columnsNum); |
||||
} |
||||
|
||||
module.exports = { |
||||
displayColumns: displayColumns, |
||||
}; |
@ -1,64 +0,0 @@
|
||||
import { VantComponent } from '../common/component'; |
||||
import { button } from '../mixins/button'; |
||||
import { canIUseFormFieldButton } from '../common/version'; |
||||
const mixins = [button]; |
||||
if (canIUseFormFieldButton()) { |
||||
mixins.push('wx://form-field-button'); |
||||
} |
||||
VantComponent({ |
||||
mixins, |
||||
classes: ['hover-class', 'loading-class'], |
||||
data: { |
||||
baseStyle: '', |
||||
}, |
||||
props: { |
||||
formType: String, |
||||
icon: String, |
||||
classPrefix: { |
||||
type: String, |
||||
value: 'van-icon', |
||||
}, |
||||
plain: Boolean, |
||||
block: Boolean, |
||||
round: Boolean, |
||||
square: Boolean, |
||||
loading: Boolean, |
||||
hairline: Boolean, |
||||
disabled: Boolean, |
||||
loadingText: String, |
||||
customStyle: String, |
||||
loadingType: { |
||||
type: String, |
||||
value: 'circular', |
||||
}, |
||||
type: { |
||||
type: String, |
||||
value: 'default', |
||||
}, |
||||
dataset: null, |
||||
size: { |
||||
type: String, |
||||
value: 'normal', |
||||
}, |
||||
loadingSize: { |
||||
type: String, |
||||
value: '20px', |
||||
}, |
||||
color: String, |
||||
}, |
||||
methods: { |
||||
onClick(event) { |
||||
this.$emit('click', event); |
||||
const { canIUseGetUserProfile, openType, getUserProfileDesc, lang, } = this.data; |
||||
if (openType === 'getUserInfo' && canIUseGetUserProfile) { |
||||
wx.getUserProfile({ |
||||
desc: getUserProfileDesc || ' ', |
||||
lang: lang || 'en', |
||||
complete: (userProfile) => { |
||||
this.$emit('getuserinfo', userProfile); |
||||
}, |
||||
}); |
||||
} |
||||
}, |
||||
}, |
||||
}); |
@ -1,7 +0,0 @@
|
||||
{ |
||||
"component": true, |
||||
"usingComponents": { |
||||
"van-icon": "../icon/index", |
||||
"van-loading": "../loading/index" |
||||
} |
||||
} |
@ -1,56 +0,0 @@
|
||||
<wxs src="../wxs/utils.wxs" module="utils" /> |
||||
<wxs src="./index.wxs" module="computed" /> |
||||
|
||||
<button |
||||
id="{{ id || buttonId }}" |
||||
data-detail="{{ dataset }}" |
||||
class="custom-class {{ utils.bem('button', [type, size, { block, round, plain, square, loading, disabled, hairline, unclickable: disabled || loading }]) }} {{ hairline ? 'van-hairline--surround' : '' }}" |
||||
hover-class="{{ disabled || loading ? '' : 'van-button--active hover-class'}}" |
||||
lang="{{ lang }}" |
||||
form-type="{{ formType }}" |
||||
style="{{ computed.rootStyle({ plain, color, customStyle }) }}" |
||||
open-type="{{ disabled || loading || (canIUseGetUserProfile && openType === 'getUserInfo') ? '' : openType }}" |
||||
business-id="{{ businessId }}" |
||||
session-from="{{ sessionFrom }}" |
||||
send-message-title="{{ sendMessageTitle }}" |
||||
send-message-path="{{ sendMessagePath }}" |
||||
send-message-img="{{ sendMessageImg }}" |
||||
show-message-card="{{ showMessageCard }}" |
||||
app-parameter="{{ appParameter }}" |
||||
aria-label="{{ ariaLabel }}" |
||||
bindtap="{{ disabled || loading ? '' : 'onClick' }}" |
||||
bindgetuserinfo="onGetUserInfo" |
||||
bindcontact="onContact" |
||||
bindgetphonenumber="onGetPhoneNumber" |
||||
bindgetrealtimephonenumber="onGetRealTimePhoneNumber" |
||||
bindagreeprivacyauthorization="onAgreePrivacyAuthorization" |
||||
binderror="onError" |
||||
bindlaunchapp="onLaunchApp" |
||||
bindopensetting="onOpenSetting" |
||||
bindchooseavatar="onChooseAvatar" |
||||
> |
||||
<block wx:if="{{ loading }}"> |
||||
<van-loading |
||||
custom-class="loading-class" |
||||
size="{{ loadingSize }}" |
||||
type="{{ loadingType }}" |
||||
color="{{ computed.loadingColor({ type, color, plain }) }}" |
||||
/> |
||||
<view wx:if="{{ loadingText }}" class="van-button__loading-text"> |
||||
{{ loadingText }} |
||||
</view> |
||||
</block> |
||||
<block wx:else> |
||||
<van-icon |
||||
wx:if="{{ icon }}" |
||||
size="1.2em" |
||||
name="{{ icon }}" |
||||
class-prefix="{{ classPrefix }}" |
||||
class="van-button__icon" |
||||
custom-style="line-height: inherit;" |
||||
/> |
||||
<view class="van-button__text"> |
||||
<slot /> |
||||
</view> |
||||
</block> |
||||
</button> |
@ -1,39 +0,0 @@
|
||||
/* eslint-disable */ |
||||
var style = require('../wxs/style.wxs'); |
||||
|
||||
function rootStyle(data) { |
||||
if (!data.color) { |
||||
return data.customStyle; |
||||
} |
||||
|
||||
var properties = { |
||||
color: data.plain ? data.color : '#fff', |
||||
background: data.plain ? null : data.color, |
||||
}; |
||||
|
||||
// hide border when color is linear-gradient |
||||
if (data.color.indexOf('gradient') !== -1) { |
||||
properties.border = 0; |
||||
} else { |
||||
properties['border-color'] = data.color; |
||||
} |
||||
|
||||
return style([properties, data.customStyle]); |
||||
} |
||||
|
||||
function loadingColor(data) { |
||||
if (data.plain) { |
||||
return data.color ? data.color : '#c9c9c9'; |
||||
} |
||||
|
||||
if (data.type === 'default') { |
||||
return '#c9c9c9'; |
||||
} |
||||
|
||||
return '#fff'; |
||||
} |
||||
|
||||
module.exports = { |
||||
rootStyle: rootStyle, |
||||
loadingColor: loadingColor, |
||||
}; |
@ -1 +0,0 @@
|
||||
@import '../common/index.wxss';.van-button{-webkit-text-size-adjust:100%;align-items:center;-webkit-appearance:none;border-radius:var(--button-border-radius,2px);box-sizing:border-box;display:inline-flex;font-size:var(--button-default-font-size,16px);height:var(--button-default-height,44px);justify-content:center;line-height:var(--button-line-height,20px);padding:0;position:relative;text-align:center;transition:opacity .2s;vertical-align:middle}.van-button:before{background-color:#000;border:inherit;border-color:#000;border-radius:inherit;content:" ";height:100%;left:50%;opacity:0;position:absolute;top:50%;transform:translate(-50%,-50%);width:100%}.van-button:after{border-width:0}.van-button--active:before{opacity:.15}.van-button--unclickable:after{display:none}.van-button--default{background:var(--button-default-background-color,#fff);border:var(--button-border-width,1px) solid var(--button-default-border-color,#ebedf0);color:var(--button-default-color,#323233)}.van-button--primary{background:var(--button-primary-background-color,#07c160);border:var(--button-border-width,1px) solid var(--button-primary-border-color,#07c160);color:var(--button-primary-color,#fff)}.van-button--info{background:var(--button-info-background-color,#1989fa);border:var(--button-border-width,1px) solid var(--button-info-border-color,#1989fa);color:var(--button-info-color,#fff)}.van-button--danger{background:var(--button-danger-background-color,#ee0a24);border:var(--button-border-width,1px) solid var(--button-danger-border-color,#ee0a24);color:var(--button-danger-color,#fff)}.van-button--warning{background:var(--button-warning-background-color,#ff976a);border:var(--button-border-width,1px) solid var(--button-warning-border-color,#ff976a);color:var(--button-warning-color,#fff)}.van-button--plain{background:var(--button-plain-background-color,#fff)}.van-button--plain.van-button--primary{color:var(--button-primary-background-color,#07c160)}.van-button--plain.van-button--info{color:var(--button-info-background-color,#1989fa)}.van-button--plain.van-button--danger{color:var(--button-danger-background-color,#ee0a24)}.van-button--plain.van-button--warning{color:var(--button-warning-background-color,#ff976a)}.van-button--large{height:var(--button-large-height,50px);width:100%}.van-button--normal{font-size:var(--button-normal-font-size,14px);padding:0 15px}.van-button--small{font-size:var(--button-small-font-size,12px);height:var(--button-small-height,30px);min-width:var(--button-small-min-width,60px);padding:0 var(--padding-xs,8px)}.van-button--mini{display:inline-block;font-size:var(--button-mini-font-size,10px);height:var(--button-mini-height,22px);min-width:var(--button-mini-min-width,50px)}.van-button--mini+.van-button--mini{margin-left:5px}.van-button--block{display:flex;width:100%}.van-button--round{border-radius:var(--button-round-border-radius,999px)}.van-button--square{border-radius:0}.van-button--disabled{opacity:var(--button-disabled-opacity,.5)}.van-button__text{display:inline}.van-button__icon+.van-button__text:not(:empty),.van-button__loading-text{margin-left:4px}.van-button__icon{line-height:inherit!important;min-width:1em;vertical-align:top}.van-button--hairline{border-width:0;padding-top:1px}.van-button--hairline:after{border-color:inherit;border-radius:calc(var(--button-border-radius, 2px)*2);border-width:1px}.van-button--hairline.van-button--round:after{border-radius:var(--button-round-border-radius,999px)}.van-button--hairline.van-button--square:after{border-radius:0} |
@ -1,70 +0,0 @@
|
||||
<wxs src="./index.wxs" module="computed" /> |
||||
<wxs src="../wxs/utils.wxs" module="utils" /> |
||||
<view class="van-calendar"> |
||||
<header |
||||
title="{{ title }}" |
||||
showTitle="{{ showTitle }}" |
||||
subtitle="{{ subtitle }}" |
||||
showSubtitle="{{ showSubtitle }}" |
||||
firstDayOfWeek="{{ firstDayOfWeek }}" |
||||
bind:click-subtitle="onClickSubtitle" |
||||
> |
||||
<slot name="title" slot="title"></slot> |
||||
</header> |
||||
|
||||
<scroll-view |
||||
class="van-calendar__body" |
||||
scroll-y |
||||
scroll-into-view="{{ scrollIntoView }}" |
||||
> |
||||
<month |
||||
wx:for="{{ computed.getMonths(minDate, maxDate) }}" |
||||
wx:key="index" |
||||
id="month{{ index }}" |
||||
class="month" |
||||
data-date="{{ item }}" |
||||
date="{{ item }}" |
||||
type="{{ type }}" |
||||
color="{{ color }}" |
||||
minDate="{{ minDate }}" |
||||
maxDate="{{ maxDate }}" |
||||
showMark="{{ showMark }}" |
||||
formatter="{{ formatter }}" |
||||
rowHeight="{{ rowHeight }}" |
||||
currentDate="{{ currentDate }}" |
||||
showSubtitle="{{ showSubtitle }}" |
||||
allowSameDay="{{ allowSameDay }}" |
||||
showMonthTitle="{{ index !== 0 || !showSubtitle }}" |
||||
firstDayOfWeek="{{ firstDayOfWeek }}" |
||||
bind:click="onClickDay" |
||||
/> |
||||
</scroll-view> |
||||
|
||||
<view |
||||
class="{{ utils.bem('calendar__footer', { safeAreaInsetBottom }) }}" |
||||
> |
||||
<slot name="footer"></slot> |
||||
</view> |
||||
|
||||
<view |
||||
class="{{ utils.bem('calendar__footer', { safeAreaInsetBottom }) }}" |
||||
> |
||||
<van-button |
||||
wx:if="{{ showConfirm }}" |
||||
round |
||||
block |
||||
type="danger" |
||||
color="{{ color }}" |
||||
custom-class="van-calendar__confirm" |
||||
disabled="{{ computed.getButtonDisabled(type, currentDate, minRange) }}" |
||||
nativeType="text" |
||||
bind:click="onConfirm" |
||||
> |
||||
{{ |
||||
computed.getButtonDisabled(type, currentDate, minRange) |
||||
? confirmDisabledText |
||||
: confirmText |
||||
}} |
||||
</van-button> |
||||
</view> |
||||
</view> |
@ -1 +0,0 @@
|
||||
export {}; |
@ -1,37 +0,0 @@
|
||||
import { VantComponent } from '../../../common/component'; |
||||
VantComponent({ |
||||
props: { |
||||
title: { |
||||
type: String, |
||||
value: '日期选择', |
||||
}, |
||||
subtitle: String, |
||||
showTitle: Boolean, |
||||
showSubtitle: Boolean, |
||||
firstDayOfWeek: { |
||||
type: Number, |
||||
observer: 'initWeekDay', |
||||
}, |
||||
}, |
||||
data: { |
||||
weekdays: [], |
||||
}, |
||||
created() { |
||||
this.initWeekDay(); |
||||
}, |
||||
methods: { |
||||
initWeekDay() { |
||||
const defaultWeeks = ['日', '一', '二', '三', '四', '五', '六']; |
||||
const firstDayOfWeek = this.data.firstDayOfWeek || 0; |
||||
this.setData({ |
||||
weekdays: [ |
||||
...defaultWeeks.slice(firstDayOfWeek, 7), |
||||
...defaultWeeks.slice(0, firstDayOfWeek), |
||||
], |
||||
}); |
||||
}, |
||||
onClickSubtitle(event) { |
||||
this.$emit('click-subtitle', event); |
||||
}, |
||||
}, |
||||
}); |
@ -1,3 +0,0 @@
|
||||
{ |
||||
"component": true |
||||
} |
@ -1,16 +0,0 @@
|
||||
<view class="van-calendar__header"> |
||||
<block wx:if="{{ showTitle }}"> |
||||
<view class="van-calendar__header-title"><slot name="title"></slot></view> |
||||
<view class="van-calendar__header-title">{{ title }}</view> |
||||
</block> |
||||
|
||||
<view wx:if="{{ showSubtitle }}" class="van-calendar__header-subtitle" bind:tap="onClickSubtitle"> |
||||
{{ subtitle }} |
||||
</view> |
||||
|
||||
<view class="van-calendar__weekdays"> |
||||
<view wx:for="{{ weekdays }}" wx:key="index" class="van-calendar__weekday"> |
||||
{{ item }} |
||||
</view> |
||||
</view> |
||||
</view> |
@ -1 +0,0 @@
|
||||
@import '../../../common/index.wxss';.van-calendar__header{box-shadow:var(--calendar-header-box-shadow,0 2px 10px hsla(220,1%,50%,.16));flex-shrink:0}.van-calendar__header-subtitle,.van-calendar__header-title{font-weight:var(--font-weight-bold,500);height:var(--calendar-header-title-height,44px);line-height:var(--calendar-header-title-height,44px);text-align:center}.van-calendar__header-title+.van-calendar__header-title,.van-calendar__header-title:empty{display:none}.van-calendar__header-title:empty+.van-calendar__header-title{display:block!important}.van-calendar__weekdays{display:flex}.van-calendar__weekday{flex:1;font-size:var(--calendar-weekdays-font-size,12px);line-height:var(--calendar-weekdays-height,30px);text-align:center} |
@ -1,6 +0,0 @@
|
||||
export interface Day { |
||||
date: Date; |
||||
type: string; |
||||
text: number; |
||||
bottomInfo?: string; |
||||
} |
@ -1,154 +0,0 @@
|
||||
import { VantComponent } from '../../../common/component'; |
||||
import { getMonthEndDay, compareDay, getPrevDay, getNextDay, } from '../../utils'; |
||||
VantComponent({ |
||||
props: { |
||||
date: { |
||||
type: null, |
||||
observer: 'setDays', |
||||
}, |
||||
type: { |
||||
type: String, |
||||
observer: 'setDays', |
||||
}, |
||||
color: String, |
||||
minDate: { |
||||
type: null, |
||||
observer: 'setDays', |
||||
}, |
||||
maxDate: { |
||||
type: null, |
||||
observer: 'setDays', |
||||
}, |
||||
showMark: Boolean, |
||||
rowHeight: null, |
||||
formatter: { |
||||
type: null, |
||||
observer: 'setDays', |
||||
}, |
||||
currentDate: { |
||||
type: null, |
||||
observer: 'setDays', |
||||
}, |
||||
firstDayOfWeek: { |
||||
type: Number, |
||||
observer: 'setDays', |
||||
}, |
||||
allowSameDay: Boolean, |
||||
showSubtitle: Boolean, |
||||
showMonthTitle: Boolean, |
||||
}, |
||||
data: { |
||||
visible: true, |
||||
days: [], |
||||
}, |
||||
methods: { |
||||
onClick(event) { |
||||
const { index } = event.currentTarget.dataset; |
||||
const item = this.data.days[index]; |
||||
if (item.type !== 'disabled') { |
||||
this.$emit('click', item); |
||||
} |
||||
}, |
||||
setDays() { |
||||
const days = []; |
||||
const startDate = new Date(this.data.date); |
||||
const year = startDate.getFullYear(); |
||||
const month = startDate.getMonth(); |
||||
const totalDay = getMonthEndDay(startDate.getFullYear(), startDate.getMonth() + 1); |
||||
for (let day = 1; day <= totalDay; day++) { |
||||
const date = new Date(year, month, day); |
||||
const type = this.getDayType(date); |
||||
let config = { |
||||
date, |
||||
type, |
||||
text: day, |
||||
bottomInfo: this.getBottomInfo(type), |
||||
}; |
||||
if (this.data.formatter) { |
||||
config = this.data.formatter(config); |
||||
} |
||||
days.push(config); |
||||
} |
||||
this.setData({ days }); |
||||
}, |
||||
getMultipleDayType(day) { |
||||
const { currentDate } = this.data; |
||||
if (!Array.isArray(currentDate)) { |
||||
return ''; |
||||
} |
||||
const isSelected = (date) => currentDate.some((item) => compareDay(item, date) === 0); |
||||
if (isSelected(day)) { |
||||
const prevDay = getPrevDay(day); |
||||
const nextDay = getNextDay(day); |
||||
const prevSelected = isSelected(prevDay); |
||||
const nextSelected = isSelected(nextDay); |
||||
if (prevSelected && nextSelected) { |
||||
return 'multiple-middle'; |
||||
} |
||||
if (prevSelected) { |
||||
return 'end'; |
||||
} |
||||
return nextSelected ? 'start' : 'multiple-selected'; |
||||
} |
||||
return ''; |
||||
}, |
||||
getRangeDayType(day) { |
||||
const { currentDate, allowSameDay } = this.data; |
||||
if (!Array.isArray(currentDate)) { |
||||
return ''; |
||||
} |
||||
const [startDay, endDay] = currentDate; |
||||
if (!startDay) { |
||||
return ''; |
||||
} |
||||
const compareToStart = compareDay(day, startDay); |
||||
if (!endDay) { |
||||
return compareToStart === 0 ? 'start' : ''; |
||||
} |
||||
const compareToEnd = compareDay(day, endDay); |
||||
if (compareToStart === 0 && compareToEnd === 0 && allowSameDay) { |
||||
return 'start-end'; |
||||
} |
||||
if (compareToStart === 0) { |
||||
return 'start'; |
||||
} |
||||
if (compareToEnd === 0) { |
||||
return 'end'; |
||||
} |
||||
if (compareToStart > 0 && compareToEnd < 0) { |
||||
return 'middle'; |
||||
} |
||||
return ''; |
||||
}, |
||||
getDayType(day) { |
||||
const { type, minDate, maxDate, currentDate } = this.data; |
||||
if (compareDay(day, minDate) < 0 || compareDay(day, maxDate) > 0) { |
||||
return 'disabled'; |
||||
} |
||||
if (type === 'single') { |
||||
return compareDay(day, currentDate) === 0 ? 'selected' : ''; |
||||
} |
||||
if (type === 'multiple') { |
||||
return this.getMultipleDayType(day); |
||||
} |
||||
/* istanbul ignore else */ |
||||
if (type === 'range') { |
||||
return this.getRangeDayType(day); |
||||
} |
||||
return ''; |
||||
}, |
||||
getBottomInfo(type) { |
||||
if (this.data.type === 'range') { |
||||
if (type === 'start') { |
||||
return '开始'; |
||||
} |
||||
if (type === 'end') { |
||||
return '结束'; |
||||
} |
||||
if (type === 'start-end') { |
||||
return '开始/结束'; |
||||
} |
||||
} |
||||
}, |
||||
}, |
||||
}); |
@ -1,3 +0,0 @@
|
||||
{ |
||||
"component": true |
||||
} |
@ -1,39 +0,0 @@
|
||||
<wxs src="./index.wxs" module="computed"></wxs> |
||||
<wxs src="../../../wxs/utils.wxs" module="utils" /> |
||||
|
||||
<view class="van-calendar__month" style="{{ computed.getMonthStyle(visible, date, rowHeight) }}"> |
||||
<view wx:if="{{ showMonthTitle }}" class="van-calendar__month-title"> |
||||
{{ computed.formatMonthTitle(date) }} |
||||
</view> |
||||
|
||||
<view wx:if="{{ visible }}" class="van-calendar__days"> |
||||
<view wx:if="{{ showMark }}" class="van-calendar__month-mark"> |
||||
{{ computed.getMark(date) }} |
||||
</view> |
||||
|
||||
<view |
||||
wx:for="{{ days }}" |
||||
wx:key="index" |
||||
style="{{ computed.getDayStyle(item.type, index, date, rowHeight, color, firstDayOfWeek) }}" |
||||
class="{{ utils.bem('calendar__day', [item.type]) }} {{ item.className }}" |
||||
data-index="{{ index }}" |
||||
bindtap="onClick" |
||||
> |
||||
<view wx:if="{{ item.type === 'selected' }}" class="van-calendar__selected-day" style="width: {{ rowHeight }}px; height: {{ rowHeight }}px; background: {{ color }}"> |
||||
<view wx:if="{{ item.topInfo }}" class="van-calendar__top-info">{{ item.topInfo }}</view> |
||||
{{ item.text }} |
||||
<view wx:if="{{ item.bottomInfo }}" class="van-calendar__bottom-info"> |
||||
{{ item.bottomInfo }} |
||||
</view> |
||||
</view> |
||||
|
||||
<view wx:else> |
||||
<view wx:if="{{ item.topInfo }}" class="van-calendar__top-info">{{ item.topInfo }}</view> |
||||
{{ item.text }} |
||||
<view wx:if="{{ item.bottomInfo }}" class="van-calendar__bottom-info"> |
||||
{{ item.bottomInfo }} |
||||
</view> |
||||
</view> |
||||
</view> |
||||
</view> |
||||
</view> |
@ -1,71 +0,0 @@
|
||||
/* eslint-disable */ |
||||
var utils = require('../../utils.wxs'); |
||||
|
||||
function getMark(date) { |
||||
return getDate(date).getMonth() + 1; |
||||
} |
||||
|
||||
var ROW_HEIGHT = 64; |
||||
|
||||
function getDayStyle(type, index, date, rowHeight, color, firstDayOfWeek) { |
||||
var style = []; |
||||
var current = getDate(date).getDay() || 7; |
||||
var offset = current < firstDayOfWeek ? (7 - firstDayOfWeek + current) : |
||||
current === 7 && firstDayOfWeek === 0 ? 0 : |
||||
(current - firstDayOfWeek); |
||||
|
||||
if (index === 0) { |
||||
style.push(['margin-left', (100 * offset) / 7 + '%']); |
||||
} |
||||
|
||||
if (rowHeight !== ROW_HEIGHT) { |
||||
style.push(['height', rowHeight + 'px']); |
||||
} |
||||
|
||||
if (color) { |
||||
if ( |
||||
type === 'start' || |
||||
type === 'end' || |
||||
type === 'start-end' || |
||||
type === 'multiple-selected' || |
||||
type === 'multiple-middle' |
||||
) { |
||||
style.push(['background', color]); |
||||
} else if (type === 'middle') { |
||||
style.push(['color', color]); |
||||
} |
||||
} |
||||
|
||||
return style |
||||
.map(function(item) { |
||||
return item.join(':'); |
||||
}) |
||||
.join(';'); |
||||
} |
||||
|
||||
function formatMonthTitle(date) { |
||||
date = getDate(date); |
||||
return date.getFullYear() + '年' + (date.getMonth() + 1) + '月'; |
||||
} |
||||
|
||||
function getMonthStyle(visible, date, rowHeight) { |
||||
if (!visible) { |
||||
date = getDate(date); |
||||
|
||||
var totalDay = utils.getMonthEndDay( |
||||
date.getFullYear(), |
||||
date.getMonth() + 1 |
||||
); |
||||
var offset = getDate(date).getDay(); |
||||
var padding = Math.ceil((totalDay + offset) / 7) * rowHeight; |
||||
|
||||
return 'padding-bottom:' + padding + 'px'; |
||||
} |
||||
} |
||||
|
||||
module.exports = { |
||||
getMark: getMark, |
||||
getDayStyle: getDayStyle, |
||||
formatMonthTitle: formatMonthTitle, |
||||
getMonthStyle: getMonthStyle |
||||
}; |
@ -1 +0,0 @@
|
||||
@import '../../../common/index.wxss';.van-calendar{background-color:var(--calendar-background-color,#fff);display:flex;flex-direction:column;height:100%}.van-calendar__month-title{font-size:var(--calendar-month-title-font-size,14px);font-weight:var(--font-weight-bold,500);height:var(--calendar-header-title-height,44px);line-height:var(--calendar-header-title-height,44px);text-align:center}.van-calendar__days{display:flex;flex-wrap:wrap;position:relative;-webkit-user-select:none;user-select:none}.van-calendar__month-mark{color:var(--calendar-month-mark-color,rgba(242,243,245,.8));font-size:var(--calendar-month-mark-font-size,160px);left:50%;pointer-events:none;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:0}.van-calendar__day,.van-calendar__selected-day{align-items:center;display:flex;justify-content:center;text-align:center}.van-calendar__day{font-size:var(--calendar-day-font-size,16px);height:var(--calendar-day-height,64px);position:relative;width:14.285%}.van-calendar__day--end,.van-calendar__day--multiple-middle,.van-calendar__day--multiple-selected,.van-calendar__day--start,.van-calendar__day--start-end{background-color:var(--calendar-range-edge-background-color,#ee0a24);color:var(--calendar-range-edge-color,#fff)}.van-calendar__day--start{border-radius:4px 0 0 4px}.van-calendar__day--end{border-radius:0 4px 4px 0}.van-calendar__day--multiple-selected,.van-calendar__day--start-end{border-radius:4px}.van-calendar__day--middle{color:var(--calendar-range-middle-color,#ee0a24)}.van-calendar__day--middle:after{background-color:currentColor;bottom:0;content:"";left:0;opacity:var(--calendar-range-middle-background-opacity,.1);position:absolute;right:0;top:0}.van-calendar__day--disabled{color:var(--calendar-day-disabled-color,#c8c9cc);cursor:default}.van-calendar__bottom-info,.van-calendar__top-info{font-size:var(--calendar-info-font-size,10px);left:0;line-height:var(--calendar-info-line-height,14px);position:absolute;right:0}@media (max-width:350px){.van-calendar__bottom-info,.van-calendar__top-info{font-size:9px}}.van-calendar__top-info{top:6px}.van-calendar__bottom-info{bottom:6px}.van-calendar__selected-day{background-color:var(--calendar-selected-day-background-color,#ee0a24);border-radius:4px;color:var(--calendar-selected-day-color,#fff);height:var(--calendar-selected-day-size,54px);width:var(--calendar-selected-day-size,54px)} |
@ -1,360 +0,0 @@
|
||||
import { VantComponent } from '../common/component'; |
||||
import { ROW_HEIGHT, getPrevDay, getNextDay, getToday, compareDay, copyDates, calcDateNum, formatMonthTitle, compareMonth, getMonths, getDayByOffset, } from './utils'; |
||||
import Toast from '../toast/toast'; |
||||
import { requestAnimationFrame } from '../common/utils'; |
||||
const initialMinDate = getToday().getTime(); |
||||
const initialMaxDate = (() => { |
||||
const now = getToday(); |
||||
return new Date(now.getFullYear(), now.getMonth() + 6, now.getDate()).getTime(); |
||||
})(); |
||||
const getTime = (date) => date instanceof Date ? date.getTime() : date; |
||||
VantComponent({ |
||||
props: { |
||||
title: { |
||||
type: String, |
||||
value: '日期选择', |
||||
}, |
||||
color: String, |
||||
show: { |
||||
type: Boolean, |
||||
observer(val) { |
||||
if (val) { |
||||
this.initRect(); |
||||
this.scrollIntoView(); |
||||
} |
||||
}, |
||||
}, |
||||
formatter: null, |
||||
confirmText: { |
||||
type: String, |
||||
value: '确定', |
||||
}, |
||||
confirmDisabledText: { |
||||
type: String, |
||||
value: '确定', |
||||
}, |
||||
rangePrompt: String, |
||||
showRangePrompt: { |
||||
type: Boolean, |
||||
value: true, |
||||
}, |
||||
defaultDate: { |
||||
type: null, |
||||
value: getToday().getTime(), |
||||
observer(val) { |
||||
this.setData({ currentDate: val }); |
||||
this.scrollIntoView(); |
||||
}, |
||||
}, |
||||
allowSameDay: Boolean, |
||||
type: { |
||||
type: String, |
||||
value: 'single', |
||||
observer: 'reset', |
||||
}, |
||||
minDate: { |
||||
type: Number, |
||||
value: initialMinDate, |
||||
}, |
||||
maxDate: { |
||||
type: Number, |
||||
value: initialMaxDate, |
||||
}, |
||||
position: { |
||||
type: String, |
||||
value: 'bottom', |
||||
}, |
||||
rowHeight: { |
||||
type: null, |
||||
value: ROW_HEIGHT, |
||||
}, |
||||
round: { |
||||
type: Boolean, |
||||
value: true, |
||||
}, |
||||
poppable: { |
||||
type: Boolean, |
||||
value: true, |
||||
}, |
||||
showMark: { |
||||
type: Boolean, |
||||
value: true, |
||||
}, |
||||
showTitle: { |
||||
type: Boolean, |
||||
value: true, |
||||
}, |
||||
showConfirm: { |
||||
type: Boolean, |
||||
value: true, |
||||
}, |
||||
showSubtitle: { |
||||
type: Boolean, |
||||
value: true, |
||||
}, |
||||
safeAreaInsetBottom: { |
||||
type: Boolean, |
||||
value: true, |
||||
}, |
||||
closeOnClickOverlay: { |
||||
type: Boolean, |
||||
value: true, |
||||
}, |
||||
maxRange: { |
||||
type: null, |
||||
value: null, |
||||
}, |
||||
minRange: { |
||||
type: Number, |
||||
value: 1, |
||||
}, |
||||
firstDayOfWeek: { |
||||
type: Number, |
||||
value: 0, |
||||
}, |
||||
readonly: Boolean, |
||||
rootPortal: { |
||||
type: Boolean, |
||||
value: false, |
||||
}, |
||||
}, |
||||
data: { |
||||
subtitle: '', |
||||
currentDate: null, |
||||
scrollIntoView: '', |
||||
}, |
||||
watch: { |
||||
minDate() { |
||||
this.initRect(); |
||||
}, |
||||
maxDate() { |
||||
this.initRect(); |
||||
}, |
||||
}, |
||||
created() { |
||||
this.setData({ |
||||
currentDate: this.getInitialDate(this.data.defaultDate), |
||||
}); |
||||
}, |
||||
mounted() { |
||||
if (this.data.show || !this.data.poppable) { |
||||
this.initRect(); |
||||
this.scrollIntoView(); |
||||
} |
||||
}, |
||||
methods: { |
||||
reset() { |
||||
this.setData({ currentDate: this.getInitialDate(this.data.defaultDate) }); |
||||
this.scrollIntoView(); |
||||
}, |
||||
initRect() { |
||||
if (this.contentObserver != null) { |
||||
this.contentObserver.disconnect(); |
||||
} |
||||
const contentObserver = this.createIntersectionObserver({ |
||||
thresholds: [0, 0.1, 0.9, 1], |
||||
observeAll: true, |
||||
}); |
||||
this.contentObserver = contentObserver; |
||||
contentObserver.relativeTo('.van-calendar__body'); |
||||
contentObserver.observe('.month', (res) => { |
||||
if (res.boundingClientRect.top <= res.relativeRect.top) { |
||||
// @ts-ignore
|
||||
this.setData({ subtitle: formatMonthTitle(res.dataset.date) }); |
||||
} |
||||
}); |
||||
}, |
||||
limitDateRange(date, minDate = null, maxDate = null) { |
||||
minDate = minDate || this.data.minDate; |
||||
maxDate = maxDate || this.data.maxDate; |
||||
if (compareDay(date, minDate) === -1) { |
||||
return minDate; |
||||
} |
||||
if (compareDay(date, maxDate) === 1) { |
||||
return maxDate; |
||||
} |
||||
return date; |
||||
}, |
||||
getInitialDate(defaultDate = null) { |
||||
const { type, minDate, maxDate, allowSameDay } = this.data; |
||||
if (!defaultDate) |
||||
return []; |
||||
const now = getToday().getTime(); |
||||
if (type === 'range') { |
||||
if (!Array.isArray(defaultDate)) { |
||||
defaultDate = []; |
||||
} |
||||
const [startDay, endDay] = defaultDate || []; |
||||
const startDate = getTime(startDay || now); |
||||
const start = this.limitDateRange(startDate, minDate, allowSameDay ? startDate : getPrevDay(new Date(maxDate)).getTime()); |
||||
const date = getTime(endDay || now); |
||||
const end = this.limitDateRange(date, allowSameDay ? date : getNextDay(new Date(minDate)).getTime()); |
||||
return [start, end]; |
||||
} |
||||
if (type === 'multiple') { |
||||
if (Array.isArray(defaultDate)) { |
||||
return defaultDate.map((date) => this.limitDateRange(date)); |
||||
} |
||||
return [this.limitDateRange(now)]; |
||||
} |
||||
if (!defaultDate || Array.isArray(defaultDate)) { |
||||
defaultDate = now; |
||||
} |
||||
return this.limitDateRange(defaultDate); |
||||
}, |
||||
scrollIntoView() { |
||||
requestAnimationFrame(() => { |
||||
const { currentDate, type, show, poppable, minDate, maxDate } = this.data; |
||||
if (!currentDate) |
||||
return; |
||||
// @ts-ignore
|
||||
const targetDate = type === 'single' ? currentDate : currentDate[0]; |
||||
const displayed = show || !poppable; |
||||
if (!targetDate || !displayed) { |
||||
return; |
||||
} |
||||
const months = getMonths(minDate, maxDate); |
||||
months.some((month, index) => { |
||||
if (compareMonth(month, targetDate) === 0) { |
||||
this.setData({ scrollIntoView: `month${index}` }); |
||||
return true; |
||||
} |
||||
return false; |
||||
}); |
||||
}); |
||||
}, |
||||
onOpen() { |
||||
this.$emit('open'); |
||||
}, |
||||
onOpened() { |
||||
this.$emit('opened'); |
||||
}, |
||||
onClose() { |
||||
this.$emit('close'); |
||||
}, |
||||
onClosed() { |
||||
this.$emit('closed'); |
||||
}, |
||||
onClickDay(event) { |
||||
if (this.data.readonly) { |
||||
return; |
||||
} |
||||
let { date } = event.detail; |
||||
const { type, currentDate, allowSameDay } = this.data; |
||||
if (type === 'range') { |
||||
// @ts-ignore
|
||||
const [startDay, endDay] = currentDate; |
||||
if (startDay && !endDay) { |
||||
const compareToStart = compareDay(date, startDay); |
||||
if (compareToStart === 1) { |
||||
const { days } = this.selectComponent('.month').data; |
||||
days.some((day, index) => { |
||||
const isDisabled = day.type === 'disabled' && |
||||
getTime(startDay) < getTime(day.date) && |
||||
getTime(day.date) < getTime(date); |
||||
if (isDisabled) { |
||||
({ date } = days[index - 1]); |
||||
} |
||||
return isDisabled; |
||||
}); |
||||
this.select([startDay, date], true); |
||||
} |
||||
else if (compareToStart === -1) { |
||||
this.select([date, null]); |
||||
} |
||||
else if (allowSameDay) { |
||||
this.select([date, date], true); |
||||
} |
||||
} |
||||
else { |
||||
this.select([date, null]); |
||||
} |
||||
} |
||||
else if (type === 'multiple') { |
||||
let selectedIndex; |
||||
// @ts-ignore
|
||||
const selected = currentDate.some((dateItem, index) => { |
||||
const equal = compareDay(dateItem, date) === 0; |
||||
if (equal) { |
||||
selectedIndex = index; |
||||
} |
||||
return equal; |
||||
}); |
||||
if (selected) { |
||||
// @ts-ignore
|
||||
const cancelDate = currentDate.splice(selectedIndex, 1); |
||||
this.setData({ currentDate }); |
||||
this.unselect(cancelDate); |
||||
} |
||||
else { |
||||
// @ts-ignore
|
||||
this.select([...currentDate, date]); |
||||
} |
||||
} |
||||
else { |
||||
this.select(date, true); |
||||
} |
||||
}, |
||||
unselect(dateArray) { |
||||
const date = dateArray[0]; |
||||
if (date) { |
||||
this.$emit('unselect', copyDates(date)); |
||||
} |
||||
}, |
||||
select(date, complete) { |
||||
if (complete && this.data.type === 'range') { |
||||
const valid = this.checkRange(date); |
||||
if (!valid) { |
||||
// auto selected to max range if showConfirm
|
||||
if (this.data.showConfirm) { |
||||
this.emit([ |
||||
date[0], |
||||
getDayByOffset(date[0], this.data.maxRange - 1), |
||||
]); |
||||
} |
||||
else { |
||||
this.emit(date); |
||||
} |
||||
return; |
||||
} |
||||
} |
||||
this.emit(date); |
||||
if (complete && !this.data.showConfirm) { |
||||
this.onConfirm(); |
||||
} |
||||
}, |
||||
emit(date) { |
||||
this.setData({ |
||||
currentDate: Array.isArray(date) ? date.map(getTime) : getTime(date), |
||||
}); |
||||
this.$emit('select', copyDates(date)); |
||||
}, |
||||
checkRange(date) { |
||||
const { maxRange, rangePrompt, showRangePrompt } = this.data; |
||||
if (maxRange && calcDateNum(date) > maxRange) { |
||||
if (showRangePrompt) { |
||||
Toast({ |
||||
context: this, |
||||
message: rangePrompt || `选择天数不能超过 ${maxRange} 天`, |
||||
}); |
||||
} |
||||
this.$emit('over-range'); |
||||
return false; |
||||
} |
||||
return true; |
||||
}, |
||||
onConfirm() { |
||||
if (this.data.type === 'range' && |
||||
!this.checkRange(this.data.currentDate)) { |
||||
return; |
||||
} |
||||
wx.nextTick(() => { |
||||
// @ts-ignore
|
||||
this.$emit('confirm', copyDates(this.data.currentDate)); |
||||
}); |
||||
}, |
||||
onClickSubtitle(event) { |
||||
this.$emit('click-subtitle', event); |
||||
}, |
||||
}, |
||||
}); |
@ -1,10 +0,0 @@
|
||||
{ |
||||
"component": true, |
||||
"usingComponents": { |
||||
"header": "./components/header/index", |
||||
"month": "./components/month/index", |
||||
"van-button": "../button/index", |
||||
"van-popup": "../popup/index", |
||||
"van-toast": "../toast/index" |
||||
} |
||||
} |
@ -1,27 +0,0 @@
|
||||
<wxs src="./index.wxs" module="computed" /> |
||||
<wxs src="../wxs/utils.wxs" module="utils" /> |
||||
|
||||
<import src="./calendar.wxml" /> |
||||
|
||||
<van-popup |
||||
wx:if="{{ poppable }}" |
||||
custom-class="van-calendar__popup--{{ position }}" |
||||
close-icon-class="van-calendar__close-icon" |
||||
show="{{ show }}" |
||||
round="{{ round }}" |
||||
position="{{ position }}" |
||||
closeable="{{ showTitle || showSubtitle }}" |
||||
close-on-click-overlay="{{ closeOnClickOverlay }}" |
||||
safe-area-inset-bottom="{{ safeAreaInsetBottom }}" |
||||
root-portal="{{ rootPortal }}" |
||||
bind:enter="onOpen" |
||||
bind:close="onClose" |
||||
bind:after-enter="onOpened" |
||||
bind:after-leave="onClosed" |
||||
> |
||||
<include src="./calendar.wxml" /> |
||||
</van-popup> |
||||
|
||||
<include wx:else src="./calendar.wxml" /> |
||||
|
||||
<van-toast id="van-toast" /> |
@ -1,37 +0,0 @@
|
||||
/* eslint-disable */ |
||||
var utils = require('./utils.wxs'); |
||||
|
||||
function getMonths(minDate, maxDate) { |
||||
var months = []; |
||||
var cursor = getDate(minDate); |
||||
|
||||
cursor.setDate(1); |
||||
|
||||
do { |
||||
months.push(cursor.getTime()); |
||||
cursor.setMonth(cursor.getMonth() + 1); |
||||
} while (utils.compareMonth(cursor, getDate(maxDate)) !== 1); |
||||
|
||||
return months; |
||||
} |
||||
|
||||
function getButtonDisabled(type, currentDate, minRange) { |
||||
if (currentDate == null) { |
||||
return true; |
||||
} |
||||
|
||||
if (type === 'range') { |
||||
return !currentDate[0] || !currentDate[1]; |
||||
} |
||||
|
||||
if (type === 'multiple') { |
||||
return currentDate.length < minRange; |
||||
} |
||||
|
||||
return !currentDate; |
||||
} |
||||
|
||||
module.exports = { |
||||
getMonths: getMonths, |
||||
getButtonDisabled: getButtonDisabled |
||||
}; |
@ -1 +0,0 @@
|
||||
@import '../common/index.wxss';.van-calendar{background-color:var(--calendar-background-color,#fff);display:flex;flex-direction:column;height:var(--calendar-height,100%)}.van-calendar__close-icon{top:11px}.van-calendar__popup--bottom,.van-calendar__popup--top{height:var(--calendar-popup-height,90%)}.van-calendar__popup--left,.van-calendar__popup--right{height:100%}.van-calendar__body{-webkit-overflow-scrolling:touch;flex:1;overflow:auto}.van-calendar__footer{flex-shrink:0;padding:0 var(--padding-md,16px)}.van-calendar__footer--safe-area-inset-bottom{padding-bottom:env(safe-area-inset-bottom)}.van-calendar__footer+.van-calendar__footer,.van-calendar__footer:empty{display:none}.van-calendar__footer:empty+.van-calendar__footer{display:block!important}.van-calendar__confirm{height:var(--calendar-confirm-button-height,36px)!important;line-height:var(--calendar-confirm-button-line-height,34px)!important;margin:var(--calendar-confirm-button-margin,7px 0)!important} |
@ -1,12 +0,0 @@
|
||||
export declare const ROW_HEIGHT = 64; |
||||
export declare function formatMonthTitle(date: Date): string; |
||||
export declare function compareMonth(date1: Date | number, date2: Date | number): 0 | 1 | -1; |
||||
export declare function compareDay(day1: Date | number, day2: Date | number): 0 | 1 | -1; |
||||
export declare function getDayByOffset(date: Date, offset: number): Date; |
||||
export declare function getPrevDay(date: Date): Date; |
||||
export declare function getNextDay(date: Date): Date; |
||||
export declare function getToday(): Date; |
||||
export declare function calcDateNum(date: [Date, Date]): number; |
||||
export declare function copyDates(dates: Date | Date[]): Date | Date[]; |
||||
export declare function getMonthEndDay(year: number, month: number): number; |
||||
export declare function getMonths(minDate: number, maxDate: number): number[]; |
@ -1,83 +0,0 @@
|
||||
export const ROW_HEIGHT = 64; |
||||
export function formatMonthTitle(date) { |
||||
if (!(date instanceof Date)) { |
||||
date = new Date(date); |
||||
} |
||||
return `${date.getFullYear()}年${date.getMonth() + 1}月`; |
||||
} |
||||
export function compareMonth(date1, date2) { |
||||
if (!(date1 instanceof Date)) { |
||||
date1 = new Date(date1); |
||||
} |
||||
if (!(date2 instanceof Date)) { |
||||
date2 = new Date(date2); |
||||
} |
||||
const year1 = date1.getFullYear(); |
||||
const year2 = date2.getFullYear(); |
||||
const month1 = date1.getMonth(); |
||||
const month2 = date2.getMonth(); |
||||
if (year1 === year2) { |
||||
return month1 === month2 ? 0 : month1 > month2 ? 1 : -1; |
||||
} |
||||
return year1 > year2 ? 1 : -1; |
||||
} |
||||
export function compareDay(day1, day2) { |
||||
if (!(day1 instanceof Date)) { |
||||
day1 = new Date(day1); |
||||
} |
||||
if (!(day2 instanceof Date)) { |
||||
day2 = new Date(day2); |
||||
} |
||||
const compareMonthResult = compareMonth(day1, day2); |
||||
if (compareMonthResult === 0) { |
||||
const date1 = day1.getDate(); |
||||
const date2 = day2.getDate(); |
||||
return date1 === date2 ? 0 : date1 > date2 ? 1 : -1; |
||||
} |
||||
return compareMonthResult; |
||||
} |
||||
export function getDayByOffset(date, offset) { |
||||
date = new Date(date); |
||||
date.setDate(date.getDate() + offset); |
||||
return date; |
||||
} |
||||
export function getPrevDay(date) { |
||||
return getDayByOffset(date, -1); |
||||
} |
||||
export function getNextDay(date) { |
||||
return getDayByOffset(date, 1); |
||||
} |
||||
export function getToday() { |
||||
const today = new Date(); |
||||
today.setHours(0, 0, 0, 0); |
||||
return today; |
||||
} |
||||
export function calcDateNum(date) { |
||||
const day1 = new Date(date[0]).getTime(); |
||||
const day2 = new Date(date[1]).getTime(); |
||||
return (day2 - day1) / (1000 * 60 * 60 * 24) + 1; |
||||
} |
||||
export function copyDates(dates) { |
||||
if (Array.isArray(dates)) { |
||||
return dates.map((date) => { |
||||
if (date === null) { |
||||
return date; |
||||
} |
||||
return new Date(date); |
||||
}); |
||||
} |
||||
return new Date(dates); |
||||
} |
||||
export function getMonthEndDay(year, month) { |
||||
return 32 - new Date(year, month - 1, 32).getDate(); |
||||
} |
||||
export function getMonths(minDate, maxDate) { |
||||
const months = []; |
||||
const cursor = new Date(minDate); |
||||
cursor.setDate(1); |
||||
do { |
||||
months.push(cursor.getTime()); |
||||
cursor.setMonth(cursor.getMonth() + 1); |
||||
} while (compareMonth(cursor, maxDate) !== 1); |
||||
return months; |
||||
} |
@ -1,25 +0,0 @@
|
||||
/* eslint-disable */ |
||||
function getMonthEndDay(year, month) { |
||||
return 32 - getDate(year, month - 1, 32).getDate(); |
||||
} |
||||
|
||||
function compareMonth(date1, date2) { |
||||
date1 = getDate(date1); |
||||
date2 = getDate(date2); |
||||
|
||||
var year1 = date1.getFullYear(); |
||||
var year2 = date2.getFullYear(); |
||||
var month1 = date1.getMonth(); |
||||
var month2 = date2.getMonth(); |
||||
|
||||
if (year1 === year2) { |
||||
return month1 === month2 ? 0 : month1 > month2 ? 1 : -1; |
||||
} |
||||
|
||||
return year1 > year2 ? 1 : -1; |
||||
} |
||||
|
||||
module.exports = { |
||||
getMonthEndDay: getMonthEndDay, |
||||
compareMonth: compareMonth |
||||
}; |
@ -1,49 +0,0 @@
|
||||
import { link } from '../mixins/link'; |
||||
import { VantComponent } from '../common/component'; |
||||
VantComponent({ |
||||
classes: [ |
||||
'num-class', |
||||
'desc-class', |
||||
'thumb-class', |
||||
'title-class', |
||||
'price-class', |
||||
'origin-price-class', |
||||
], |
||||
mixins: [link], |
||||
props: { |
||||
tag: String, |
||||
num: String, |
||||
desc: String, |
||||
thumb: String, |
||||
title: String, |
||||
price: { |
||||
type: String, |
||||
observer: 'updatePrice', |
||||
}, |
||||
centered: Boolean, |
||||
lazyLoad: Boolean, |
||||
thumbLink: String, |
||||
originPrice: String, |
||||
thumbMode: { |
||||
type: String, |
||||
value: 'aspectFit', |
||||
}, |
||||
currency: { |
||||
type: String, |
||||
value: '¥', |
||||
}, |
||||
}, |
||||
methods: { |
||||
updatePrice() { |
||||
const { price } = this.data; |
||||
const priceArr = price.toString().split('.'); |
||||
this.setData({ |
||||
integerStr: priceArr[0], |
||||
decimalStr: priceArr[1] ? `.${priceArr[1]}` : '', |
||||
}); |
||||
}, |
||||
onClickThumb() { |
||||
this.jumpLink('thumbLink'); |
||||
}, |
||||
}, |
||||
}); |
@ -1,6 +0,0 @@
|
||||
{ |
||||
"component": true, |
||||
"usingComponents": { |
||||
"van-tag": "../tag/index" |
||||
} |
||||
} |
@ -1,56 +0,0 @@
|
||||
<wxs src="../wxs/utils.wxs" module="utils" /> |
||||
|
||||
<view class="custom-class van-card"> |
||||
<view class="{{ utils.bem('card__header', { center: centered }) }}"> |
||||
<view class="van-card__thumb" bind:tap="onClickThumb"> |
||||
<image |
||||
wx:if="{{ thumb }}" |
||||
src="{{ thumb }}" |
||||
mode="{{ thumbMode }}" |
||||
lazy-load="{{ lazyLoad }}" |
||||
class="van-card__img thumb-class" |
||||
/> |
||||
<slot wx:else name="thumb" /> |
||||
<van-tag |
||||
wx:if="{{ tag }}" |
||||
mark |
||||
type="danger" |
||||
custom-class="van-card__tag" |
||||
> |
||||
{{ tag }} |
||||
</van-tag> |
||||
<slot wx:else name="tag" /> |
||||
</view> |
||||
|
||||
<view class="van-card__content {{ utils.bem('card__content', { center: centered }) }}"> |
||||
<view> |
||||
<view wx:if="{{ title }}" class="van-card__title title-class">{{ title }}</view> |
||||
<slot wx:else name="title" /> |
||||
|
||||
<view wx:if="{{ desc }}" class="van-card__desc desc-class">{{ desc }}</view> |
||||
<slot wx:else name="desc" /> |
||||
|
||||
<slot name="tags" /> |
||||
</view> |
||||
|
||||
<view class="van-card__bottom"> |
||||
<slot name="price-top" /> |
||||
<view wx:if="{{ price || price === 0 }}" class="van-card__price price-class"> |
||||
<text>{{ currency }}</text> |
||||
<text class="van-card__price-integer">{{ integerStr }}</text> |
||||
<text class="van-card__price-decimal">{{ decimalStr }}</text> |
||||
</view> |
||||
<slot wx:else name="price" /> |
||||
<view wx:if="{{ originPrice || originPrice === 0 }}" class="van-card__origin-price origin-price-class">{{ currency }} {{ originPrice }}</view> |
||||
<slot wx:else name="origin-price" /> |
||||
<view wx:if="{{ num }}" class="van-card__num num-class">x {{ num }}</view> |
||||
<slot wx:else name="num" /> |
||||
<slot name="bottom" /> |
||||
</view> |
||||
</view> |
||||
</view> |
||||
|
||||
<view class="van-card__footer"> |
||||
<slot name="footer" /> |
||||
</view> |
||||
</view> |
@ -1 +0,0 @@
|
||||
@import '../common/index.wxss';.van-card{background-color:var(--card-background-color,#fafafa);box-sizing:border-box;color:var(--card-text-color,#323233);font-size:var(--card-font-size,12px);padding:var(--card-padding,8px 16px);position:relative}.van-card__header{display:flex}.van-card__header--center{align-items:center;justify-content:center}.van-card__thumb{flex:none;height:var(--card-thumb-size,88px);margin-right:var(--padding-xs,8px);position:relative;width:var(--card-thumb-size,88px)}.van-card__thumb:empty{display:none}.van-card__img{border-radius:8px;height:100%;width:100%}.van-card__content{display:flex;flex:1;flex-direction:column;justify-content:space-between;min-height:var(--card-thumb-size,88px);min-width:0;position:relative}.van-card__content--center{justify-content:center}.van-card__desc,.van-card__title{word-wrap:break-word}.van-card__title{font-weight:700;line-height:var(--card-title-line-height,16px)}.van-card__desc{color:var(--card-desc-color,#646566);line-height:var(--card-desc-line-height,20px)}.van-card__bottom{line-height:20px}.van-card__price{color:var(--card-price-color,#ee0a24);display:inline-block;font-size:var(--card-price-font-size,12px);font-weight:700}.van-card__price-integer{font-size:var(--card-price-integer-font-size,16px)}.van-card__price-decimal,.van-card__price-integer{font-family:var(--card-price-font-family,Avenir-Heavy,PingFang SC,Helvetica Neue,Arial,sans-serif)}.van-card__origin-price{color:var(--card-origin-price-color,#646566);display:inline-block;font-size:var(--card-origin-price-font-size,10px);margin-left:5px;text-decoration:line-through}.van-card__num{float:right}.van-card__tag{left:0;position:absolute!important;top:2px}.van-card__footer{flex:none;text-align:right;width:100%} |
@ -1,214 +0,0 @@
|
||||
import { VantComponent } from '../common/component'; |
||||
var FieldName; |
||||
(function (FieldName) { |
||||
FieldName["TEXT"] = "text"; |
||||
FieldName["VALUE"] = "value"; |
||||
FieldName["CHILDREN"] = "children"; |
||||
})(FieldName || (FieldName = {})); |
||||
const defaultFieldNames = { |
||||
text: FieldName.TEXT, |
||||
value: FieldName.VALUE, |
||||
children: FieldName.CHILDREN, |
||||
}; |
||||
VantComponent({ |
||||
props: { |
||||
title: String, |
||||
value: { |
||||
type: String, |
||||
}, |
||||
placeholder: { |
||||
type: String, |
||||
value: '请选择', |
||||
}, |
||||
activeColor: { |
||||
type: String, |
||||
value: '#1989fa', |
||||
}, |
||||
options: { |
||||
type: Array, |
||||
value: [], |
||||
}, |
||||
swipeable: { |
||||
type: Boolean, |
||||
value: false, |
||||
}, |
||||
closeable: { |
||||
type: Boolean, |
||||
value: true, |
||||
}, |
||||
ellipsis: { |
||||
type: Boolean, |
||||
value: true, |
||||
}, |
||||
showHeader: { |
||||
type: Boolean, |
||||
value: true, |
||||
}, |
||||
closeIcon: { |
||||
type: String, |
||||
value: 'cross', |
||||
}, |
||||
fieldNames: { |
||||
type: Object, |
||||
value: defaultFieldNames, |
||||
observer: 'updateFieldNames', |
||||
}, |
||||
useTitleSlot: Boolean, |
||||
}, |
||||
data: { |
||||
tabs: [], |
||||
activeTab: 0, |
||||
textKey: FieldName.TEXT, |
||||
valueKey: FieldName.VALUE, |
||||
childrenKey: FieldName.CHILDREN, |
||||
innerValue: '', |
||||
}, |
||||
watch: { |
||||
options() { |
||||
this.updateTabs(); |
||||
}, |
||||
value(newVal) { |
||||
this.updateValue(newVal); |
||||
}, |
||||
}, |
||||
created() { |
||||
this.updateTabs(); |
||||
}, |
||||
methods: { |
||||
updateValue(val) { |
||||
if (val !== undefined) { |
||||
const values = this.data.tabs.map((tab) => tab.selected && tab.selected[this.data.valueKey]); |
||||
if (values.indexOf(val) > -1) { |
||||
return; |
||||
} |
||||
} |
||||
this.innerValue = val; |
||||
this.updateTabs(); |
||||
}, |
||||
updateFieldNames() { |
||||
const { text = 'text', value = 'value', children = 'children', } = this.data.fieldNames || defaultFieldNames; |
||||
this.setData({ |
||||
textKey: text, |
||||
valueKey: value, |
||||
childrenKey: children, |
||||
}); |
||||
}, |
||||
getSelectedOptionsByValue(options, value) { |
||||
for (let i = 0; i < options.length; i++) { |
||||
const option = options[i]; |
||||
if (option[this.data.valueKey] === value) { |
||||
return [option]; |
||||
} |
||||
if (option[this.data.childrenKey]) { |
||||
const selectedOptions = this.getSelectedOptionsByValue(option[this.data.childrenKey], value); |
||||
if (selectedOptions) { |
||||
return [option, ...selectedOptions]; |
||||
} |
||||
} |
||||
} |
||||
}, |
||||
updateTabs() { |
||||
const { options } = this.data; |
||||
const { innerValue } = this; |
||||
if (!options.length) { |
||||
return; |
||||
} |
||||
if (innerValue !== undefined) { |
||||
const selectedOptions = this.getSelectedOptionsByValue(options, innerValue); |
||||
if (selectedOptions) { |
||||
let optionsCursor = options; |
||||
const tabs = selectedOptions.map((option) => { |
||||
const tab = { |
||||
options: optionsCursor, |
||||
selected: option, |
||||
}; |
||||
const next = optionsCursor.find((item) => item[this.data.valueKey] === option[this.data.valueKey]); |
||||
if (next) { |
||||
optionsCursor = next[this.data.childrenKey]; |
||||
} |
||||
return tab; |
||||
}); |
||||
if (optionsCursor) { |
||||
tabs.push({ |
||||
options: optionsCursor, |
||||
selected: null, |
||||
}); |
||||
} |
||||
this.setData({ |
||||
tabs, |
||||
}); |
||||
wx.nextTick(() => { |
||||
this.setData({ |
||||
activeTab: tabs.length - 1, |
||||
}); |
||||
}); |
||||
return; |
||||
} |
||||
} |
||||
this.setData({ |
||||
tabs: [ |
||||
{ |
||||
options, |
||||
selected: null, |
||||
}, |
||||
], |
||||
activeTab: 0, |
||||
}); |
||||
}, |
||||
onClose() { |
||||
this.$emit('close'); |
||||
}, |
||||
onClickTab(e) { |
||||
const { index: tabIndex, title } = e.detail; |
||||
this.$emit('click-tab', { title, tabIndex }); |
||||
this.setData({ |
||||
activeTab: tabIndex, |
||||
}); |
||||
}, |
||||
// 选中
|
||||
onSelect(e) { |
||||
const { option, tabIndex } = e.currentTarget.dataset; |
||||
if (option && option.disabled) { |
||||
return; |
||||
} |
||||
const { valueKey, childrenKey } = this.data; |
||||
let { tabs } = this.data; |
||||
tabs[tabIndex].selected = option; |
||||
if (tabs.length > tabIndex + 1) { |
||||
tabs = tabs.slice(0, tabIndex + 1); |
||||
} |
||||
if (option[childrenKey]) { |
||||
const nextTab = { |
||||
options: option[childrenKey], |
||||
selected: null, |
||||
}; |
||||
if (tabs[tabIndex + 1]) { |
||||
tabs[tabIndex + 1] = nextTab; |
||||
} |
||||
else { |
||||
tabs.push(nextTab); |
||||
} |
||||
wx.nextTick(() => { |
||||
this.setData({ |
||||
activeTab: tabIndex + 1, |
||||
}); |
||||
}); |
||||
} |
||||
this.setData({ |
||||
tabs, |
||||
}); |
||||
const selectedOptions = tabs.map((tab) => tab.selected).filter(Boolean); |
||||
const value = option[valueKey]; |
||||
const params = { |
||||
value, |
||||
tabIndex, |
||||
selectedOptions, |
||||
}; |
||||
this.innerValue = value; |
||||
this.$emit('change', params); |
||||
if (!option[childrenKey]) { |
||||
this.$emit('finish', params); |
||||
} |
||||
}, |
||||
}, |
||||
}); |
@ -1,8 +0,0 @@
|
||||
{ |
||||
"component": true, |
||||
"usingComponents": { |
||||
"van-icon": "../icon/index", |
||||
"van-tab": "../tab/index", |
||||
"van-tabs": "../tabs/index" |
||||
} |
||||
} |
@ -1,55 +0,0 @@
|
||||
<wxs src="./index.wxs" module="utils" /> |
||||
|
||||
<view wx:if="{{ showHeader }}" class="van-cascader__header"> |
||||
<slot name="title" wx:if="{{ useTitleSlot }}"></slot> |
||||
<text class="van-cascader__title" wx:else>{{ title }}</text> |
||||
<van-icon |
||||
wx:if="{{ closeable }}" |
||||
name="{{ closeIcon }}" |
||||
class="van-cascader__close-icon" |
||||
bind:tap="onClose" |
||||
/> |
||||
</view> |
||||
|
||||
<van-tabs |
||||
active="{{ activeTab }}" |
||||
custom-class="van-cascader__tabs" |
||||
wrap-class="van-cascader__tabs-wrap" |
||||
tab-class="van-cascader__tab" |
||||
color="{{ activeColor }}" |
||||
border="{{ false }}" |
||||
swipeable="{{ swipeable }}" |
||||
ellipsis="{{ ellipsis }}" |
||||
bind:click="onClickTab" |
||||
> |
||||
<van-tab |
||||
wx:for="{{ tabs }}" |
||||
wx:for-item="tab" |
||||
wx:for-index="tabIndex" |
||||
wx:key="tabIndex" |
||||
title="{{ tab.selected ? tab.selected[textKey] : placeholder }}" |
||||
style="width: 100%;" |
||||
title-style="{{ !tab.selected ? 'color: #969799;font-weight:normal;' : '' }}" |
||||
> |
||||
<!-- 暂不支持 --> |
||||
<!-- <slot name="options-top"></slot> --> |
||||
|
||||
<view class="van-cascader__options"> |
||||
<view |
||||
wx:for="{{ tab.options }}" |
||||
wx:for-item="option" |
||||
wx:key="index" |
||||
class="{{ option.className }} {{ utils.optionClass(tab, valueKey, option) }}" |
||||
style="{{ utils.optionStyle({ tab, valueKey, option, activeColor }) }}" |
||||
data-option="{{ option }}" |
||||
data-tab-index="{{ tabIndex }}" |
||||
bind:tap="onSelect" |
||||
> |
||||
<text>{{ option[textKey] }}</text> |
||||
<van-icon wx:if="{{ utils.isSelected(tab, valueKey, option) }}" name="success" size="18" /> |
||||
</view> |
||||
</view> |
||||
<!-- 暂不支持 --> |
||||
<!-- <slot name="options-bottom"></slot> --> |
||||
</van-tab> |
||||
</van-tabs> |
@ -1,24 +0,0 @@
|
||||
var utils = require('../wxs/utils.wxs'); |
||||
var style = require('../wxs/style.wxs'); |
||||
|
||||
function isSelected(tab, valueKey, option) { |
||||
return tab.selected && tab.selected[valueKey] === option[valueKey] |
||||
} |
||||
|
||||
function optionClass(tab, valueKey, option) { |
||||
return utils.bem('cascader__option', { selected: isSelected(tab, valueKey, option), disabled: option.disabled }) |
||||
} |
||||
|
||||
function optionStyle(data) { |
||||
var color = data.option.color || (isSelected(data.tab, data.valueKey, data.option) ? data.activeColor : undefined); |
||||
return style({ |
||||
color |
||||
}); |
||||
} |
||||
|
||||
|
||||
module.exports = { |
||||
isSelected: isSelected, |
||||
optionClass: optionClass, |
||||
optionStyle: optionStyle, |
||||
}; |
@ -1 +0,0 @@
|
||||
@import '../common/index.wxss';.van-cascader__header{align-items:center;display:flex;height:48px;justify-content:space-between;padding:0 16px}.van-cascader__title{font-size:16px;font-weight:600;line-height:20px}.van-cascader__close-icon{color:#c8c9cc;font-size:22px;height:22px}.van-cascader__tabs-wrap{height:48px!important;padding:0 8px}.van-cascader__tab{color:#323233!important;flex:none!important;font-weight:600!important;padding:0 8px!important}.van-cascader__tab--unselected{color:#969799!important;font-weight:400!important}.van-cascader__option{align-items:center;cursor:pointer;display:flex;font-size:14px;justify-content:space-between;line-height:20px;padding:10px 16px}.van-cascader__option:active{background-color:#f2f3f5}.van-cascader__option--selected{color:#1989fa;font-weight:600}.van-cascader__option--disabled{color:#c8c9cc;cursor:not-allowed}.van-cascader__option--disabled:active{background-color:initial}.van-cascader__options{-webkit-overflow-scrolling:touch;box-sizing:border-box;height:384px;overflow-y:auto;padding-top:6px} |
@ -1,11 +0,0 @@
|
||||
import { VantComponent } from '../common/component'; |
||||
VantComponent({ |
||||
props: { |
||||
title: String, |
||||
border: { |
||||
type: Boolean, |
||||
value: true, |
||||
}, |
||||
inset: Boolean, |
||||
}, |
||||
}); |
@ -1,11 +0,0 @@
|
||||
<wxs src="../wxs/utils.wxs" module="utils" /> |
||||
|
||||
<view |
||||
wx:if="{{ title }}" |
||||
class="{{ utils.bem('cell-group__title', { inset }) }}" |
||||
> |
||||
{{ title }} |
||||
</view> |
||||
<view class="custom-class {{ utils.bem('cell-group', { inset }) }} {{ border ? 'van-hairline--top-bottom' : '' }}"> |
||||
<slot /> |
||||
</view> |
@ -1 +0,0 @@
|
||||
@import '../common/index.wxss';.van-cell-group--inset{border-radius:var(--cell-group-inset-border-radius,8px);margin:var(--cell-group-inset-padding,0 16px);overflow:hidden}.van-cell-group__title{color:var(--cell-group-title-color,#969799);font-size:var(--cell-group-title-font-size,14px);line-height:var(--cell-group-title-line-height,16px);padding:var(--cell-group-title-padding,16px 16px 8px)}.van-cell-group__title--inset{padding:var(--cell-group-inset-title-padding,16px 16px 8px 32px)} |
@ -1,36 +0,0 @@
|
||||
import { useChildren } from '../common/relation'; |
||||
import { VantComponent } from '../common/component'; |
||||
VantComponent({ |
||||
field: true, |
||||
relation: useChildren('checkbox', function (target) { |
||||
this.updateChild(target); |
||||
}), |
||||
props: { |
||||
max: Number, |
||||
value: { |
||||
type: Array, |
||||
observer: 'updateChildren', |
||||
}, |
||||
disabled: { |
||||
type: Boolean, |
||||
observer: 'updateChildren', |
||||
}, |
||||
direction: { |
||||
type: String, |
||||
value: 'vertical', |
||||
}, |
||||
}, |
||||
methods: { |
||||
updateChildren() { |
||||
this.children.forEach((child) => this.updateChild(child)); |
||||
}, |
||||
updateChild(child) { |
||||
const { value, disabled, direction } = this.data; |
||||
child.setData({ |
||||
value: value.indexOf(child.data.name) !== -1, |
||||
parentDisabled: disabled, |
||||
direction, |
||||
}); |
||||
}, |
||||
}, |
||||
}); |
@ -1,3 +0,0 @@
|
||||
{ |
||||
"component": true |
||||
} |
@ -1,5 +0,0 @@
|
||||
<wxs src="../wxs/utils.wxs" module="utils" /> |
||||
|
||||
<view class="{{ utils.bem('checkbox-group', [{ horizontal: direction === 'horizontal' }]) }}"> |
||||
<slot /> |
||||
</view> |
@ -1 +0,0 @@
|
||||
@import '../common/index.wxss';.van-checkbox-group--horizontal{display:flex;flex-wrap:wrap} |
@ -1,77 +0,0 @@
|
||||
import { useParent } from '../common/relation'; |
||||
import { VantComponent } from '../common/component'; |
||||
function emit(target, value) { |
||||
target.$emit('input', value); |
||||
target.$emit('change', value); |
||||
} |
||||
VantComponent({ |
||||
field: true, |
||||
relation: useParent('checkbox-group'), |
||||
classes: ['icon-class', 'label-class'], |
||||
props: { |
||||
value: Boolean, |
||||
disabled: Boolean, |
||||
useIconSlot: Boolean, |
||||
checkedColor: String, |
||||
labelPosition: { |
||||
type: String, |
||||
value: 'right', |
||||
}, |
||||
labelDisabled: Boolean, |
||||
shape: { |
||||
type: String, |
||||
value: 'round', |
||||
}, |
||||
iconSize: { |
||||
type: null, |
||||
value: 20, |
||||
}, |
||||
}, |
||||
data: { |
||||
parentDisabled: false, |
||||
direction: 'vertical', |
||||
}, |
||||
methods: { |
||||
emitChange(value) { |
||||
if (this.parent) { |
||||
this.setParentValue(this.parent, value); |
||||
} |
||||
else { |
||||
emit(this, value); |
||||
} |
||||
}, |
||||
toggle() { |
||||
const { parentDisabled, disabled, value } = this.data; |
||||
if (!disabled && !parentDisabled) { |
||||
this.emitChange(!value); |
||||
} |
||||
}, |
||||
onClickLabel() { |
||||
const { labelDisabled, parentDisabled, disabled, value } = this.data; |
||||
if (!disabled && !labelDisabled && !parentDisabled) { |
||||
this.emitChange(!value); |
||||
} |
||||
}, |
||||
setParentValue(parent, value) { |
||||
const parentValue = parent.data.value.slice(); |
||||
const { name } = this.data; |
||||
const { max } = parent.data; |
||||
if (value) { |
||||
if (max && parentValue.length >= max) { |
||||
return; |
||||
} |
||||
if (parentValue.indexOf(name) === -1) { |
||||
parentValue.push(name); |
||||
emit(parent, parentValue); |
||||
} |
||||
} |
||||
else { |
||||
const index = parentValue.indexOf(name); |
||||
if (index !== -1) { |
||||
parentValue.splice(index, 1); |
||||
emit(parent, parentValue); |
||||
} |
||||
} |
||||
}, |
||||
}, |
||||
}); |
@ -1,6 +0,0 @@
|
||||
{ |
||||
"component": true, |
||||
"usingComponents": { |
||||
"van-icon": "../icon/index" |
||||
} |
||||
} |
@ -1,31 +0,0 @@
|
||||
<wxs src="../wxs/utils.wxs" module="utils" /> |
||||
<wxs src="./index.wxs" module="computed" /> |
||||
|
||||
<view class="{{ utils.bem('checkbox', [{ horizontal: direction === 'horizontal' }]) }} custom-class"> |
||||
<view |
||||
wx:if="{{ labelPosition === 'left' }}" |
||||
class="label-class {{ utils.bem('checkbox__label', [labelPosition, { disabled: disabled || parentDisabled }]) }}" |
||||
bindtap="onClickLabel" |
||||
> |
||||
<slot /> |
||||
</view> |
||||
<view class="van-checkbox__icon-wrap" bindtap="toggle"> |
||||
<slot wx:if="{{ useIconSlot }}" name="icon" /> |
||||
<van-icon |
||||
wx:else |
||||
name="success" |
||||
size="0.8em" |
||||
class="{{ utils.bem('checkbox__icon', [shape, { disabled: disabled || parentDisabled, checked: value }]) }}" |
||||
style="{{ computed.iconStyle(checkedColor, value, disabled, parentDisabled, iconSize) }}" |
||||
custom-class="icon-class" |
||||
custom-style="line-height: 1.25em;" |
||||
/> |
||||
</view> |
||||
<view |
||||
wx:if="{{ labelPosition === 'right' }}" |
||||
class="label-class {{ utils.bem('checkbox__label', [labelPosition, { disabled: disabled || parentDisabled }]) }}" |
||||
bindtap="onClickLabel" |
||||
> |
||||
<slot /> |
||||
</view> |
||||
</view> |
@ -1,20 +0,0 @@
|
||||
/* eslint-disable */ |
||||
var style = require('../wxs/style.wxs'); |
||||
var addUnit = require('../wxs/add-unit.wxs'); |
||||
|
||||
function iconStyle(checkedColor, value, disabled, parentDisabled, iconSize) { |
||||
var styles = { |
||||
'font-size': addUnit(iconSize), |
||||
}; |
||||
|
||||
if (checkedColor && value && !disabled && !parentDisabled) { |
||||
styles['border-color'] = checkedColor; |
||||
styles['background-color'] = checkedColor; |
||||
} |
||||
|
||||
return style(styles); |
||||
} |
||||
|
||||
module.exports = { |
||||
iconStyle: iconStyle, |
||||
}; |
@ -1 +0,0 @@
|
||||
@import '../common/index.wxss';.van-checkbox{align-items:center;display:flex;overflow:hidden;-webkit-user-select:none;user-select:none}.van-checkbox--horizontal{margin-right:12px}.van-checkbox__icon-wrap,.van-checkbox__label{line-height:var(--checkbox-size,20px)}.van-checkbox__icon-wrap{flex:none}.van-checkbox__icon{align-items:center;border:1px solid var(--checkbox-border-color,#c8c9cc);box-sizing:border-box;color:transparent;display:flex;font-size:var(--checkbox-size,20px);height:1em;justify-content:center;text-align:center;transition-duration:var(--checkbox-transition-duration,.2s);transition-property:color,border-color,background-color;width:1em}.van-checkbox__icon--round{border-radius:100%}.van-checkbox__icon--checked{background-color:var(--checkbox-checked-icon-color,#1989fa);border-color:var(--checkbox-checked-icon-color,#1989fa);color:#fff}.van-checkbox__icon--disabled{background-color:var(--checkbox-disabled-background-color,#ebedf0);border-color:var(--checkbox-disabled-icon-color,#c8c9cc)}.van-checkbox__icon--disabled.van-checkbox__icon--checked{color:var(--checkbox-disabled-icon-color,#c8c9cc)}.van-checkbox__label{word-wrap:break-word;color:var(--checkbox-label-color,#323233);padding-left:var(--checkbox-label-margin,10px)}.van-checkbox__label--left{float:left;margin:0 var(--checkbox-label-margin,10px) 0 0}.van-checkbox__label--disabled{color:var(--checkbox-disabled-label-color,#c8c9cc)}.van-checkbox__label:empty{margin:0} |