@nutui/nutui-react
Version:
京东风格的轻量级移动端 React 组件库,支持一套代码生成 H5 和小程序
197 lines (196 loc) • 8.65 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "MenuItem", {
enumerable: true,
get: function() {
return MenuItem;
}
});
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 _sliced_to_array = require("@swc/helpers/_/_sliced_to_array");
var _react = /*#__PURE__*/ _interop_require_wildcard._(require("react"));
var _classnames = /*#__PURE__*/ _interop_require_default._(require("classnames"));
var _reacttransitiongroup = require("react-transition-group");
var _iconsreact = require("@nutui/icons-react");
var _overlay = require("../overlay/overlay");
var _useclickaway = /*#__PURE__*/ _interop_require_default._(require("../../hooks/use-click-away"));
var _typings = require("../../utils/typings");
var _usepropsvalue = require("../../hooks/use-props-value");
var _getscrollparent = require("../../utils/get-scroll-parent");
var defaultProps = (0, _object_spread_props._)((0, _object_spread._)({}, _typings.ComponentDefaults), {
titleIcon: null,
columns: 1,
direction: 'down',
icon: null,
closeOnClickAway: true,
activeTitleClass: '',
inactiveTitleClass: '',
onChange: function onChange(value) {
return undefined;
}
});
var MenuItem = /*#__PURE__*/ (0, _react.forwardRef)(function(props, ref) {
var _$_object_spread = (0, _object_spread._)({}, defaultProps, props), className = _$_object_spread.className, style = _$_object_spread.style, options = _$_object_spread.options, value = _$_object_spread.value, defaultValue = _$_object_spread.defaultValue, columns = _$_object_spread.columns, title = _$_object_spread.title, icon = _$_object_spread.icon, direction = _$_object_spread.direction, onChange = _$_object_spread.onChange, activeTitleClass = _$_object_spread.activeTitleClass, inactiveTitleClass = _$_object_spread.inactiveTitleClass, closeOnClickAway = _$_object_spread.closeOnClickAway, children = _$_object_spread.children, activeColor = _$_object_spread.activeColor, show = _$_object_spread.show, parent = _$_object_spread.parent, index = _$_object_spread.index;
var _useState = (0, _sliced_to_array._)((0, _react.useState)(show), 2), showPopup = _useState[0], setShowPopup = _useState[1];
var _usePropsValue = (0, _sliced_to_array._)((0, _usepropsvalue.usePropsValue)({
defaultValue: defaultValue,
value: value,
finalValue: undefined,
onChange: function onChange1(v) {
var _options_filter = (0, _sliced_to_array._)(options.filter(function(o) {
return o.value === v;
}), 1), option = _options_filter[0];
onChange === null || onChange === void 0 ? void 0 : onChange(option);
}
}), 2), innerValue = _usePropsValue[0], setValue = _usePropsValue[1];
(0, _react.useEffect)(function() {
setShowPopup(show);
}, [
show
]);
var getParentOffset = (0, _react.useCallback)(function() {
setTimeout(function() {
var p = parent.menuRef.current;
if (p) {
var rect = p.getBoundingClientRect();
setPosition({
height: rect.height,
top: rect.top
});
}
});
}, [
parent.menuRef
]);
(0, _react.useEffect)(function() {
getParentOffset();
}, [
showPopup,
getParentOffset
]);
(0, _react.useImperativeHandle)(ref, function() {
return {
toggle: function toggle(s) {
var from = 'REF';
s ? parent.toggleMenuItem(index, from) : parent.hideMenuItem(index, from);
}
};
});
var getIconCName = function getIconCName(optionVal, value) {
var _obj;
return (0, _classnames.default)((_obj = {}, (0, _define_property._)(_obj, activeTitleClass, optionVal === value), (0, _define_property._)(_obj, inactiveTitleClass, optionVal !== value), _obj));
};
var setTitle = function setTitle(text) {
if (!title) {
parent.updateTitle(text, index);
}
};
var handleClick = function handleClick(item) {
parent.toggleMenuItem(index);
setTitle(item.text);
setValue(item.value);
};
var isShow = function isShow() {
if (showPopup) return {};
return {
display: 'none'
};
};
var _useState1 = (0, _sliced_to_array._)((0, _react.useState)({
top: 0,
height: 0
}), 2), position = _useState1[0], setPosition = _useState1[1];
var scrollParent = (0, _react.useMemo)(function() {
return (0, _getscrollparent.getScrollParent)(parent.menuRef, window);
}, [
parent.menuRef
]);
(0, _react.useEffect)(function() {
if (!parent.lockScroll) {
scrollParent === null || scrollParent === void 0 ? void 0 : scrollParent.addEventListener('scroll', getParentOffset, false);
return function() {
scrollParent === null || scrollParent === void 0 ? void 0 : scrollParent.removeEventListener('scroll', getParentOffset, false);
};
}
}, [
parent.lockScroll,
scrollParent,
getParentOffset
]);
var getPosition = function getPosition() {
return direction === 'down' ? {
top: "".concat(position.top + position.height, "px"),
bottom: '0',
height: 'initial'
} : {
bottom: "".concat(window.innerHeight - position.top, "px"),
top: 'auto',
height: 'initial'
};
};
var micRef = (0, _react.useRef)(null);
var cssRef = (0, _react.useRef)(null);
var targetSet = [
micRef.current
];
(0, _useclickaway.default)(function() {
parent.hideMenuItem(index);
}, // @ts-ignore
targetSet, 'click', false, showPopup, closeOnClickAway);
return /*#__PURE__*/ _react.default.createElement("div", {
className: "nut-menu-container",
ref: micRef
}, parent.overlay ? /*#__PURE__*/ _react.default.createElement(_overlay.Overlay, {
className: "nut-menu-container-overlay",
style: getPosition(),
lockScroll: parent.lockScroll,
visible: showPopup,
closeOnOverlayClick: parent.closeOnOverlayClick,
onClick: function onClick() {
parent.closeOnOverlayClick && parent.hideMenuItem(index);
}
}) : null, /*#__PURE__*/ _react.default.createElement("div", {
className: (0, _classnames.default)({
'nut-menu-container-wrap': direction === 'down',
'nut-menu-container-wrap-up': direction !== 'down'
}, className),
style: (0, _object_spread._)({}, style, isShow())
}, /*#__PURE__*/ _react.default.createElement(_reacttransitiongroup.CSSTransition, {
nodeRef: cssRef,
in: showPopup,
timeout: 100,
classNames: direction === 'down' ? 'nut-menu-container-down' : 'nut-menu-container-up'
}, /*#__PURE__*/ _react.default.createElement("div", {
className: "nut-menu-container-content"
}, options === null || options === void 0 ? void 0 : options.map(function(item) {
return /*#__PURE__*/ _react.default.createElement("div", {
className: "nut-menu-container-item ".concat((0, _classnames.default)({
active: item.value === innerValue
})),
key: item.text,
style: {
flexBasis: "".concat(100 / columns, "%")
},
onClick: function onClick() {
handleClick(item);
}
}, item.value === innerValue ? /*#__PURE__*/ _react.default.createElement("i", {
className: "nut-menu-container-item-icon"
}, icon || /*#__PURE__*/ _react.default.createElement(_iconsreact.Check, {
color: activeColor,
className: getIconCName(item.value, value)
})) : null, /*#__PURE__*/ _react.default.createElement("div", {
className: "nut-menu-container-item-title ".concat(getIconCName(item.value, value)),
style: {
color: "".concat(item.value === innerValue ? activeColor : '')
}
}, item.text));
}), children))));
});
MenuItem.displayName = 'NutMenuItem';