gui-one-nutui-react-taro
Version:
京东风格的轻量级移动端 React 组件库,支持一套代码生成 H5 和小程序
245 lines (243 loc) • 10.6 kB
JavaScript
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
import _defineProperty from "@babel/runtime/helpers/defineProperty";
import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
import _createClass from "@babel/runtime/helpers/createClass";
import _inherits from "@babel/runtime/helpers/inherits";
import _possibleConstructorReturn from "@babel/runtime/helpers/possibleConstructorReturn";
import _getPrototypeOf from "@babel/runtime/helpers/getPrototypeOf";
import _typeof from "@babel/runtime/helpers/typeof";
var _excluded = ["children", "list", "theme", "location", "visible", "offset", "className", "style", "onClick", "onChoose", "iconClassPrefix", "iconFontClassName"];
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; }
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
import React__default, { useRef, useState, useEffect } from 'react';
import { I as Icon } from './icon.taro-1d0d4fb7.js';
import { O as Overlay } from './overlay.taro-be45fed5.js';
import { g as getRectByTaro } from './useClientRect-bf69d7b3.js';
import { C as ComponentDefaults } from './typings-1c5f2628.js';
/**
* 过滤ref
*/
function fillRef(ref, node) {
if (typeof ref === 'function') {
ref(node);
} else if (_typeof(ref) === 'object' && ref && 'current' in ref) {
ref.current = node;
}
}
/**
* 将ref合并到一个ref函数中以支持ref传递
*/
function composeRef() {
for (var _len = arguments.length, refs = new Array(_len), _key = 0; _key < _len; _key++) {
refs[_key] = arguments[_key];
}
return function (node) {
refs.forEach(function (ref) {
fillRef(ref, node);
});
};
}
var Trigger = /*#__PURE__*/function (_React__default$Compo) {
_inherits(Trigger, _React__default$Compo);
var _super = _createSuper(Trigger);
function Trigger() {
_classCallCheck(this, Trigger);
return _super.apply(this, arguments);
}
_createClass(Trigger, [{
key: "fireEvents",
value: function fireEvents(type, e) {
var childCallback = this.props.children.props[type];
if (childCallback) {
childCallback(e);
}
var callback = this.props[type];
if (callback) {
callback(e);
}
}
}, {
key: "render",
value: function render() {
var _this$props = this.props,
children = _this$props.children,
_this$props$className = _this$props.className,
className = _this$props$className === void 0 ? '' : _this$props$className;
var child = React__default.Children.only(children);
var newChildProps = {
key: 'trigger'
};
if (child && child.props && child.props.className) {
newChildProps.className = className;
}
var cloneProps = _objectSpread({}, newChildProps);
cloneProps.ref = composeRef(this.props.forwardedRef, child.ref);
var trigger = React__default.cloneElement(child, cloneProps);
return trigger;
}
}]);
return Trigger;
}(React__default.Component);
var defaultProps = _objectSpread(_objectSpread({}, ComponentDefaults), {}, {
list: [],
theme: 'light',
location: 'bottom',
visible: false,
offset: 20,
className: '',
onClick: function onClick(e) {},
onChoose: function onChoose(item, index) {}
});
var Popover = function Popover(props) {
var _defaultProps$props = _objectSpread(_objectSpread({}, defaultProps), props),
children = _defaultProps$props.children,
list = _defaultProps$props.list,
theme = _defaultProps$props.theme,
location = _defaultProps$props.location,
visible = _defaultProps$props.visible,
offset = _defaultProps$props.offset,
className = _defaultProps$props.className,
style = _defaultProps$props.style,
onClick = _defaultProps$props.onClick,
onChoose = _defaultProps$props.onChoose,
iconClassPrefix = _defaultProps$props.iconClassPrefix,
iconFontClassName = _defaultProps$props.iconFontClassName,
reset = _objectWithoutProperties(_defaultProps$props, _excluded);
var goodItem = useRef(null);
setTimeout( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
var res;
return _regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
if (!goodItem.current) {
_context.next = 6;
break;
}
_context.next = 3;
return getRectByTaro(goodItem.current);
case 3:
res = _context.sent;
setElWidth(res === null || res === void 0 ? void 0 : res.width);
setElHeight(res === null || res === void 0 ? void 0 : res.height);
case 6:
case "end":
return _context.stop();
}
}
}, _callee);
})));
var _useState = useState(''),
_useState2 = _slicedToArray(_useState, 2),
classes = _useState2[0],
setClasses = _useState2[1];
var _useState3 = useState(0),
_useState4 = _slicedToArray(_useState3, 2),
elWidth = _useState4[0],
setElWidth = _useState4[1];
var _useState5 = useState(0),
_useState6 = _slicedToArray(_useState5, 2),
elHeight = _useState6[0],
setElHeight = _useState6[1];
var _useState7 = useState(''),
_useState8 = _slicedToArray(_useState7, 2),
popoverContent = _useState8[0],
setPopoverContent = _useState8[1];
var _useState9 = useState(''),
_useState10 = _slicedToArray(_useState9, 2),
popoverArrow = _useState10[0],
setPopoverArrow = _useState10[1];
useEffect(function () {
setClasses(classesSelf());
setPopoverContent(popoverContentSelf());
setPopoverArrow(popoverArrowSelf());
}, [list, theme]);
var getStyle = function getStyle() {
var offNumer = Number(offset) ? Number(offset) : 0;
var style = {};
if (location.includes('top')) {
style.bottom = "".concat(elHeight + offNumer, "px");
} else if (location.includes('right')) {
style.left = "".concat(elWidth + offNumer, "px");
} else if (location.includes('left')) {
style.right = "".concat(elWidth + offNumer, "px");
} else {
style.top = "".concat(elHeight + offNumer, "px");
}
return style;
};
var classesSelf = function classesSelf() {
var prefixCls = 'nut-popover';
return "".concat(prefixCls, " ").concat(theme ? "".concat(prefixCls, "--").concat(theme) : '');
};
var popoverContentSelf = function popoverContentSelf() {
var prefixCls = 'popover-content';
return "".concat(prefixCls, "-show ").concat(prefixCls, " ").concat(location ? "".concat(prefixCls, "--").concat(location) : '');
};
var filter = function filter() {
var ms = ['top', 'bottom', 'left', 'right'];
return ms.filter(function (m) {
return location.includes(m);
})[0];
};
var popoverArrowSelf = function popoverArrowSelf() {
var prefixCls = 'popover-arrow';
return "".concat(prefixCls, " ").concat(prefixCls, "-").concat(filter(), " ").concat(location ? "".concat(prefixCls, "--").concat(location) : '');
};
var handleClick = function handleClick(e) {
if (props.onClick) {
props.onClick(e);
}
};
var handleChoose = function handleChoose(item, index) {
if (!item.disabled) {
onChoose(item, index);
}
};
return React__default.createElement(React__default.Fragment, null, React__default.createElement("div", _objectSpread({
className: "".concat(classes, " ").concat(className),
style: _objectSpread({}, style)
}, reset), React__default.createElement(Trigger, {
forwardedRef: goodItem
}, React__default.createElement("div", {
onClick: function onClick(e) {
return handleClick(e);
}
}, Array.isArray(children) ? children[0] : children, visible ? React__default.createElement("div", {
className: "".concat(popoverContent),
style: getStyle()
}, React__default.createElement("div", {
className: "".concat(popoverArrow)
}), Array.isArray(children) ? children[1] : '', list.map(function (item, i) {
return React__default.createElement("div", {
key: item.name,
className: "popover-menu-item ".concat(item.disabled ? 'disabled' : ''),
onClick: function onClick() {
handleChoose(item, i);
}
}, item.icon ? React__default.createElement(Icon, {
classPrefix: iconClassPrefix,
fontClassName: iconFontClassName,
className: "popover-menu-item-img",
name: item.icon
}) : '', React__default.createElement("div", {
className: "popover-menu-item-name"
}, item.name));
})) : null))), visible ? React__default.createElement(Overlay, {
visible: visible,
onClick: function onClick(e) {
return handleClick(e);
},
style: {
background: 'transparent'
}
}) : '');
};
Popover.defaultProps = defaultProps;
Popover.displayName = 'NutPopover';
export { Popover as P };