gui-one-nutui-react-taro
Version:
京东风格的轻量级移动端 React 组件库,支持一套代码生成 H5 和小程序
177 lines (176 loc) • 8.18 kB
JavaScript
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
import _createClass from "@babel/runtime/helpers/createClass";
import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
import _defineProperty from "@babel/runtime/helpers/defineProperty";
var _excluded = ["value", "color", "tabStyle", "background", "direction", "type", "titleScroll", "ellipsis", "animatedTime", "titleGutter", "size", "titleNode", "children", "onClick", "onChange", "className", "autoHeight", "iconClassPrefix", "iconFontClassName"];
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, { useState, useRef, useEffect } from 'react';
import classNames from 'classnames';
import { c as cn } from './bem-893ad28d.js';
import { I as Icon } from './icon.taro-1d0d4fb7.js';
import { C as ComponentDefaults } from './typings-1c5f2628.js';
var Title = /*#__PURE__*/_createClass(
// eslint-disable-next-line no-useless-constructor
function Title() {
_classCallCheck(this, Title);
_defineProperty(this, "title", '');
_defineProperty(this, "paneKey", '');
_defineProperty(this, "disabled", false);
_defineProperty(this, "index", 0);
});
var defaultProps = _objectSpread(_objectSpread({}, ComponentDefaults), {}, {
tabStyle: {},
value: 0,
color: '',
background: '',
direction: 'horizontal',
type: 'line',
titleScroll: false,
ellipsis: true,
animatedTime: 300,
titleGutter: 0,
size: 'normal',
autoHeight: false
});
var pxCheck = function pxCheck(value) {
return Number.isNaN(Number(value)) ? String(value) : "".concat(value, "px");
};
var Tabs = function Tabs(props) {
var _classNames;
var _defaultProps$props = _objectSpread(_objectSpread({}, defaultProps), props),
value = _defaultProps$props.value,
color = _defaultProps$props.color,
tabStyle = _defaultProps$props.tabStyle,
background = _defaultProps$props.background,
direction = _defaultProps$props.direction,
type = _defaultProps$props.type,
titleScroll = _defaultProps$props.titleScroll,
ellipsis = _defaultProps$props.ellipsis,
animatedTime = _defaultProps$props.animatedTime,
titleGutter = _defaultProps$props.titleGutter,
size = _defaultProps$props.size,
titleNode = _defaultProps$props.titleNode,
children = _defaultProps$props.children,
onClick = _defaultProps$props.onClick,
onChange = _defaultProps$props.onChange,
className = _defaultProps$props.className,
autoHeight = _defaultProps$props.autoHeight,
iconClassPrefix = _defaultProps$props.iconClassPrefix,
iconFontClassName = _defaultProps$props.iconFontClassName,
rest = _objectWithoutProperties(_defaultProps$props, _excluded);
var _useState = useState({
index: 0
}),
_useState2 = _slicedToArray(_useState, 2),
currentItem = _useState2[0],
setCurrentItem = _useState2[1];
var titles = useRef([]);
useEffect(function () {
var currentIndex = 0;
titles.current = [];
// eslint-disable-next-line consistent-return
React__default.Children.forEach(children, function (child, idx) {
if (!React__default.isValidElement(child)) {
return null;
}
var title = new Title();
var childProps = child === null || child === void 0 ? void 0 : child.props;
if (childProps !== null && childProps !== void 0 && childProps.title || childProps !== null && childProps !== void 0 && childProps.paneKey) {
title.title = childProps === null || childProps === void 0 ? void 0 : childProps.title;
title.paneKey = (childProps === null || childProps === void 0 ? void 0 : childProps.paneKey) || idx;
title.disabled = childProps === null || childProps === void 0 ? void 0 : childProps.disabled;
title.index = idx;
if (title.paneKey === value) {
currentIndex = idx;
}
}
titles.current.push(title);
});
setCurrentItem(titles.current[currentIndex]);
}, [children]);
var b = cn('tabs');
var classes = classNames(direction, b(''), className);
var classesTitle = classNames((_classNames = {}, _defineProperty(_classNames, type, type), _defineProperty(_classNames, "scrollable", titleScroll), _defineProperty(_classNames, size, size), _classNames), "".concat(b(''), "__titles"));
var titleStyle = {
marginLeft: pxCheck(titleGutter),
marginRight: pxCheck(titleGutter)
};
var tabsActiveStyle = {
color: type === 'smile' ? color : '',
background: type === 'line' ? color : ''
};
var index = titles.current.findIndex(function (t) {
return t.paneKey === value;
});
var contentStyle = {
transform: direction === 'horizontal' ? "translate3d(-".concat(index * 100, "%, 0, 0)") : "translate3d( 0,-".concat(index * 100, "%, 0)"),
transitionDuration: "".concat(animatedTime, "ms")
};
var tabChange = function tabChange(item, index) {
onClick && onClick(item);
if (item.disabled) {
return;
}
setCurrentItem(item);
onChange && onChange(item);
};
return React__default.createElement("div", _objectSpread({
className: classes
}, rest), React__default.createElement("div", {
className: classesTitle,
style: _objectSpread(_objectSpread({}, tabStyle), {}, {
background: background
})
}, !!titleNode && typeof titleNode === 'function' ? titleNode() : titles.current.map(function (item, index) {
return React__default.createElement("div", {
style: titleStyle,
onClick: function onClick(e) {
return tabChange(item);
},
className: classNames({
active: String(item.paneKey) === String(value),
disabled: item.disabled
}, "".concat(b(''), "__titles-item")),
key: item.paneKey
}, type === 'line' && React__default.createElement("div", {
className: "".concat(b(''), "__titles-item__line"),
style: tabsActiveStyle
}), type === 'smile' && React__default.createElement("div", {
className: "".concat(b(''), "__titles-item__smile"),
style: tabsActiveStyle
}, React__default.createElement(Icon, {
classPrefix: iconClassPrefix,
fontClassName: iconFontClassName,
color: color,
name: "joy-smile"
})), React__default.createElement("div", {
className: classNames({
ellipsis: ellipsis && !titleScroll && direction === 'horizontal'
}, "".concat(b(''), "__titles-item__text"))
}, item.title));
})), React__default.createElement("div", {
className: "".concat(b(''), "__content__wrap")
}, React__default.createElement("div", {
className: "".concat(b(''), "__content"),
style: contentStyle
}, React__default.Children.map(children, function (child, idx) {
var _child$props;
if (!React__default.isValidElement(child)) {
return null;
}
var childProps = _objectSpread(_objectSpread({}, child.props), {}, {
activeKey: value
});
if (String(value) !== String(((_child$props = child.props) === null || _child$props === void 0 ? void 0 : _child$props.paneKey) || idx) && autoHeight) {
childProps = _objectSpread(_objectSpread({}, childProps), {}, {
autoHeightClassName: 'inactive'
});
}
return React__default.cloneElement(child, childProps);
}))));
};
Tabs.defaultProps = defaultProps;
Tabs.displayName = 'NutTabs';
export { Tabs as T };