UNPKG

@nutui/nutui-react-taro

Version:

京东风格的轻量级移动端 React 组件库,支持一套代码生成 H5 和小程序

224 lines (223 loc) 9.24 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "InfiniteLoading", { enumerable: true, get: function() { return InfiniteLoading; } }); var _interop_require_default = require("@swc/helpers/_/_interop_require_default"); var _interop_require_wildcard = require("@swc/helpers/_/_interop_require_wildcard"); var _async_to_generator = require("@swc/helpers/_/_async_to_generator"); var _object_spread = require("@swc/helpers/_/_object_spread"); var _object_spread_props = require("@swc/helpers/_/_object_spread_props"); var _object_without_properties = require("@swc/helpers/_/_object_without_properties"); var _sliced_to_array = require("@swc/helpers/_/_sliced_to_array"); var _ts_generator = require("@swc/helpers/_/_ts_generator"); var _react = /*#__PURE__*/ _interop_require_wildcard._(require("react")); var _classnames = /*#__PURE__*/ _interop_require_default._(require("classnames")); var _components = require("@tarojs/components"); var _taro = require("@tarojs/taro"); var _index = require("../configprovider/index"); var _typings = require("../../utils/typings"); var _pxtransform = require("../../utils/taro/px-transform"); var defaultProps = (0, _object_spread_props._)((0, _object_spread._)({}, _typings.ComponentDefaults), { type: 'default', hasMore: true, threshold: 40, target: '', pullRefresh: false }); var classPrefix = "nut-infiniteloading"; var InfiniteLoading = function InfiniteLoading(props) { var getBottomTipsText = function getBottomTipsText() { if (isInfiniting) { return loadingText || locale.infiniteloading.loadText; } if (!hasMore) { return loadMoreText || locale.infiniteloading.loadMoreText; } return null; }; var locale = (0, _index.useConfig)().locale; var _ref = (0, _object_spread._)({}, defaultProps, props), children = _ref.children, type = _ref.type, hasMore = _ref.hasMore, threshold = _ref.threshold, target = _ref.target, pullRefresh = _ref.pullRefresh, pullingText = _ref.pullingText, loadingText = _ref.loadingText, loadMoreText = _ref.loadMoreText, className = _ref.className, onRefresh = _ref.onRefresh, onLoadMore = _ref.onLoadMore, onScroll = _ref.onScroll, rest = (0, _object_without_properties._)(_ref, [ "children", "type", "hasMore", "threshold", "target", "pullRefresh", "pullingText", "loadingText", "loadMoreText", "className", "onRefresh", "onLoadMore", "onScroll" ]); var _useState = (0, _sliced_to_array._)((0, _react.useState)(false), 2), isInfiniting = _useState[0], setIsInfiniting = _useState[1]; var _useState1 = (0, _sliced_to_array._)((0, _react.useState)(0), 2), topDisScoll = _useState1[0], setTopDisScoll = _useState1[1]; var refreshTop = (0, _react.useRef)(null); var scrollHeight = (0, _react.useRef)(0); var scrollTop = (0, _react.useRef)(0); var isTouching = (0, _react.useRef)(false); var y = (0, _react.useRef)(0); var refreshMaxH = (0, _react.useRef)(0); var distance = (0, _react.useRef)(0); var classes = (0, _classnames.default)(classPrefix, className, "".concat(classPrefix, "-").concat(type)); (0, _react.useEffect)(function() { refreshMaxH.current = threshold; var timer = setTimeout(function() { getScrollHeight(); }, 200); return function() { return clearTimeout(timer); }; }, [ hasMore, isInfiniting, threshold ]); /** 获取需要滚动的距离 */ var getScrollHeight = function getScrollHeight() { var parentElement = getParentElement('scroller'); parentElement.boundingClientRect(function(rect) { var _rect_height; scrollHeight.current = (_rect_height = rect === null || rect === void 0 ? void 0 : rect.height) !== null && _rect_height !== void 0 ? _rect_height : 0; }).exec(); }; var getStyle = function getStyle() { return { height: topDisScoll < 0 ? (0, _pxtransform.pxTransform)(0) : (0, _pxtransform.pxTransform)(topDisScoll), transition: "height 0.2s cubic-bezier(0.25,0.1,0.25,1)" }; }; var getParentElement = function getParentElement(el) { return (0, _taro.createSelectorQuery)().select(target ? "#".concat(target, " #").concat(el) : "#".concat(el)); }; var infiniteDone = function infiniteDone() { setIsInfiniting(false); }; var refreshDone = function refreshDone() { distance.current = 0; setTopDisScoll(0); isTouching.current = false; }; var scrollAction = function scrollAction(e) { var _e_target; scrollTop.current = (_e_target = e.target) === null || _e_target === void 0 ? void 0 : _e_target.scrollTop; if (e.target.scrollTop <= 0) { // 滚动到最顶部 e.target.scrollTop = 0; } onScroll && onScroll(e.target.scrollTop); }; var lower = function lower() { return (0, _async_to_generator._)(function() { return (0, _ts_generator._)(this, function(_state) { switch(_state.label){ case 0: if (!hasMore || isInfiniting) { return [ 2, false ]; } setIsInfiniting(true); return [ 4, onLoadMore === null || onLoadMore === void 0 ? void 0 : onLoadMore() ]; case 1: _state.sent(); infiniteDone(); return [ 2 ]; } }); })(); }; var touchStart = function touchStart(event) { if (scrollTop.current === 0 && !isTouching.current && pullRefresh) { y.current = event.touches[0].pageY; isTouching.current = true; } }; var touchMove = function touchMove(event) { distance.current = event.touches[0].pageY - y.current; if (distance.current > 0 && isTouching.current) { event.preventDefault(); setTopDisScoll(distance.current); if (distance.current >= refreshMaxH.current) { distance.current = refreshMaxH.current; setTopDisScoll(refreshMaxH.current); } } else { distance.current = 0; setTopDisScoll(0); isTouching.current = false; } }; var touchEnd = function touchEnd() { return (0, _async_to_generator._)(function() { return (0, _ts_generator._)(this, function(_state) { switch(_state.label){ case 0: if (!(distance.current < refreshMaxH.current)) return [ 3, 1 ]; distance.current = 0; setTopDisScoll(0); isTouching.current = false; return [ 3, 3 ]; case 1: return [ 4, onRefresh === null || onRefresh === void 0 ? void 0 : onRefresh() ]; case 2: _state.sent(); refreshDone(); _state.label = 3; case 3: return [ 2 ]; } }); })(); }; return /*#__PURE__*/ _react.default.createElement(_components.ScrollView, (0, _object_spread_props._)((0, _object_spread._)({}, rest), { className: classes, scrollY: true, id: "scroller", type: "list", style: { height: '100%' }, onScroll: scrollAction, onScrollToLower: lower, onTouchStart: touchStart, onTouchMove: touchMove, onTouchEnd: touchEnd }), /*#__PURE__*/ _react.default.createElement(_components.View, { className: "nut-infinite-top", ref: refreshTop, style: getStyle() }, /*#__PURE__*/ _react.default.createElement(_components.View, { className: "nut-infinite-top-tips" }, pullingText || locale.infiniteloading.pullRefreshText)), /*#__PURE__*/ _react.default.createElement(_components.View, { className: "nut-infinite-container" }, children), /*#__PURE__*/ _react.default.createElement(_components.View, { className: "nut-infinite-bottom" }, /*#__PURE__*/ _react.default.createElement(_components.View, { className: "nut-infinite-bottom-tips" }, getBottomTipsText()))); }; InfiniteLoading.displayName = 'NutInfiniteLoading';