UNPKG

gui-one-nutui-react-taro

Version:

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

194 lines (193 loc) 7.79 kB
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 };