UNPKG

@gizwits/vantui

Version:

机智云组件库

152 lines 5.99 kB
import _defineProperty from "@babel/runtime/helpers/defineProperty"; import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties"; import _slicedToArray from "@babel/runtime/helpers/slicedToArray"; var _excluded = ["zIndex", "offsetTop", "scrollTop", "disabled", "container", "onScroll", "style", "className", "children"]; 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; } import { useCallback, useEffect, useRef, useState } from 'react'; import { View } from '@tarojs/components'; import * as utils from '../wxs/utils'; import { getRect } from '../common/utils'; import { isDef } from '../common/validator'; import { usePageScroll } from './../mixins/page-scroll'; import * as computed from './wxs'; import { jsx as _jsx } from "react/jsx-runtime"; export function Sticky(props) { var indexRef = useRef("".concat(+new Date()).concat(Math.ceil(Math.random() * 10000))); var _useState = useState({ height: 0, fixed: false, transform: 0 }), _useState2 = _slicedToArray(_useState, 2), state = _useState2[0], setState = _useState2[1]; var zIndex = props.zIndex, _props$offsetTop = props.offsetTop, offsetTop = _props$offsetTop === void 0 ? 0 : _props$offsetTop, scrollTop = props.scrollTop, disabled = props.disabled, container = props.container, onScroll = props.onScroll, style = props.style, className = props.className, children = props.children, others = _objectWithoutProperties(props, _excluded); var ref = useRef({}); var getContainerRect = useCallback(function () { var nodesRef = container === null || container === void 0 ? void 0 : container(); return new Promise(function (resolve) { return nodesRef === null || nodesRef === void 0 ? void 0 : nodesRef.boundingClientRect().exec(function () { var rect = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; return resolve(rect[0]); }); }); }, [container]); var setDataAfterDiff = useCallback(function (data) { var diff = Object.keys(data).reduce(function (prev, key) { if (data[key] !== state[key]) { prev[key] = data[key]; } return prev; }, {}); if (Object.keys(diff).length > 0) { setState(function (pre) { return _objectSpread(_objectSpread({}, pre), diff); }); } onScroll === null || onScroll === void 0 ? void 0 : onScroll({ detail: { scrollTop: ref.current.scrollTop, isFixed: data.fixed || state.fixed } }); }, [onScroll, state]); var onMyScroll = useCallback(function (scrollTop) { if (disabled) { setDataAfterDiff({ fixed: false, transform: 0 }); return; } ref.current.scrollTop = scrollTop || ref.current.scrollTop; if (typeof container === 'function') { Promise.all([getRect(null, "#sticky-com-index".concat(indexRef.current)), getContainerRect()]).then(function (_ref) { var _ref2 = _slicedToArray(_ref, 2), root = _ref2[0], container = _ref2[1]; if (root && container) { if (offsetTop + root.height > container.height + container.top) { setDataAfterDiff({ fixed: false, transform: container.height - root.height }); } else if (offsetTop >= root.top) { setDataAfterDiff({ fixed: true, height: root.height, transform: 0 }); } else { setDataAfterDiff({ fixed: false, transform: 0 }); } } }).catch(function (e) { console.log(e); }); return; } else { getRect(null, "#sticky-com-index".concat(indexRef.current)).then(function (root) { if (!isDef(root)) { return; } if (offsetTop >= root.top) { setDataAfterDiff({ fixed: true, height: root.height }); // this.transform = 0 } else { setDataAfterDiff({ fixed: false }); } }); } }, [container, disabled, getContainerRect, offsetTop, setDataAfterDiff]); useEffect(function () { onMyScroll(scrollTop); }, // eslint-disable-next-line react-hooks/exhaustive-deps [scrollTop, container, disabled, offsetTop]); usePageScroll(function (e) { onMyScroll(e.scrollTop); }); return /*#__PURE__*/_jsx(View, _objectSpread(_objectSpread({ id: "sticky-com-index".concat(indexRef.current), className: ' van-sticky ' + (className || ''), style: utils.style([computed.containerStyle({ fixed: state.fixed, height: state.height, zIndex: zIndex }), style]) }, others), {}, { children: /*#__PURE__*/_jsx(View, { className: utils.bem('sticky-wrap', { fixed: state.fixed }) + " ".concat(className || ''), style: utils.style([computed.wrapStyle({ fixed: state.fixed, offsetTop: offsetTop, transform: state.transform, zIndex: zIndex }), style]), children: children }) })); } export default Sticky;