UNPKG

@alibsp/elevator

Version:
131 lines (109 loc) 5.01 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); exports.__esModule = true; exports["default"] = Elevator; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _react = _interopRequireWildcard(require("react")); var _next = require("@alifd/next"); require("./index.scss"); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } var findNode = function findNode(target, param) { if (!target) { if (param) return param; return null; } if (typeof target === "function") { try { target = target(); } catch (err) { target = null; } } return target; }; function Elevator(props) { var _ref = props || {}, _ref$className = _ref.className, className = _ref$className === void 0 ? "" : _ref$className, activeKey = _ref.activeKey, dataSource = _ref.dataSource, _ref$offset = _ref.offset, offset = _ref$offset === void 0 ? 0 : _ref$offset, container = _ref.container, children = _ref.children, _ref$useAbsolute = _ref.useAbsolute, useAbsolute = _ref$useAbsolute === void 0 ? false : _ref$useAbsolute, _ref$hasMargin = _ref.hasMargin, hasMargin = _ref$hasMargin === void 0 ? false : _ref$hasMargin, _ref$tabProps = _ref.tabProps, tabProps = _ref$tabProps === void 0 ? {} : _ref$tabProps; var scrolling = (0, _react.useRef)(false); var _useState = (0, _react.useState)(activeKey || (dataSource.length ? dataSource[0].id : "")), active = _useState[0], setActive = _useState[1]; var _useState2 = (0, _react.useState)(findNode(container)), target = _useState2[0], setTarget = _useState2[1]; var clickHandler = function clickHandler(id) { setActive(id); scrolling.current = true; var currentTop = document.querySelector("#" + id).offsetTop + offset; target.scrollTo(0, currentTop); setTimeout(function () { scrolling.current = false; }, 100); }; var scrollListener = function scrollListener() { requestAnimationFrame(function () { if (scrolling.current) return; if (!dataSource.length) { return; } var scrollTop = target.scrollY || target.scrollTop; for (var i = 0; i < dataSource.length; i++) { // 当前区块将消失,下一区块的offsetTop与scrollTop相同时 if (dataSource[i + 1] && document.querySelector("#" + dataSource[i + 1].id).offsetTop > scrollTop) { setActive(dataSource[i].id); return; } } if (active !== dataSource[dataSource.length - 1].id) { setActive(dataSource[dataSource.length - 1].id); } }); }; (0, _react.useEffect)(function () { setTimeout(function () { setTarget(findNode(props.container, window)); }); }, []); (0, _react.useEffect)(function () { target && target.addEventListener("scroll", scrollListener); return function () { target && target.removeEventListener("scroll", scrollListener); }; }, [target]); return /*#__PURE__*/_react["default"].createElement("div", { className: "mod-bsp-eleavtor " + className }, /*#__PURE__*/_react["default"].createElement(_next.Affix, { useAbsolute: useAbsolute, container: function container() { return target; }, className: "mod-bsp-eleavtor-affix " + (hasMargin ? "mod-bsp-eleavtor-affix-hasMargin" : "") }, /*#__PURE__*/_react["default"].createElement(_next.Tab, (0, _extends2["default"])({ size: "medium", shape: "text", activeKey: active, className: "mod-bsp-eleavtor-tab" }, tabProps), dataSource.map(function (item) { return /*#__PURE__*/_react["default"].createElement(_next.Tab.Item, { key: item.id, title: item.title, onClick: function onClick() { return clickHandler(item.id); } }); }))), children); }