UNPKG

@antmjs/vantui

Version:

一套适用于Taro3及React的vantui组件库

159 lines 6.42 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", "rectWrapper"]; 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 { get } from '../default-props'; 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 _useState3 = useState(get().Sticky), _useState4 = _slicedToArray(_useState3, 1), d = _useState4[0]; var _d$props = _objectSpread(_objectSpread({}, d), props), zIndex = _d$props.zIndex, _d$props$offsetTop = _d$props.offsetTop, offsetTop = _d$props$offsetTop === void 0 ? 0 : _d$props$offsetTop, scrollTop = _d$props.scrollTop, disabled = _d$props.disabled, container = _d$props.container, onScroll = _d$props.onScroll, style = _d$props.style, className = _d$props.className, children = _d$props.children, _d$props$rectWrapper = _d$props.rectWrapper, rectWrapper = _d$props$rectWrapper === void 0 ? '' : _d$props$rectWrapper, others = _objectWithoutProperties(_d$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), rectWrapper), 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), rectWrapper).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, rectWrapper, 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;