linkmore-design
Version:
🌈 🚀lm组件库。🚀
127 lines (123 loc) • 5.78 kB
JavaScript
import _extends from "@babel/runtime/helpers/esm/extends";
import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
var _excluded = ["children", "pref"];
import React, { useRef, useMemo, useEffect } from 'react';
import { useStore } from "./context";
import useForkRef from "../hooks/useForkRef";
import { omit } from 'lodash';
var useOptions = function useOptions(_ref) {
var _sliceColumns$centerC4;
var children = _ref.children,
ref = _ref.ref,
trRef = _ref.trRef;
var _useStore = useStore(),
state = _useStore.state,
dispatch = _useStore.dispatch,
instance = _useStore.instance;
var virtualItems = instance.columnVirtual.virtualItems;
var rowHeight = state.rowHeight,
totalLen = state.totalLen;
var sliceColumns = useMemo(function () {
var _children$reduce;
return children === null || children === void 0 ? void 0 : (_children$reduce = children.reduce) === null || _children$reduce === void 0 ? void 0 : _children$reduce.call(children, function (pre, cur) {
var _cur$props, _cur$props2;
if (typeof ((_cur$props = cur.props) === null || _cur$props === void 0 ? void 0 : _cur$props.fixLeft) === 'number') {
pre.leftColumns.push(cur);
return pre;
}
if (typeof ((_cur$props2 = cur.props) === null || _cur$props2 === void 0 ? void 0 : _cur$props2.fixRight) === 'number') {
pre.rightColumns.push(cur);
return pre;
}
pre.centerColumns.push(cur);
return pre;
}, {
leftColumns: [],
rightColumns: [],
centerColumns: []
});
}, [children]);
useEffect(function () {
dispatch({
type: 'changeSliceColumns',
sliceColumns: sliceColumns
});
}, [sliceColumns]);
// 非固定列长度
var centerColumnsLen = useMemo(function () {
var _sliceColumns$centerC, _sliceColumns$centerC2;
return (_sliceColumns$centerC = sliceColumns === null || sliceColumns === void 0 ? void 0 : (_sliceColumns$centerC2 = sliceColumns.centerColumns) === null || _sliceColumns$centerC2 === void 0 ? void 0 : _sliceColumns$centerC2.length) !== null && _sliceColumns$centerC !== void 0 ? _sliceColumns$centerC : 0;
}, [sliceColumns]);
useEffect(function () {
if (state.columnsLen !== centerColumnsLen) {
dispatch({
type: 'changeColumnsLen',
columnsLen: centerColumnsLen !== null && centerColumnsLen !== void 0 ? centerColumnsLen : 0
});
}
}, [centerColumnsLen, dispatch, state.columnsLen]);
// 获取行的高度
useEffect(function () {
var initHeight = function initHeight(tempRef) {
var _tempRef$current;
if (tempRef !== null && tempRef !== void 0 && (_tempRef$current = tempRef.current) !== null && _tempRef$current !== void 0 && _tempRef$current.offsetHeight && !rowHeight && totalLen) {
var _tempRef$current$offs, _tempRef$current2;
var tempRowHeight = (_tempRef$current$offs = tempRef === null || tempRef === void 0 ? void 0 : (_tempRef$current2 = tempRef.current) === null || _tempRef$current2 === void 0 ? void 0 : _tempRef$current2.offsetHeight) !== null && _tempRef$current$offs !== void 0 ? _tempRef$current$offs : 0;
dispatch({
type: 'initHeight',
rowHeight: tempRowHeight + 1
});
}
};
initHeight(Object.prototype.hasOwnProperty.call(ref, 'current') ? ref : trRef);
}, [trRef, dispatch, rowHeight, totalLen, ref]);
// 横向单元格合并
var leftColSpan = useMemo(function () {
var _virtualItems$;
return (_virtualItems$ = virtualItems[0]) === null || _virtualItems$ === void 0 ? void 0 : _virtualItems$.index;
}, [virtualItems]);
// 右侧隐藏数量
var rightColSpan = useMemo(function () {
var _sliceColumns$centerC3;
return (sliceColumns === null || sliceColumns === void 0 ? void 0 : (_sliceColumns$centerC3 = sliceColumns.centerColumns) === null || _sliceColumns$centerC3 === void 0 ? void 0 : _sliceColumns$centerC3.length) - (virtualItems === null || virtualItems === void 0 ? void 0 : virtualItems.length) - leftColSpan || 0;
}, [sliceColumns === null || sliceColumns === void 0 ? void 0 : (_sliceColumns$centerC4 = sliceColumns.centerColumns) === null || _sliceColumns$centerC4 === void 0 ? void 0 : _sliceColumns$centerC4.length, virtualItems.length, leftColSpan]);
return _objectSpread(_objectSpread({
virtualItems: virtualItems
}, sliceColumns), {}, {
leftColSpan: leftColSpan,
rightColSpan: rightColSpan
});
};
var VirtualRow = /*#__PURE__*/React.memo(function (_ref2, ref) {
var children = _ref2.children,
pref = _ref2.pref,
resetProps = _objectWithoutProperties(_ref2, _excluded);
var trRef = useRef(null);
var clearProps = omit(resetProps, ['dataKey', 'pushAllForm']);
var _useOptions = useOptions({
children: children,
ref: ref,
trRef: trRef
}),
virtualItems = _useOptions.virtualItems,
leftColumns = _useOptions.leftColumns,
centerColumns = _useOptions.centerColumns,
rightColumns = _useOptions.rightColumns,
leftColSpan = _useOptions.leftColSpan,
rightColSpan = _useOptions.rightColSpan;
return /*#__PURE__*/React.createElement("tr", _extends({}, clearProps, {
ref: useForkRef(pref, trRef)
}), leftColumns, !!leftColSpan && /*#__PURE__*/React.createElement("td", {
key: "leftColSpan",
colSpan: leftColSpan
}), virtualItems.map(function (virtualCol) {
return /*#__PURE__*/React.cloneElement(centerColumns[virtualCol.index], {
ref: virtualCol.measureRef
});
}), !!rightColSpan && /*#__PURE__*/React.createElement("td", {
key: "rightColSpan",
colSpan: rightColSpan
}), rightColumns);
});
export default VirtualRow;