UNPKG

bizcharts

Version:
288 lines 11.6 kB
"use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; var __rest = (this && this.__rest) || function (s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { if (ar || !(i in from)) { if (!ar) ar = Array.prototype.slice.call(from, 0, i); ar[i] = from[i]; } } return to.concat(ar || Array.prototype.slice.call(from)); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); var unique_id_1 = __importDefault(require("@antv/util/lib/unique-id")); var each_1 = __importDefault(require("@antv/util/lib/each")); var is_function_1 = __importDefault(require("@antv/util/lib/is-function")); var is_array_1 = __importDefault(require("@antv/util/lib/is-array")); var is_equal_1 = __importDefault(require("@antv/util/lib/is-equal")); var core_1 = require("../../core"); var warning_1 = __importDefault(require("warning")); var shallowEqual_1 = __importDefault(require("../../utils/shallowEqual")); var pickWithout_1 = __importDefault(require("../../utils/pickWithout")); var cloneDeep_1 = __importDefault(require("../../utils/cloneDeep")); var constant_1 = require("../../utils/constant"); var constant_2 = require("@antv/g2/lib/constant"); var event_emitter_1 = __importDefault(require("@antv/event-emitter")); var events_1 = require("./events"); var processData = function (data) { if (data && data.rows) { return data.rows; } return data; }; var ChartHelper = /** @class */ (function (_super) { __extends(ChartHelper, _super); function ChartHelper() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.config = {}; return _this; } ChartHelper.prototype.createInstance = function (config) { this.chart = new core_1.Chart(__assign({}, config)); this.key = (0, unique_id_1.default)('bx-chart'); this.chart.emit('initialed'); this.isNewInstance = true; // 更新了实例的标记 this.extendGroup = { isChartCanvas: true, chart: this.chart, }; }; ChartHelper.prototype.render = function () { if (!this.chart) { return; } try { // 普通error 只能兜住react render周期里的error。 chart render周期的error 要单独处理 if (this.isNewInstance) { this.chart.render(); this.onGetG2Instance(); // @ts-ignore this.chart.unbindAutoFit(); // 不使用g2的监听 this.isNewInstance = false; // @ts-ignore } else if (this.chart.forceReRender) { // forceReRender 填部分g2更新不干净的坑 this.chart.render(); } else { this.chart.render(true); } // 处理elements状态 this.chart.emit('processElemens'); } catch (e) { this.emit('renderError', e); this.destory(); if (console) { console.error(e === null || e === void 0 ? void 0 : e.stack); } } }; ChartHelper.prototype.onGetG2Instance = function () { // 当且仅当 isNewInstance 的时候执行。 if ((0, is_function_1.default)(this.config.onGetG2Instance)) { this.config.onGetG2Instance(this.chart); } }; ChartHelper.prototype.shouldReCreateInstance = function (newConfig) { // 如果上一个实例数据为空则直接销毁重建,以免影响动画 if (!this.chart || newConfig.forceUpdate) { return true; } var _a = this.config, preData = _a.data, preOptions = __rest(_a, ["data"]); var data = newConfig.data, options = __rest(newConfig, ["data"]); if ((0, is_array_1.default)(this.config.data) && preData.length === 0 && (0, is_array_1.default)(data) && data.length !== 0) { return true; } // scale 切换不需要重建实例 var unCompareProps = __spreadArray(__spreadArray([], constant_1.REACT_PIVATE_PROPS, true), ['scale', 'width', 'height', 'container', '_container', '_interactions', 'placeholder', /^on/, /^\_on/], false); if (!(0, is_equal_1.default)((0, pickWithout_1.default)(preOptions, __spreadArray([], unCompareProps, true)), (0, pickWithout_1.default)(options, __spreadArray([], unCompareProps, true)))) { return true; } return false; }; ChartHelper.prototype.update = function (props) { var _this = this; var newConfig = (0, cloneDeep_1.default)(this.adapterOptions(props)); if (this.shouldReCreateInstance(newConfig)) { this.destory(); this.createInstance(newConfig); } // 重置 if (newConfig.pure) { // 纯画布 关闭 this.chart.axis(false); this.chart.tooltip(false); this.chart.legend(false); // @ts-ignore this.chart.isPure = true; } // 事件 var events = (0, events_1.pickEventName)(this.config); var newEvents = (0, events_1.pickEventName)(newConfig); // 配置 var data = newConfig.data, interactions = newConfig.interactions, options = __rest(newConfig, ["data", "interactions"]); var _a = this.config, preData = _a.data, _b = _a.interactions, preInteractions = _b === void 0 ? [] : _b; if (!this.isNewInstance) { // 取消事件绑定 events.forEach(function (ev) { _this.chart.off(ev[1], _this.config["_".concat(ev[0])]); }); } /** 更新 */ // 绑定事件 newEvents.forEach(function (evName) { newConfig["_".concat(evName[0])] = function (ev) { // 输入chart实例方便用户使用 newConfig[evName[0]](ev, _this.chart); }; _this.chart.on(evName[1], newConfig["_".concat(evName[0])]); }); // 数据 更新 if ((0, is_array_1.default)(preData) && preData.length) { // 数据只做2级浅比较 // fixme: 做4级比较 var isEqual_1 = true; if (newConfig.notCompareData) { // 手动关闭对比 isEqual_1 = false; } if (preData.length !== data.length) { // 长度不相等 isEqual_1 = false; } else { preData.forEach(function (element, index) { if (!(0, shallowEqual_1.default)(element, data[index])) { isEqual_1 = false; } }); } if (!isEqual_1) { // @ts-ignore this.chart.isDataChanged = true; this.chart.emit(constant_2.VIEW_LIFE_CIRCLE.BEFORE_CHANGE_DATA); // 1. 保存数据 this.chart.data(data); // 2. 最后再渲染 // 3. 遍历子 view 进行 change data var views = this.chart.views; for (var i = 0, len = views.length; i < len; i++) { var view = views[i]; // 子 view 有自己的数据, 会在执行view的配置时会覆盖 view.changeData(data); } this.chart.emit(constant_2.VIEW_LIFE_CIRCLE.AFTER_CHANGE_DATA); } } else { this.chart.data(data); } // 比例尺 this.chart.scale(options.scale); // 动画 if (options.animate === false) { this.chart.animate(false); } else { this.chart.animate(true); } // 交互 interactions preInteractions.forEach(function (interact) { // 这里不做对比,无意义,都是要销毁重建,不如直接全量销毁 _this.chart.removeInteraction(interact); }); interactions.forEach(function (interact) { _this.chart.interaction(interact); }); // filter (0, each_1.default)(this.config.filter, function (it, index) { // 销毁 if ((0, is_array_1.default)(it)) { _this.chart.filter(it[0], null); } else { _this.chart.filter(index, null); } }); (0, each_1.default)(newConfig.filter, function (it, index) { if ((0, is_array_1.default)(it)) { _this.chart.filter(it[0], it[1]); } else { _this.chart.filter(index, it); } }); // 主题 this.chart.theme(newConfig.theme); // 缓存处理后的配置 this.config = newConfig; }; ChartHelper.prototype.adapterOptions = function (_a) { var data = _a.data, others = __rest(_a, ["data"]); // 剔除 React 自身的属性 var options = (0, pickWithout_1.default)(others, __spreadArray([], constant_1.REACT_PIVATE_PROPS, true)); if (options.forceFit) { (0, warning_1.default)(false, 'forceFit 已废弃,请使用`autoFit`替代'); } options.data = processData(data) || []; return options; }; ChartHelper.prototype.destory = function () { if (!this.chart) { return; } this.extendGroup = null; var chart = this.chart; chart.destroy(); chart = null; this.chart = null; this.config = {}; }; return ChartHelper; }(event_emitter_1.default)); exports.default = ChartHelper; //# sourceMappingURL=chartHelper.js.map