gui-one-nutui-react-taro
Version:
京东风格的轻量级移动端 React 组件库,支持一套代码生成 H5 和小程序
194 lines (193 loc) • 7.79 kB
JavaScript
import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
import _defineProperty from "@babel/runtime/helpers/defineProperty";
import _regeneratorRuntime from "@babel/runtime/regenerator";
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 React__default, { forwardRef, useState, useEffect, useImperativeHandle } from 'react';
import classNames from 'classnames';
import { CSSTransition } from 'react-transition-group';
import { u as useConfig } from './configprovider.taro-6c7b3056.js';
import { I as Icon } from './icon.taro-1d0d4fb7.js';
import { O as Overlay } from './overlay.taro-be45fed5.js';
import { C as ComponentDefaults } from './typings-1c5f2628.js';
var defaultProps = _objectSpread(_objectSpread({}, ComponentDefaults), {}, {
className: '',
style: {},
columns: 1,
direction: 'down',
optionsIcon: 'Check',
activeTitleClass: '',
inactiveTitleClass: '',
iconClassPrefix: 'nut-icon',
fontClassName: 'nutui-iconfont',
onChange: function onChange(value) {
return undefined;
}
});
var MenuItem = forwardRef(function (props, ref) {
useConfig();
var mergedProps = _objectSpread(_objectSpread({}, defaultProps), props);
var _defaultProps$props = _objectSpread(_objectSpread({}, defaultProps), props),
style = _defaultProps$props.style,
options = _defaultProps$props.options,
value = _defaultProps$props.value,
columns = _defaultProps$props.columns,
title = _defaultProps$props.title,
optionsIcon = _defaultProps$props.optionsIcon,
direction = _defaultProps$props.direction,
onChange = _defaultProps$props.onChange,
activeTitleClass = _defaultProps$props.activeTitleClass,
inactiveTitleClass = _defaultProps$props.inactiveTitleClass,
children = _defaultProps$props.children,
iconClassPrefix = _defaultProps$props.iconClassPrefix,
iconFontClassName = _defaultProps$props.iconFontClassName;
var activeColor = mergedProps.activeColor,
showPopup = mergedProps.showPopup,
parent = mergedProps.parent,
orderKey = mergedProps.orderKey;
var _useState = useState(showPopup),
_useState2 = _slicedToArray(_useState, 2),
_showPopup = _useState2[0],
setShowPopup = _useState2[1];
var _useState3 = useState(value),
_useState4 = _slicedToArray(_useState3, 2),
_value = _useState4[0],
setValue = _useState4[1];
useEffect(function () {
setShowPopup(showPopup);
}, [showPopup]);
useEffect(function () {
getParentOffset();
}, [_showPopup]);
useImperativeHandle(ref, function () {
return {
toggle: parent.toggleItemShow
};
});
var getIconCName = function getIconCName(optionVal, value) {
var _classNames;
return classNames((_classNames = {}, _defineProperty(_classNames, activeTitleClass, optionVal === value), _defineProperty(_classNames, inactiveTitleClass, optionVal !== value), _classNames));
};
var setTitle = function setTitle(text) {
if (!title) {
parent.updateTitle(text, orderKey);
}
};
var handleClick = function handleClick(item) {
parent.toggleItemShow(orderKey);
setTitle(item.text);
setValue(item.value);
onChange && onChange(item);
};
var _useState5 = useState({
top: 0,
height: 0
}),
_useState6 = _slicedToArray(_useState5, 2),
position = _useState6[0],
setPosition = _useState6[1];
var getParentOffset = function getParentOffset() {
setTimeout( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
var p, rect;
return _regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
p = parent.parent().current;
_context.next = 3;
return p.getBoundingClientRect();
case 3:
rect = _context.sent;
setPosition({
height: rect.height,
top: rect.top
});
case 5:
case "end":
return _context.stop();
}
}
}, _callee);
})));
};
var isShow = function isShow() {
if (_showPopup) return {};
return {
display: 'none'
};
};
var getPosition = function getPosition() {
return direction === 'down' ? {
top: "".concat(position.top + position.height, "px")
} : {
bottom: "".concat(window.innerHeight - position.top, "px"),
top: 'auto'
};
};
var placeholderStyle = function placeholderStyle() {
if (direction === 'down') {
return _objectSpread(_objectSpread({
height: "".concat(position.top + position.height, "px")
}, isShow()), style);
}
return _objectSpread(_objectSpread({
height: "".concat(window.innerHeight - position.top, "px"),
top: 'auto'
}, isShow()), style);
};
return React__default.createElement(React__default.Fragment, null, React__default.createElement("div", {
className: "placeholder-element ".concat(classNames({
up: direction === 'up'
})),
style: placeholderStyle(),
onClick: function onClick() {
return parent.toggleItemShow(orderKey);
}
}), React__default.createElement(Overlay, {
overlayClass: "nut-menu__overlay",
style: getPosition(),
lockScroll: parent.lockScroll,
visible: _showPopup,
closeOnClickOverlay: parent.closeOnClickOverlay,
onClick: function onClick() {
parent.closeOnClickOverlay && parent.toggleItemShow(orderKey);
}
}), React__default.createElement("div", {
className: direction === 'down' ? 'nut-menu-item__wrap' : 'nut-menu-item__wrap-up',
style: _objectSpread({}, isShow())
}, React__default.createElement(CSSTransition, {
"in": _showPopup,
timeout: 100,
classNames: direction === 'down' ? 'menu-item' : 'menu-item-up'
}, React__default.createElement("div", {
className: "nut-menu-item__content"
}, options === null || options === void 0 ? void 0 : options.map(function (item, index) {
return React__default.createElement("div", {
className: "nut-menu-item__option ".concat(classNames({
active: item.value === _value
})),
key: item.text,
style: {
flexBasis: "".concat(100 / columns, "%")
},
onClick: function onClick() {
handleClick(item);
}
}, item.value === _value ? React__default.createElement(Icon, {
classPrefix: iconClassPrefix,
fontClassName: iconFontClassName,
className: getIconCName(item.value, value),
name: optionsIcon,
color: activeColor
}) : null, React__default.createElement("div", {
className: getIconCName(item.value, value),
style: {
color: "".concat(item.value === _value ? activeColor : '')
}
}, item.text));
}), children))));
});
MenuItem.defaultProps = defaultProps;
MenuItem.displayName = 'NutMenuItem';
export { MenuItem as M };