virtualized-table
Version:
Large data volume table
1,096 lines (918 loc) • 182 kB
JavaScript
(function webpackUniversalModuleDefinition(root, factory) {
if(typeof exports === 'object' && typeof module === 'object')
module.exports = factory(require("react"));
else if(typeof define === 'function' && define.amd)
define(["react"], factory);
else {
var a = typeof exports === 'object' ? factory(require("react")) : factory(root["React"]);
for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
}
})(window, function(__WEBPACK_EXTERNAL_MODULE_react__) {
return /******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/ }
/******/ };
/******/
/******/ // define __esModule on exports
/******/ __webpack_require__.r = function(exports) {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/
/******/ // create a fake namespace object
/******/ // mode & 1: value is a module id, require it
/******/ // mode & 2: merge all properties of value into the ns
/******/ // mode & 4: return value when already ns object
/******/ // mode & 8|1: behave like require
/******/ __webpack_require__.t = function(value, mode) {
/******/ if(mode & 1) value = __webpack_require__(value);
/******/ if(mode & 8) return value;
/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/ var ns = Object.create(null);
/******/ __webpack_require__.r(ns);
/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/ return ns;
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = "./libs/index.js");
/******/ })
/************************************************************************/
/******/ ({
/***/ "./libs/VTable2.0/Grid.js":
/*!********************************!*\
!*** ./libs/VTable2.0/Grid.js ***!
\********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
/* harmony import */ var _utils_gridCell__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils/gridCell */ "./libs/VTable2.0/utils/gridCell.js");
/* harmony import */ var _utils_fixUtil__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils/fixUtil */ "./libs/VTable2.0/utils/fixUtil.js");
/* harmony import */ var _styles_grid_less__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./styles/grid.less */ "./libs/VTable2.0/styles/grid.less");
/* harmony import */ var _styles_grid_less__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_styles_grid_less__WEBPACK_IMPORTED_MODULE_4__);
/* harmony import */ var _utils_gridScrollInfo__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./utils/gridScrollInfo */ "./libs/VTable2.0/utils/gridScrollInfo.js");
/* harmony import */ var _utils_columns__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./utils/columns */ "./libs/VTable2.0/utils/columns.js");
/* harmony import */ var _utils_base__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./utils/base */ "./libs/VTable2.0/utils/base.js");
/* harmony import */ var _context_VTableContext__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./context/VTableContext */ "./libs/VTable2.0/context/VTableContext.js");
/* harmony import */ var _utils_rowKey__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./utils/rowKey */ "./libs/VTable2.0/utils/rowKey.js");
/* harmony import */ var _utils_deepClone__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./utils/deepClone */ "./libs/VTable2.0/utils/deepClone.js");
/* harmony import */ var _utils_timer__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./utils/timer */ "./libs/VTable2.0/utils/timer.js");
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
// const whyDidYouRender = require('@welldone-software/why-did-you-render');
// whyDidYouRender(React, {
// trackAllPureComponents: true
// });
var Grid = function Grid(props, ref) {
// 要向父MultiGrid暴露的
var gridContainer = Object(react__WEBPACK_IMPORTED_MODULE_0__["useRef"])(null);
Object(react__WEBPACK_IMPORTED_MODULE_0__["useImperativeHandle"])(ref, function () {
return {
gridContainer: gridContainer.current
};
});
var realGridContainer = Object(react__WEBPACK_IMPORTED_MODULE_0__["useRef"])(null);
var resetIsScrollingTimeoutIdRef = Object(react__WEBPACK_IMPORTED_MODULE_0__["useRef"])(null);
var scrollRef = Object(react__WEBPACK_IMPORTED_MODULE_0__["useRef"])({
gridScrollTop: 0,
gridScrollLeft: 0
});
var _VTableContext = Object(react__WEBPACK_IMPORTED_MODULE_0__["useContext"])(_context_VTableContext__WEBPACK_IMPORTED_MODULE_8__["default"]);
var isSticky = _VTableContext.isSticky;
var visibleHeight = props.visibleHeight || 400;
var estimatedRowHeight = props.estimatedRowHeight || 40;
var estimatedRowVisibleCount = Math.ceil(visibleHeight / estimatedRowHeight);
var clientWidth = gridContainer.current && gridContainer.current.clientWidth;
var visibleWidth = props.visibleWidth || clientWidth || 1200;
var estimatedColumnWidth = props.estimatedColumnWidth || 150;
var estimatedColumnVisibleCount = Math.ceil(visibleWidth / estimatedColumnWidth); // const
var stateProps = {
// 固定行高 boolean (需要行合并/分组表头时设置为true)
fixedRowHeight: props.fixedRowHeight,
// 列 #
columns: props.columns || [],
// 源数据 #
dataSource: props.dataSource || [],
// 可视区域高度
visibleHeight: visibleHeight,
// 一行的高度(预估)
estimatedRowHeight: estimatedRowHeight,
minRowHeight: props.minRowHeight || 40,
// 可渲染的元素个数
rowVisibleCount: props.rowVisibleCount || estimatedRowVisibleCount,
// 上下偏移渲染个数
rowOffsetCount: props.rowOffsetCount || 10,
// 可视区域宽度
visibleWidth: visibleWidth,
// 预估的每列宽度
estimatedColumnWidth: estimatedColumnWidth,
// 可渲染个数(水平)
columnVisibleCount: props.columnVisibleCount || estimatedColumnVisibleCount,
// 左右偏移渲染个数
columnOffsetCount: props.columnOffsetCount || 4,
fixedLeftColumns: props.fixedLeftColumns || [],
fixedRightColumns: props.fixedRightColumns || []
};
var _props$type = props.type,
type = _props$type === void 0 ? 'body' : _props$type,
mgType = props.mgType,
className = props.className,
gridStyle = props.gridStyle,
shouldRowHeightSync = props.shouldRowHeightSync,
rowKey = props.rowKey,
_props$rowSelection = props.rowSelection,
rowSelection = _props$rowSelection === void 0 ? {} : _props$rowSelection,
_props$components = props.components,
components = _props$components === void 0 ? {} : _props$components,
onRow = props.onRow,
headerBordered = props.headerBordered,
bordered = props.bordered,
onScrollTopSync = props.onScrollTopSync,
onCellTap = props.onCellTap;
var _useState = Object(react__WEBPACK_IMPORTED_MODULE_0__["useState"])({
// 虚拟列
virtualColumns: [],
// 虚拟数据
virtualData: [],
// 可视区坐标(rowIndex垂直)
startRowIndex: 0,
endRowIndex: 0,
// 可视区坐标(columnIndex水平)
startColumnIndex: 0,
endColumnIndex: 0,
// padding偏移量(垂直)
startVerticalOffset: 0,
endVerticalOffset: 0,
// padding偏移量(水平)
startHorizontalOffset: 0,
endHorizontalOffset: 0
}),
_useState2 = _slicedToArray(_useState, 2),
grid = _useState2[0],
setGrid = _useState2[1]; // 真实展示的列
var displayedColumns = Object(react__WEBPACK_IMPORTED_MODULE_0__["useMemo"])(function () {
return [].concat(_toConsumableArray(stateProps.fixedLeftColumns), _toConsumableArray(grid.virtualColumns), _toConsumableArray(stateProps.fixedRightColumns));
}, [stateProps.fixedLeftColumns, grid.virtualColumns, stateProps.fixedRightColumns]);
var displayedFooterColumns = Object(react__WEBPACK_IMPORTED_MODULE_0__["useMemo"])(function () {
var columns = displayedColumns;
if (displayedColumns.length > 0 && displayedColumns[0].type === 'checkBox') {
columns = Object(_utils_deepClone__WEBPACK_IMPORTED_MODULE_10__["deepClone"])(displayedColumns);
columns[0].render = null;
}
return columns;
}, [displayedColumns]); //
var Components = Object(react__WEBPACK_IMPORTED_MODULE_0__["useMemo"])(function () {
return {
header: {
row: components.header && components.header.row || 'div',
cell: components.header && components.header.cell || 'div'
},
body: {
row: components.body && components.body.row || 'div',
cell: components.body && components.body.cell || 'div'
},
footer: {
row: components.footer && components.footer.row || 'div',
cell: components.footer && components.footer.cell || 'div'
}
};
}, [components]); // 更新grid信息
var updateGrid = function updateGrid(partialState) {
setGrid(function (oldState) {
return _objectSpread(_objectSpread({}, oldState), partialState);
});
};
Object(react__WEBPACK_IMPORTED_MODULE_0__["useEffect"])(function () {
_onScrollEvent(true); //
if (type === 'body' && mgType === 'mainMultiGrid') {
setTimeout(function () {
_VTableContext.getBodyScrollBar({
ref: gridContainer
});
}, 0);
}
}, [stateProps.dataSource, stateProps.columns]);
/**
* 滚动事件
* @param {Boolean} didMount 是否didMount阶段执行
* @private
*/
var _onScrollEvent = function _onScrollEvent(didMount) {
// window.requestAnimationFrame(() => {
// 垂直方向滚动
_onVerticalScroll(didMount); // 水平方向滚动
_onHorizontalScroll(didMount); // });
};
/**
* 垂直方向滚动
* @param {Boolean} didMount 是否didMount阶段执行
* @private
*/
var _onVerticalScroll = function _onVerticalScroll(didMount) {
var scrollTop = gridContainer.current.scrollTop;
var gridScrollTop = scrollRef.current.gridScrollTop;
var doUpdate = Math.abs(scrollTop - gridScrollTop) > 40;
if (didMount || doUpdate) {
scrollRef.current.gridScrollTop = scrollTop;
var dataSource = stateProps.dataSource,
_estimatedRowHeight = stateProps.estimatedRowHeight,
rowOffsetCount = stateProps.rowOffsetCount,
rowVisibleCount = stateProps.rowVisibleCount; // 当前scrollTop
var gridInfo = Object(_utils_gridScrollInfo__WEBPACK_IMPORTED_MODULE_5__["getRealGridVerticalScrollInfo"])({
scrollTop: scrollTop,
dataSource: dataSource,
estimatedRowHeight: _estimatedRowHeight,
rowOffsetCount: rowOffsetCount,
rowVisibleCount: rowVisibleCount
}); // 更新渲染
updateGrid(gridInfo);
}
};
/**
* 水平方向滚动
* @param {Boolean} didMount 是否didMount阶段执行
* @private
*/
var _onHorizontalScroll = function _onHorizontalScroll(didMount) {
var scrollLeft = gridContainer.current.scrollLeft;
var gridScrollLeft = scrollRef.current.gridScrollLeft;
var doUpdate = Math.abs(scrollLeft - gridScrollLeft) > 80;
if (didMount || doUpdate) {
scrollRef.current.gridScrollLeft = scrollLeft;
var dataSource = stateProps.dataSource,
columns = stateProps.columns,
_estimatedColumnWidth = stateProps.estimatedColumnWidth,
columnOffsetCount = stateProps.columnOffsetCount,
columnVisibleCount = stateProps.columnVisibleCount; // 当前scrollLeft
var gridInfo = Object(_utils_gridScrollInfo__WEBPACK_IMPORTED_MODULE_5__["getRealGridHorizontalScrollInfo"])({
scrollLeft: scrollLeft,
dataSource: dataSource,
columns: columns,
estimatedColumnWidth: _estimatedColumnWidth,
columnOffsetCount: columnOffsetCount,
columnVisibleCount: columnVisibleCount
}); // 更新渲染
updateGrid(gridInfo);
}
};
/**
* 获取单元格合并列信息
* @param {Object} row 行信息
* @param {Number} rowIndex 可视行坐标
* @param {Number} realRowIndex 真实的行坐标
* @param {Object} column 列信息
* @param {Number} columnIndex 可视列坐标
* @param {Number} realColumnIndex 真实的列坐标
* @param {Number} colSpan 跨列
* @param {Number} rowSpan 跨行
* @returns {object}
* @private
*/
var getCellColRowSpanStyle = function getCellColRowSpanStyle(_ref) {
var row = _ref.row,
rowIndex = _ref.rowIndex,
realRowIndex = _ref.realRowIndex,
column = _ref.column,
columnIndex = _ref.columnIndex,
realColumnIndex = _ref.realColumnIndex,
colSpan = _ref.colSpan,
rowSpan = _ref.rowSpan,
type = _ref.type;
colSpan = colSpan === 0 ? 0 : Number(colSpan || 1);
rowSpan = rowSpan === 0 ? 0 : Number(rowSpan || 1);
var columns = stateProps.columns,
estimatedColumnWidth = stateProps.estimatedColumnWidth,
minRowHeight = stateProps.minRowHeight; // 获取宽/高
var height = rowSpan * minRowHeight;
var width = column.width || estimatedColumnWidth;
var rowMergeColumns = columns.slice(realColumnIndex, realColumnIndex + colSpan);
if (rowMergeColumns.length > 1) {
width = Object(_utils_columns__WEBPACK_IMPORTED_MODULE_6__["getColumnsWidth"])(rowMergeColumns);
} // 该行设置colSpan=0,直接隐藏,就不设置width=0了; 不隐藏设置width=0,会显示border和value,有问题
var display = colSpan === 0 ? 'none' : 'flex'; // 如果虚拟列的第一列是合并导致隐藏的,需要让它占个位置,不然这行会错位
// 如果是尾部列不用考虑这个问题
var vFirstColumn = grid.virtualColumns[0] || {};
var vFirstColumnRender = type === 'header' ? vFirstColumn._headerCellProps : vFirstColumn.render;
if (vFirstColumnRender) {
var vFirstValue = row[vFirstColumn['key'] || vFirstColumn['dataIndex']];
var vFirstRealColumnsIndex = grid.startColumnIndex;
var vFirstRenderData = vFirstColumnRender(vFirstValue, row, rowIndex, realRowIndex, vFirstColumn, 0, vFirstRealColumnsIndex);
if (Object(_utils_base__WEBPACK_IMPORTED_MODULE_7__["isRenderCellObj"])(vFirstRenderData)) {
var vFirstCellProps = type === 'header' ? vFirstRenderData : vFirstRenderData.props || {};
if (vFirstCellProps.colSpan === 0) {
// 截取第一列到当前列
var startVirtualColumns = grid.virtualColumns.slice(0, columnIndex + 1); // 过滤出第一列到当前列display none的列
var svHiddenColumns = startVirtualColumns.filter(function (svColumn, svColumnIndex) {
var svColumnRender = type === 'header' ? svColumn._headerCellProps : svColumn.render;
if (svColumnRender) {
var svValue = row[svColumn['key'] || svColumn['dataIndex']];
var svRealColumnIndex = svColumnIndex + vFirstRealColumnsIndex;
var svRenderData = svColumnRender(svValue, row, rowIndex, realRowIndex, svColumn, svColumnIndex, svRealColumnIndex);
if (Object(_utils_base__WEBPACK_IMPORTED_MODULE_7__["isRenderCellObj"])(svRenderData)) {
var svCellProps = type === 'header' ? svRenderData : svRenderData.props || {};
return svCellProps.colSpan === 0;
}
}
}); // 这两个columns相等,说明第一列到当前列全是隐藏到列
if (startVirtualColumns.length === svHiddenColumns.length) {
display = 'flex';
}
}
}
}
return {
width: width,
height: height,
display: display,
visibility: rowSpan < 1 ? 'hidden' : undefined // 这个是为了隐藏跨行
};
};
/**
* 单元格
* @param {Object} row 行信息
* @param {Number} rowIndex 可视行坐标
* @param {Object} column 列信息
* @param {Number} columnIndex 可视列坐标
* @param {String} type 类型 header|body|footer
* @returns Element
* @private
*/
var _cellRender = function _cellRender(row, rowIndex, column, columnIndex, _ref2) {
var type = _ref2.type;
var realRowIndex = rowIndex + grid.startRowIndex;
var realColumnIndex = column.fixed ? column.realFcIndex : columnIndex + grid.startColumnIndex;
var value = row[column['key'] || column['dataIndex']];
var _getCellChildNode2 = _getCellChildNode(value, row, rowIndex, realRowIndex, column, columnIndex, realColumnIndex, {
type: type
}),
childNode = _getCellChildNode2.childNode,
cellProps = _getCellChildNode2.cellProps;
var colSpan = cellProps.colSpan,
rowSpan = cellProps.rowSpan; // 获取cell信息
var _getCellColRowSpanSty = getCellColRowSpanStyle({
row: row,
rowIndex: rowIndex,
realRowIndex: realRowIndex,
column: column,
columnIndex: columnIndex,
realColumnIndex: realColumnIndex,
colSpan: colSpan,
rowSpan: rowSpan,
type: type
}),
width = _getCellColRowSpanSty.width,
height = _getCellColRowSpanSty.height,
display = _getCellColRowSpanSty.display,
visibility = _getCellColRowSpanSty.visibility; // 是否显示边框
var cellBordered = Object(_utils_gridCell__WEBPACK_IMPORTED_MODULE_2__["getCellBordered"])({
type: type,
isSticky: isSticky,
headerBordered: headerBordered,
bordered: bordered
}); // 对齐方式 'left' | 'right' | 'center'
var align = Object(_utils_gridCell__WEBPACK_IMPORTED_MODULE_2__["getCellAlign"])({
type: type,
column: column
}); // 固定列阴影
var fixedLeftColumns = stateProps.fixedLeftColumns,
fixedRightColumns = stateProps.fixedRightColumns;
var cellInfo = Object(_utils_fixUtil__WEBPACK_IMPORTED_MODULE_3__["getFixedCellInfo"])({
column: column,
fixedLeftColumns: fixedLeftColumns,
fixedRightColumns: fixedRightColumns
});
var cellFixedShadow = Object(_utils_fixUtil__WEBPACK_IMPORTED_MODULE_3__["getCellFixedShadow"])({
cellInfo: cellInfo
});
var cellFixedStyle = Object(_utils_fixUtil__WEBPACK_IMPORTED_MODULE_3__["getFixedCellStyle"])({
cellInfo: cellInfo
}); // className
var _column$className = column.className,
className = _column$className === void 0 ? '' : _column$className,
_column$ellipsisTitle = column.ellipsisTitle,
ellipsisTitle = _column$ellipsisTitle === void 0 ? true : _column$ellipsisTitle; // 有要重写对应header|body|footer的cell
var CellComponent = Components[type].cell; // {width, onResize}
var defaultCellProps = typeof column.onCell === 'function' ? column.onCell(column, realRowIndex) : {};
var cellPropsMap = {
header: Object(_utils_base__WEBPACK_IMPORTED_MODULE_7__["sameType"])(column.onHeaderCell, 'Function') ? column.onHeaderCell(column, realRowIndex) : undefined,
body: Object(_utils_base__WEBPACK_IMPORTED_MODULE_7__["sameType"])(column.onBodyCell, 'Function') ? column.onBodyCell(column, realRowIndex) : undefined,
footer: Object(_utils_base__WEBPACK_IMPORTED_MODULE_7__["sameType"])(column.onFooterCell, 'Function') ? column.onFooterCell(column, realRowIndex) : undefined
};
var additionalCellProps = cellPropsMap[type] || defaultCellProps;
var cellKey = "cell_".concat(type === 'body' ? realRowIndex : type, "_").concat(realColumnIndex);
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(CellComponent, _extends({}, additionalCellProps, {
key: cellKey,
"data-key": cellKey,
className: "vt-grid-cell ".concat(cellFixedShadow, " ").concat(cellBordered, " ").concat(align, " ").concat(className),
onClick: function onClick(e) {
return __onCellTap(e, value, row, rowIndex, realRowIndex, column, columnIndex, realColumnIndex);
},
colSpan: colSpan,
rowSpan: rowSpan,
style: _objectSpread(_objectSpread({
width: width,
minWidth: width,
minHeight: stateProps.minRowHeight,
height: stateProps.fixedRowHeight ? height : undefined,
display: display,
visibility: visibility
}, column.style), cellFixedStyle)
}), column.ellipsis ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
className: 'vt-ellipsis',
title: ellipsisTitle ? value : undefined
}, childNode) : childNode);
};
/**
* 获取单元格渲染信息
* @param {String} value 值
* @param {Object} row 行信息
* @param {Number} rowIndex 可视行坐标
* @param {Number} realRowIndex 真实的行坐标
* @param {Object} column 列信息
* @param {Number} columnIndex 可视列坐标
* @param {Number} realColumnIndex 真实的列坐标
* @param {String} type 类型 header|body|footer
* @returns {{cellProps: {}, childNode: null}}
* @private
*/
var _getCellChildNode = function _getCellChildNode(value, row, rowIndex, realRowIndex, column, columnIndex, realColumnIndex, _ref3) {
var type = _ref3.type;
var cellProps = {};
var childNode = value;
if (type === 'header') {
if (column.headRender) {
// TODO 后续废弃
childNode = Object(_utils_base__WEBPACK_IMPORTED_MODULE_7__["sameType"])(column.headRender, 'Function') ? column.headRender(value, row, rowIndex, realRowIndex, column, columnIndex, realColumnIndex) : value;
}
if (Object(_utils_base__WEBPACK_IMPORTED_MODULE_7__["sameType"])(column.title, 'Function')) {
childNode = column.title(value, row, rowIndex);
}
if (Object(_utils_base__WEBPACK_IMPORTED_MODULE_7__["sameType"])(column._headerCellProps, 'Function')) {
cellProps = column._headerCellProps(value, row, rowIndex);
}
} else {
if (column.render) {
var renderData = column.render(value, row, rowIndex, realRowIndex, column, columnIndex, realColumnIndex);
if (Object(_utils_base__WEBPACK_IMPORTED_MODULE_7__["isRenderCellObj"])(renderData)) {
childNode = renderData.children;
cellProps = renderData.props || {};
} else {
childNode = renderData;
}
}
} // Not crash if final `childNode` is not validate ReactNode
if (Object(_utils_base__WEBPACK_IMPORTED_MODULE_7__["sameType"])(childNode, 'Object') && !react__WEBPACK_IMPORTED_MODULE_0___default.a.isValidElement(childNode)) {
childNode = null;
}
return {
childNode: childNode,
cellProps: cellProps
};
};
/**
* 点击单元格函数
* @param {Event} e
* @param {String} value 值
* @param {Object} row 行信息
* @param {Number} rowIndex 可视行坐标
* @param {Number} realRowIndex 真实的行坐标
* @param {Object} column 列信息
* @param {Number} columnIndex 可视列坐标
* @param {Number} realColumnIndex 真实的列坐标
* @private
*/
var __onCellTap = function __onCellTap(e, value, row, rowIndex, realRowIndex, column, columnIndex, realColumnIndex) {
e.preventDefault();
if (typeof onCellTap === 'function') {
onCellTap(value, row, rowIndex, realRowIndex, column, columnIndex, realColumnIndex);
}
}; // 移入行 新增class vt-grid-row-hover
var __onMouseEnter = function __onMouseEnter(_ref4) {
var type = _ref4.type,
rowKey = _ref4.rowKey;
// sticky不需要下面方法,直接css:hover就能支持
if (type === 'body' && !isSticky) {
// 使用这种方式,减少hover时的重新渲染
try {
var scopeDOM = document.querySelectorAll('div.vt-grid-row');
var rowsCollection = Object(_utils_base__WEBPACK_IMPORTED_MODULE_7__["queryCustomAttributeDOM"])(scopeDOM, 'data-key', "row_".concat(rowKey));
rowsCollection.forEach(function (rowDom) {
var className = rowDom.getAttribute('class') + ' vt-grid-row-hover';
rowDom.setAttribute('class', className);
});
} catch (e) {
console.warn(e);
}
}
}; // 移出行 移除class vt-grid-row-hover
var __onMouseLeave = function __onMouseLeave(_ref5) {
var type = _ref5.type,
rowKey = _ref5.rowKey;
if (type === 'body' && !isSticky) {
try {
var scopeDOM = document.querySelectorAll('div.vt-grid-row');
var rowsCollection = Object(_utils_base__WEBPACK_IMPORTED_MODULE_7__["queryCustomAttributeDOM"])(scopeDOM, 'data-key', "row_".concat(rowKey));
rowsCollection.forEach(function (rowDom) {
var className = rowDom.getAttribute('class').replace(' vt-grid-row-hover', '');
rowDom.setAttribute('class', className);
});
} catch (e) {
console.warn(e);
}
}
};
/**
* 获取同步固定列的行高
* @param {String} type 类型 header|body|footer
* @param {Number} rowIndex 可视行坐标
* @return height
*/
function getRowHeight(_ref6) {
var type = _ref6.type,
rowIndex = _ref6.rowIndex;
var height = undefined;
if (shouldRowHeightSync && !_VTableContext.isSticky && type === 'body' && mgType !== 'mainMultiGrid') {
var _props$rowsHeightArr = props.rowsHeightArr,
rowsHeightArr = _props$rowsHeightArr === void 0 ? [] : _props$rowsHeightArr;
height = rowsHeightArr[rowIndex];
}
if (type === 'footer') {
height = stateProps.minRowHeight;
}
return height;
}
;
/**
* 行
* @param {Object} row 行数据
* @param {Number} rowIndex 可视行坐标
* @param {String} type 类型 header|body|footer
* @param {Array} displayedFooterColumns footer列 []
* @return Element
*/
var _gridRowRender = function _gridRowRender(row, rowIndex, _ref7) {
var type = _ref7.type,
displayedFooterColumns = _ref7.displayedFooterColumns;
var realRowIndex = rowIndex + grid.startRowIndex; // 是否选中
var _rowSelection$selecte = rowSelection.selectedRowKeys,
selectedRowKeys = _rowSelection$selecte === void 0 ? [] : _rowSelection$selecte;
var _rowKey = Object(_utils_rowKey__WEBPACK_IMPORTED_MODULE_9__["getRowKey"])(rowKey, row, realRowIndex);
var selected = selectedRowKeys.includes(_rowKey); // isSticky:true时设置
var height = stateProps.fixedRowHeight ? stateProps.minRowHeight : getRowHeight({
type: type,
rowIndex: rowIndex
}); // 有要重写对应header|body|footer的row
var RowComponent = Components[type].row; // {index, moveRow}
var additionalRowProps = typeof onRow === 'function' ? onRow(row, realRowIndex) : {};
var mouseEvent = {
onMouseEnter: function onMouseEnter(event) {
__onMouseEnter({
type: type,
rowKey: _rowKey
});
if (additionalRowProps.onMouseEnter) {
additionalRowProps.onMouseEnter(event);
}
},
onMouseLeave: function onMouseLeave(event) {
__onMouseLeave({
type: type,
rowKey: _rowKey
});
if (additionalRowProps.onMouseLeave) {
additionalRowProps.onMouseLeave(event);
}
}
};
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(RowComponent, _extends({}, additionalRowProps, mouseEvent, {
key: "row_".concat(_rowKey),
"data-key": "row_".concat(_rowKey),
className: Object(_utils_base__WEBPACK_IMPORTED_MODULE_7__["classNames"])('vt-grid-row', {
'vt-grid-row-selected': selected
}, additionalRowProps.className),
style: {
height: height,
contain: stateProps.fixedRowHeight ? 'none' : '' // height: stateProps.estimatedRowHeight,
// width: stateProps.visibleWidth
}
}), // footer不展示勾选框
(displayedFooterColumns || displayedColumns).map(function (column, columnIndex) {
return _cellRender(row, rowIndex, column, columnIndex, {
type: type
});
}));
};
var onScrollCapture = function onScrollCapture(e) {
if ((!_VTableContext.isSticky || _VTableContext.headerNotSticky) && mgType === 'mainMultiGrid') _VTableContext.onScroll(e);
if (type === 'body' && onScrollTopSync) onScrollTopSync(e);
_onScrollEvent(); // 设置元素不对指针事件做出反应
realGridContainer.current.style.pointerEvents = 'none';
_resetIsScrollingDebounced();
};
var _resetIsScrollingDebounced = function _resetIsScrollingDebounced() {
if (resetIsScrollingTimeoutIdRef.current !== null) {
Object(_utils_timer__WEBPACK_IMPORTED_MODULE_11__["cancelTimeout"])(resetIsScrollingTimeoutIdRef.current);
}
resetIsScrollingTimeoutIdRef.current = Object(_utils_timer__WEBPACK_IMPORTED_MODULE_11__["requestTimeout"])(_resetIsScrolling, 150);
};
var _resetIsScrolling = Object(react__WEBPACK_IMPORTED_MODULE_0__["useCallback"])(function () {
resetIsScrollingTimeoutIdRef.current = null;
realGridContainer.current.style.pointerEvents = ''; // if (type === 'body' && props.syncRowHeight) props.syncRowHeight('setState');
}, []);
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_0___default.a.Fragment, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
className: Object(_utils_base__WEBPACK_IMPORTED_MODULE_7__["classNames"])('vt-grid-container', className),
ref: gridContainer,
onScrollCapture: onScrollCapture,
style: _objectSpread({
height: stateProps.visibleHeight
}, gridStyle || {})
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
ref: realGridContainer,
style: {
willChange: 'transform',
// pointerEvents: 'none',
// transform: `translateY(${grid.startVerticalOffset}px)`,
paddingTop: grid.startVerticalOffset,
paddingBottom: grid.endVerticalOffset,
paddingLeft: grid.startHorizontalOffset,
paddingRight: grid.endHorizontalOffset
}
}, // sticky header
_VTableContext.isSticky && !_VTableContext.headerNotSticky && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
className: "vt-table-header vt-header-sticky"
}, _VTableContext.headerTitle.map(function (row, rowIndex) {
// 行渲染
return _gridRowRender(row, rowIndex, {
type: 'header'
});
})), grid.virtualData.map(function (row, rowIndex) {
// 行渲染
return _gridRowRender(row, rowIndex, {
type: type
});
}), // sticky footer
_VTableContext.isSticky && _VTableContext.summaryData && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
className: "vt-table-footer vt-footer-sticky"
}, _VTableContext.summaryData.map(function (row, rowIndex) {
// 行渲染
return _gridRowRender(row, rowIndex, {
type: 'footer',
displayedFooterColumns: displayedFooterColumns
});
})))));
};
Grid.propTypes = {
columns: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.array,
dataSource: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.array,
visibleWidth: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
visibleHeight: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
estimatedRowHeight: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
minRowHeight: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
rowVisibleCount: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
rowOffsetCount: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
estimatedColumnWidth: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
columnVisibleCount: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
columnOffsetCount: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.number,
fixedRowHeight: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
fixedLeftColumns: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.array,
fixedRightColumns: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.array,
// 类型 header
type: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
mgType: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
className: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string,
// .vt-grid-container 样式
gridStyle: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object,
shouldRowHeightSync: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
headerBordered: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
bordered: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.bool,
rowKey: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func]),
components: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.object,
onRow: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
onScrollTopSync: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func,
onCellTap: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.func
}; // Grid.whyDidYouRender = true;
/* harmony default export */ __webpack_exports__["default"] = (react__WEBPACK_IMPORTED_MODULE_0___default.a.memo(react__WEBPACK_IMPORTED_MODULE_0___default.a.forwardRef(Grid)));
/***/ }),
/***/ "./libs/VTable2.0/MultiGrid.js":
/*!*************************************!*\
!*** ./libs/VTable2.0/MultiGrid.js ***!
\*************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _Grid__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Grid */ "./libs/VTable2.0/Grid.js");
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);
/* harmony import */ var _utils_fixUtil__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils/fixUtil */ "./libs/VTable2.0/utils/fixUtil.js");
/* harmony import */ var _utils_deepClone__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./utils/deepClone */ "./libs/VTable2.0/utils/deepClone.js");
/* harmony import */ var _utils_base__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./utils/base */ "./libs/VTable2.0/utils/base.js");
/* harmony import */ var _styles_multi_grid_less__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./styles/multi-grid.less */ "./libs/VTable2.0/styles/multi-grid.less");
/* harmony import */ var _styles_multi_grid_less__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_styles_multi_grid_less__WEBPACK_IMPORTED_MODULE_6__);
/* harmony import */ var _context_VTableContext__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./context/VTableContext */ "./libs/VTable2.0/context/VTableContext.js");
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
var MultiGrid = function MultiGrid(props, ref) {
var _multiGridContainer = Object(react__WEBPACK_IMPORTED_MODULE_0__["useRef"])(null); // 要向父VTable暴露的
var multiGridContainer = Object(react__WEBPACK_IMPORTED_MODULE_0__["useRef"])(null);
Object(react__WEBPACK_IMPORTED_MODULE_0__["useImperativeHandle"])(ref, function () {
return {
// multiGridContainer: multiGridContainer.current,
gridContainer: multiGridContainer.current.gridContainer
};
}); //
var type = props.type,
mgClassName = props.mgClassName,
shouldRowHeightSync = props.shouldRowHeightSync,
columns = props.columns,
hasFixed = props.hasFixed,
dataSource = props.dataSource,
_props$fixedLeftColum = props.fixedLeftColumnCount,
fixedLeftColumnCount = _props$fixedLeftColum === void 0 ? 0 : _props$fixedLeftColum,
_props$fixedRightColu = props.fixedRightColumnCount,
fixedRightColumnCount = _props$fixedRightColu === void 0 ? 0 : _props$fixedRightColu,
bodyScrollBarWidth = props.bodyScrollBarWidth,
bodyScrollBarHeight = props.bodyScrollBarHeight; //
var multiGridContainerLeft = Object(react__WEBPACK_IMPORTED_MODULE_0__["useRef"])(null);
var multiGridContainerRight = Object(react__WEBPACK_IMPORTED_MODULE_0__["useRef"])(null);
var _VTableContext = Object(react__WEBPACK_IMPORTED_MODULE_0__["useContext"])(_context_VTableContext__WEBPACK_IMPORTED_MODULE_7__["default"]); // let [rowsHeightCacheId, setRowsHeightCacheId] = useState([]);
var _useState = Object(react__WEBPACK_IMPORTED_MODULE_0__["useState"])([]),
_useState2 = _slicedToArray(_useState, 2),
rowsHeightArr = _useState2[0],
setRowsHeightArr = _useState2[1];
Object(react__WEBPACK_IMPORTED_MODULE_0__["useEffect"])(function () {
// 同步固定列的高度
if (shouldRowHeightSync && !_VTableContext.isSticky && type === 'body' && hasFixed) {
var timer = setTimeout(function () {
// syncRowHeight({forceUpdate: true});
var current = multiGridContainer.current;
if (current) {
current.gridContainer.scrollLeft += 1;
var slTimer = setTimeout(function () {
current.gridContainer.scrollLeft -= 1;
clearTimeout(slTimer);
}, 50);
}
clearTimeout(timer);
}, 150);
}
}, [columns, dataSource, hasFixed]); // main columns
var getColumns = Object(react__WEBPACK_IMPORTED_MODULE_0__["useMemo"])(function () {
if (!hasFixed) {
return columns;
}
var end = fixedRightColumnCount ? -fixedRightColumnCount : undefined;
return fixedLeftColumnCount || fixedRightColumnCount ? Object(_utils_deepClone__WEBPACK_IMPORTED_MODULE_4__["deepClone"])(columns).slice(fixedLeftColumnCount, end) : columns;
}, [hasFixed, columns, fixedLeftColumnCount, fixedRightColumnCount]); // fixed left columns
var getFixedLeftColumns = Object(react__WEBPACK_IMPORTED_MODULE_0__["useMemo"])(function () {
if (!hasFixed) {
return [];
}
var fixedLeftColumns = fixedLeftColumnCount ? columns.slice(0, fixedLeftColumnCount) : [];
return Object(_utils_fixUtil__WEBPACK_IMPORTED_MODULE_3__["formatFixedLeftColumns"])({
fixedLeftColumns: fixedLeftColumns
});
}, [hasFixed, columns, fixedLeftColumnCount]); // fixed right columns
var getFixedRightColumns = Object(react__WEBPACK_IMPORTED_MODULE_0__["useMemo"])(function () {
if (!hasFixed) {
return [];
}
var fixedRightColumns = fixedRightColumnCount ? columns.slice(-fixedRightColumnCount) : [];
return Object(_utils_fixUtil__WEBPACK_IMPORTED_MODULE_3__["formatFixedRightColumns"])({
fixedRightColumns: fixedRightColumns,
columnsLength: columns.length
});
}, [hasFixed, columns, fixedRightColumnCount]); // 未使用sticky的主内容列
var mainColumns = Object(react__WEBPACK_IMPORTED_MODULE_0__["useMemo"])(function () {
return [].concat(_toConsumableArray(getFixedLeftColumns), _toConsumableArray(getColumns), _toConsumableArray(getFixedRightColumns));
}, [getFixedLeftColumns, getColumns, getFixedRightColumns]); //
var onScrollTopSync = Object(react__WEBPACK_IMPORTED_MODULE_0__["useCallback"])(function (e) {
var scrollTop = e && e.target && e.target.scrollTop; // window.requestAnimationFrame(() => {
var leftCurrent = multiGridContainerLeft.current;
var rightCurrent = multiGridContainerRight.current; //
if (leftCurrent) {
e.preventDefault();
leftCurrent.gridContainer.scrollTop = scrollTop;
}
if (rightCurrent) {
e.preventDefault();
rightCurrent.gridContainer.scrollTop = scrollTop;
} // });
syncRowHeight('setState');
}, []); // no isSticky
var syncRowHeight = function syncRowHeight() {
var syncType = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'setDomStyle';
// 同步固定列的高度
if (shouldRowHeightSync && !_VTableContext.isSticky && type === 'body' && hasFixed) {
var multiGridCurrent = multiGridContainer.current;
var gridRowCollection = multiGridCurrent.gridContainer.querySelectorAll('.vt-grid-row'); // if (syncType === 'setDomStyle') {
// const multiGridContainerLeftCurrent = multiGridContainerLeft.current;
// const multiGridContainerRightCurrent = multiGridContainerRight.current;
// gridRowCollection.forEach((gridRowDom) => {
// const dataKey = gridRowDom.getAttribute('data-key');
// const leftRowDom = multiGridContainerLeftCurrent && multiGridContainerLeftCurrent.gridContainer.querySelector(`[data-key=${dataKey}]`);
// if (leftRowDom) leftRowDom.style.height = gridRowDom.clientHeight + 'px';
//
// const rightRowDom = multiGridContainerRightCurrent && multiGridContainerRightCurrent.gridContainer.querySelector(`[data-key=${dataKey}]`);
// if (rightRowDom) rightRowDom.style.height = gridRowDom.clientHeight + 'px';
// });
// }
if (syncType === 'setState') {
var gridRowHeightArr = Array.prototype.slice.call(gridRowCollection).map(function (item) {
return item.clientHeight;
});
setRowsHeightArr(gridRowHeightArr);
}
}
};
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_0___default.a.Fragment, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", {
className: Object(_utils_base__WEBPACK_IMPORTED_MODULE_5__["classNames"])('vt-multi-grid-container', mgClassName),
ref: _multiGridContainer
}, _VTableContext.isSticky ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_Grid__WEBPACK_IMPORTED_MODULE_1__["default"], _extends({}, props, {
ref: multiGridContainer // 加这个key是因为固定列变化 列数据多渲染一列 todo 原因
,
key: "".concat(fixedLeftColumnCount, "_").concat(fixedRightColumnCount, "_").concat(hasFixed