@nutui/nutui-react-taro
Version:
京东风格的轻量级移动端 React 组件库,支持一套代码生成 H5 和小程序
270 lines (269 loc) • 12.3 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: all[name]
});
}
_export(exports, {
Elevator: function() {
return Elevator;
},
elevatorContext: function() {
return elevatorContext;
}
});
var _interop_require_default = require("@swc/helpers/_/_interop_require_default");
var _interop_require_wildcard = require("@swc/helpers/_/_interop_require_wildcard");
var _define_property = require("@swc/helpers/_/_define_property");
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 _to_consumable_array = require("@swc/helpers/_/_to_consumable_array");
var _react = /*#__PURE__*/ _interop_require_wildcard._(require("react"));
var _taro = /*#__PURE__*/ _interop_require_wildcard._(require("@tarojs/taro"));
var _components = require("@tarojs/components");
var _classnames = /*#__PURE__*/ _interop_require_default._(require("classnames"));
var _typings = require("../../utils/typings");
var _platformtaro = require("../../utils/platform-taro");
var _useuuid = /*#__PURE__*/ _interop_require_default._(require("../../hooks/use-uuid"));
var elevatorContext = /*#__PURE__*/ (0, _react.createContext)({});
var defaultProps = (0, _object_spread_props._)((0, _object_spread._)({}, _typings.ComponentDefaults), {
height: '200px',
floorKey: 'title',
list: [],
sticky: false,
spaceHeight: 23,
titleHeight: 35,
showKeys: true,
className: 'weapp-elevator'
});
var Elevator = function Elevator(props) {
var _ref = (0, _object_spread._)({}, defaultProps, props), height = _ref.height, floorKey = _ref.floorKey, list = _ref.list, sticky = _ref.sticky, spaceHeight = _ref.spaceHeight, titleHeight = _ref.titleHeight, showKeys = _ref.showKeys, className = _ref.className, style = _ref.style, onItemClick = _ref.onItemClick, onIndexClick = _ref.onIndexClick, children = _ref.children, rest = (0, _object_without_properties._)(_ref, [
"height",
"floorKey",
"list",
"sticky",
"spaceHeight",
"titleHeight",
"showKeys",
"className",
"style",
"onItemClick",
"onIndexClick",
"children"
]);
var uuid = (0, _useuuid.default)();
var classPrefix = 'nut-elevator';
var listview = (0, _react.useRef)(null);
var initData = {
anchorIndex: 0,
listHeight: [],
listGroup: [],
scrollY: 0
};
var touchState = (0, _react.useRef)({
y1: 0,
y2: 0
});
var _useState = (0, _sliced_to_array._)((0, _react.useState)({}), 2), currentData = _useState[0], setCurrentData = _useState[1];
var _useState1 = (0, _sliced_to_array._)((0, _react.useState)(''), 2), currentKey = _useState1[0], setCurrentKey = _useState1[1];
var _useState2 = (0, _sliced_to_array._)((0, _react.useState)(0), 2), codeIndex = _useState2[0], setCodeIndex = _useState2[1];
var _useState3 = (0, _sliced_to_array._)((0, _react.useState)(false), 2), scrollStart = _useState3[0], setScrollStart = _useState3[1];
var state = (0, _react.useRef)(initData);
var scrolling = (0, _react.useRef)(false);
var _useState4 = (0, _sliced_to_array._)((0, _react.useState)(0), 2), scrollTop = _useState4[0], setScrollTop = _useState4[1];
var _useState5 = (0, _sliced_to_array._)((0, _react.useState)(0), 2), scrollY = _useState5[0], setScrollY = _useState5[1];
var resetScrollState = function resetScrollState() {
setScrollStart(false);
};
var getData = function getData(el) {
if (!el.dataset.index) {
return '0';
}
return el.dataset.index;
};
var calculateHeight = function calculateHeight() {
var height = 0;
state.current.listHeight.push(height);
for(var i = 0; i < state.current.listGroup.length; i++){
var query = (0, _taro.createSelectorQuery)();
query.selectAll(".".concat(classPrefix, "-").concat(uuid, " .nut-elevator-item-").concat(i)).boundingClientRect();
// eslint-disable-next-line no-loop-func
query.exec(function(res) {
if (res[0][0]) height += res[0][0].height;
state.current.listHeight.push(height);
});
}
};
var scrollTo = function scrollTo(index) {
if (!index && index !== 0) {
return;
}
if (!state.current.listHeight.length) {
calculateHeight();
}
var cacheIndex = index;
if (index < 0) {
cacheIndex = 0;
}
if (index > state.current.listHeight.length - 2) {
cacheIndex = Math.max(0, state.current.listHeight.length - 2);
}
setCodeIndex(cacheIndex);
var scrollTop = state.current.listHeight[cacheIndex];
setScrollTop(scrollTop);
if (sticky && scrollY !== scrollTop) {
setScrollY(Math.floor(scrollTop) > 0 ? 1 : 0);
}
};
var touchMove = function touchMove(e) {
var firstTouch = e.touches[0];
touchState.current.y2 = firstTouch.pageY;
var delta = (touchState.current.y2 - touchState.current.y1) / spaceHeight || 0;
var cacheIndex = state.current.anchorIndex + Math.round(delta);
setCodeIndex(cacheIndex);
scrollTo(cacheIndex);
};
var touchEnd = function touchEnd() {
resetScrollState();
};
var touchStart = function touchStart(e) {
var index = Number(getData(e.target));
var firstTouch = e.touches[0];
scrolling.current = true;
touchState.current.y1 = firstTouch.pageY;
state.current.anchorIndex = +index;
setScrollStart(true);
setCodeIndex(index);
scrollTo(index);
};
var handleClickItem = function handleClickItem(key, item) {
onItemClick && onItemClick(key, item);
setCurrentData(item);
setCurrentKey(key);
};
var handleClickIndex = function handleClickIndex(key) {
onIndexClick && onIndexClick(key);
};
var setListGroup = function setListGroup() {
if (listview.current) {
(0, _taro.createSelectorQuery)().selectAll(".".concat(classPrefix, "-").concat(uuid, " .nut-elevator-list-item")).node(function(el) {
state.current.listGroup = (0, _to_consumable_array._)(Object.keys(el));
calculateHeight();
}).exec();
}
};
var listViewScroll = function listViewScroll(e) {
var listHeight = state.current.listHeight;
if (!listHeight.length) {
calculateHeight();
}
var target = e.target;
var scrollTop = target.scrollTop;
state.current.scrollY = Math.floor(scrollTop);
_taro.default.getEnv() === 'WEB' && setScrollTop(scrollTop);
if (sticky && scrollTop !== scrollY) {
setScrollY(Math.floor(scrollTop) > 0 ? 1 : 0);
}
if (scrolling.current) return;
for(var i = 0; i < listHeight.length - 1; i++){
var height1 = listHeight[i];
var height2 = listHeight[i + 1];
if (state.current.scrollY >= height1 && state.current.scrollY < height2) {
return setCodeIndex(i);
}
}
};
var getWrapStyle = (0, _react.useMemo)(function() {
var calcHeight = Number.isNaN(+height) ? height : "".concat(height, "px");
return {
height: (0, _platformtaro.harmony)() ? Number(height) : calcHeight
};
}, [
height
]);
(0, _react.useEffect)(function() {
if (listview.current) {
(0, _taro.nextTick)(function() {
setListGroup();
});
}
}, [
listview
]);
var _obj;
return /*#__PURE__*/ _react.default.createElement("div", (0, _object_spread._)({
className: "".concat(classPrefix, " ").concat(className, " ").concat(classPrefix, "-").concat(uuid),
style: style
}, rest), /*#__PURE__*/ _react.default.createElement(_components.View, {
className: "".concat(classPrefix, "-list"),
style: getWrapStyle
}, /*#__PURE__*/ _react.default.createElement(_components.ScrollView, {
scrollTop: scrollTop,
scrollY: true,
scrollWithAnimation: true,
scrollAnchoring: true,
className: "".concat(classPrefix, "-list-inner"),
type: "list",
ref: listview,
onScroll: listViewScroll,
onTouchStart: function onTouchStart(e) {
scrolling.current = false;
}
}, list.map(function(item, idx) {
return /*#__PURE__*/ _react.default.createElement(_components.View, {
className: "".concat(classPrefix, "-list-item nut-elevator-item-").concat(idx),
key: idx
}, /*#__PURE__*/ _react.default.createElement(_components.View, {
className: "".concat(classPrefix, "-list-item-code")
}, item[floorKey]), /*#__PURE__*/ _react.default.createElement(_react.default.Fragment, null, item.list.map(function(subitem) {
var _obj;
return /*#__PURE__*/ _react.default.createElement(_components.View, {
className: (0, _classnames.default)((_obj = {}, (0, _define_property._)(_obj, "".concat(classPrefix, "-list-item-name"), true), (0, _define_property._)(_obj, "".concat(classPrefix, "-list-item-name-highcolor"), currentData.id === subitem.id && currentKey === item[floorKey]), _obj)),
key: subitem.id,
onClick: function onClick() {
return handleClickItem(item[floorKey], subitem);
}
}, children ? /*#__PURE__*/ _react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/ _react.default.createElement(elevatorContext.Provider, {
value: subitem
}, children)) : subitem.name);
})));
}))), showKeys ? /*#__PURE__*/ _react.default.createElement(_react.default.Fragment, null, list.length && scrollStart ? /*#__PURE__*/ _react.default.createElement(_components.View, {
className: (0, _classnames.default)((_obj = {}, (0, _define_property._)(_obj, "".concat(classPrefix, "-code-current"), true), (0, _define_property._)(_obj, "".concat(classPrefix, "-code-current-current"), true), _obj))
}, list[codeIndex][floorKey]) : null, /*#__PURE__*/ _react.default.createElement(_components.View, {
className: "".concat(classPrefix, "-bars")
}, /*#__PURE__*/ _react.default.createElement(_components.View, {
className: "".concat(classPrefix, "-bars-inner")
}, list.map(function(item, index) {
var _obj;
return /*#__PURE__*/ _react.default.createElement(_components.View, {
className: (0, _classnames.default)((_obj = {}, (0, _define_property._)(_obj, "".concat(classPrefix, "-bars-inner-item"), true), (0, _define_property._)(_obj, "".concat(classPrefix, "-bars-inner-item-active"), item[floorKey] === list[codeIndex][floorKey]), _obj)),
"data-index": index,
key: index,
onClick: function onClick() {
return handleClickIndex(item[floorKey]);
},
onTouchStart: function onTouchStart(event) {
return touchStart(event);
},
onTouchMove: function onTouchMove(event) {
return touchMove(event);
},
onTouchEnd: touchEnd,
style: {
touchAction: 'pan-y'
}
}, item[floorKey]);
})))) : null, sticky && scrollY > 0 ? /*#__PURE__*/ _react.default.createElement(_components.View, {
className: "".concat(classPrefix, "-list-fixed")
}, /*#__PURE__*/ _react.default.createElement(_components.Text, {
className: "".concat(classPrefix, "-list-fixed-title")
}, list[codeIndex][floorKey])) : null);
};
Elevator.displayName = 'NutElevator';
Elevator.Context = elevatorContext;