@antmjs/vantui
Version:
一套适用于Taro3及React的vantui组件库
232 lines (225 loc) • 11.2 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useWaterfallAttributes = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _react = require("react");
var _useNextTick = require("./hooks/useNextTick");
var _hooks = require("./hooks");
var _excluded = ["height"];
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) { (0, _defineProperty2.default)(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; }
/**
* @description 当某一项的size变化时的回调
* @param item 变化的项
* @param size 变化后的size
*/
/**
* @description 当某一项被移除时的回调
* @param item 被移除的项
*/
var useWaterfallAttributes = function useWaterfallAttributes(columnNum, gutter) {
var forceUpdate = (0, _hooks.useForceUpdate)();
var _useMemo = (0, _react.useMemo)(function () {
if (Array.isArray(gutter)) {
return gutter;
}
if (typeof gutter === 'number') {
return [gutter, gutter];
}
return [0, 0];
}, [gutter]),
_useMemo2 = (0, _slicedToArray2.default)(_useMemo, 2),
horizontalGutter = _useMemo2[0],
verticalGutter = _useMemo2[1];
// 记录每一项的位置信息
var attributesRef = (0, _react.useRef)(new Map());
var columnsRef = (0, _react.useRef)((0, _toConsumableArray2.default)(Array(columnNum)).map(function () {
return {
height: 0,
items: []
};
}));
// 一个队列,用来存储各个元素的尺寸变化,然后统一计算更新,Taro.nextTick?
var initItemsQueueRef = (0, _react.useRef)([]);
var itemResizeStatusRef = (0, _react.useRef)(new Map());
(0, _react.useEffect)(function () {
attributesRef.current = new Map();
columnsRef.current = (0, _toConsumableArray2.default)(Array(columnNum)).map(function () {
return {
height: 0,
items: []
};
});
forceUpdate();
}, [columnNum, forceUpdate]);
var initItem = (0, _hooks.usePersistFn)(function (item, size) {
var columnHeights = columnsRef.current.map(function (column) {
return column.height;
});
var minHeight = Math.min.apply(Math, (0, _toConsumableArray2.default)(columnHeights));
var minHeightIndex = columnHeights.indexOf(minHeight);
var increaseHeight = minHeight ? verticalGutter : 0;
attributesRef.current.set(item.key, {
// 计算每一项的位置、宽高、列索引
key: item.key,
left: minHeightIndex * (size.width + horizontalGutter),
top: minHeight + increaseHeight,
width: size.width,
height: size.height,
columnIndex: minHeightIndex
});
columnsRef.current[minHeightIndex].height += size.height + increaseHeight;
columnsRef.current[minHeightIndex].items.push(item.key);
});
// 初始化
(0, _useNextTick.useNextTick)(function () {
var _initItemsQueueRef$cu;
var hasInit = ((_initItemsQueueRef$cu = initItemsQueueRef.current) === null || _initItemsQueueRef$cu === void 0 ? void 0 : _initItemsQueueRef$cu.length) > 0;
while (((_initItemsQueueRef$cu2 = initItemsQueueRef.current) === null || _initItemsQueueRef$cu2 === void 0 ? void 0 : _initItemsQueueRef$cu2.length) > 0) {
var _initItemsQueueRef$cu2, _initItemsQueueRef$cu3;
var _ref = (_initItemsQueueRef$cu3 = initItemsQueueRef.current.shift()) !== null && _initItemsQueueRef$cu3 !== void 0 ? _initItemsQueueRef$cu3 : {},
_item = _ref.item,
_size = _ref.size;
initItem(_item, _size);
}
hasInit && forceUpdate();
});
var refreshColumns = (0, _hooks.usePersistFn)(function (item, size) {
var _attributesRef$curren;
var positionItem = attributesRef.current.get(item === null || item === void 0 ? void 0 : item.key);
if (typeof (positionItem === null || positionItem === void 0 ? void 0 : positionItem.columnIndex) !== 'number') {
return;
}
// 计算出当前项在所在列的索引,然后更新该列的高度
var columnIndex = positionItem.columnIndex;
var _ref2 = columnsRef.current[columnIndex],
items = _ref2.items;
// 获取当前项所在的索引
var index = items.indexOf(item === null || item === void 0 ? void 0 : item.key);
var _ref3 = (_attributesRef$curren = attributesRef.current.get(item === null || item === void 0 ? void 0 : item.key)) !== null && _attributesRef$curren !== void 0 ? _attributesRef$curren : {},
_ref3$height = _ref3.height,
height = _ref3$height === void 0 ? 0 : _ref3$height,
otherProps = (0, _objectWithoutProperties2.default)(_ref3, _excluded);
// 计算出当前项的高度和间隔的差值
var minusHeight = height - size.height;
attributesRef.current.set(item === null || item === void 0 ? void 0 : item.key, _objectSpread(_objectSpread({}, otherProps), {}, {
height: size.height
}));
for (var i = index + 1; i < items.length; i++) {
var _attributesRef$curren2;
var nextKey = items[i];
var nextItem = (_attributesRef$curren2 = attributesRef.current.get(nextKey)) !== null && _attributesRef$curren2 !== void 0 ? _attributesRef$curren2 : {};
var nextTop = nextItem.top;
// 当前列的后续项的top值需要减去当前项的高度和间隔
attributesRef.current.set(nextKey, _objectSpread(_objectSpread({}, nextItem), {}, {
top: nextTop - minusHeight
}));
}
columnsRef.current[columnIndex].height -= minusHeight;
});
// 处理resize
(0, _useNextTick.useNextTick)(function () {
var entries = (0, _toConsumableArray2.default)(itemResizeStatusRef.current);
var hasResizing = entries.some(function (_ref4) {
var _ref5 = (0, _slicedToArray2.default)(_ref4, 2),
isResizing = _ref5[1].isResizing;
return isResizing;
});
if (!hasResizing) {
return;
}
entries.forEach(function (_ref6) {
var _ref7 = (0, _slicedToArray2.default)(_ref6, 2),
key = _ref7[0],
resizeStatus = _ref7[1];
var lastSize = resizeStatus.lastSize,
isResizing = resizeStatus.isResizing,
item = resizeStatus.item;
if (isResizing) {
refreshColumns(item, lastSize);
itemResizeStatusRef.current.set(key, _objectSpread(_objectSpread({}, resizeStatus), {}, {
isResizing: false
}));
}
});
forceUpdate();
});
var onResize = (0, _hooks.usePersistFn)(function (item, size) {
var _ref8, _size$width, _attributesRef$curren3;
if (!((_ref8 = (_size$width = size === null || size === void 0 ? void 0 : size.width) !== null && _size$width !== void 0 ? _size$width : size === null || size === void 0 ? void 0 : size.height) !== null && _ref8 !== void 0 ? _ref8 : false)) {
return;
}
var _ref9 = (_attributesRef$curren3 = attributesRef.current.get(item === null || item === void 0 ? void 0 : item.key)) !== null && _attributesRef$curren3 !== void 0 ? _attributesRef$curren3 : {},
columnIndex = _ref9.columnIndex;
// 如果已经计算好所在列,则走更新逻辑
if (typeof columnIndex === 'number') {
itemResizeStatusRef.current.set(item === null || item === void 0 ? void 0 : item.key, {
lastSize: size,
isResizing: true,
item: item
});
} else {
initItemsQueueRef.current.push({
item: item,
size: size
});
}
forceUpdate();
});
var onRemove = (0, _hooks.usePersistFn)(function (item) {
var _attributesRef$curren4;
var positionItem = attributesRef.current.get(item === null || item === void 0 ? void 0 : item.key);
if (typeof (positionItem === null || positionItem === void 0 ? void 0 : positionItem.columnIndex) !== 'number') {
return;
}
// 计算出当前项在所在列的索引,然后更新该列的高度
var columnIndex = positionItem.columnIndex;
var _ref10 = columnsRef.current[columnIndex],
items = _ref10.items;
var index = items.indexOf(item === null || item === void 0 ? void 0 : item.key);
var _ref11 = (_attributesRef$curren4 = attributesRef.current.get(item === null || item === void 0 ? void 0 : item.key)) !== null && _attributesRef$curren4 !== void 0 ? _attributesRef$curren4 : {},
_ref11$top = _ref11.top,
top = _ref11$top === void 0 ? 0 : _ref11$top,
_ref11$height = _ref11.height,
minusHeight = _ref11$height === void 0 ? 0 : _ref11$height;
var columnHeight = top;
for (var i = index + 1; i < items.length; i++) {
var _attributesRef$curren5;
var nextKey = items[i];
var nextItem = (_attributesRef$curren5 = attributesRef.current.get(nextKey)) !== null && _attributesRef$curren5 !== void 0 ? _attributesRef$curren5 : {};
var nextTop = nextItem.top,
nextHeight = nextItem.height;
// 当前列的后续项的top值需要减去当前项的高度和间隔
attributesRef.current.set(nextKey, _objectSpread(_objectSpread({}, nextItem), {}, {
top: nextTop - minusHeight - verticalGutter
}));
var increaseGutter = columnHeight && verticalGutter;
columnHeight += nextHeight + increaseGutter;
}
columnsRef.current[columnIndex].height = columnHeight;
columnsRef.current[columnIndex].items.splice(index, 1);
attributesRef.current.delete(item === null || item === void 0 ? void 0 : item.key);
forceUpdate();
});
var positionRecord = Object.assign.apply(Object, [{}].concat((0, _toConsumableArray2.default)((0, _toConsumableArray2.default)(attributesRef.current.entries()).map(function (_ref12) {
var _ref13 = (0, _slicedToArray2.default)(_ref12, 2),
key = _ref13[0],
value = _ref13[1];
return (0, _defineProperty2.default)({}, key, value);
}))));
var columnHeights = columnsRef.current.map(function (column) {
return column.height;
});
var containerHeight = Math.max.apply(Math, (0, _toConsumableArray2.default)(columnHeights));
return [containerHeight, positionRecord, {
onResize: onResize,
onRemove: onRemove
}];
};
exports.useWaterfallAttributes = useWaterfallAttributes;