UNPKG

@alifd/next

Version:

A configurable component library for web built on React.

275 lines (252 loc) 9.91 kB
import _extends from 'babel-runtime/helpers/extends'; import _objectWithoutProperties from 'babel-runtime/helpers/objectWithoutProperties'; import _classCallCheck from 'babel-runtime/helpers/classCallCheck'; import _possibleConstructorReturn from 'babel-runtime/helpers/possibleConstructorReturn'; import _inherits from 'babel-runtime/helpers/inherits'; var _class, _temp; import React, { Component } from 'react'; import PropTypes from 'prop-types'; import classNames from 'classnames'; import ConfigProvider from '../config-provider'; import Menu from '../menu'; /** * Nav * @description 继承自 `Menu` 的能力请查看 `Menu` 文档 */ var Nav = (_temp = _class = function (_Component) { _inherits(Nav, _Component); function Nav(props) { _classCallCheck(this, Nav); var _this = _possibleConstructorReturn(this, _Component.call(this, props)); _this.getMenuRef = _this.getMenuRef.bind(_this); return _this; } Nav.prototype.getChildContext = function getChildContext() { var _props = this.props, prefix = _props.prefix, direction = _props.direction, mode = _props.mode, iconOnly = _props.iconOnly, iconOnlyWidth = _props.iconOnlyWidth, iconTextOnly = _props.iconTextOnly, hasTooltip = _props.hasTooltip, hasArrow = _props.hasArrow; var isCollapse = this.context.isCollapse; return { prefix: prefix, mode: direction === 'hoz' ? 'popup' : mode, iconOnly: 'iconOnly' in this.props ? iconOnly : isCollapse, iconOnlyWidth: 'iconOnlyWidth' in this.props ? iconOnlyWidth : undefined, iconTextOnly: iconTextOnly, hasTooltip: hasTooltip, hasArrow: hasArrow }; }; Nav.prototype.getMenuRef = function getMenuRef(ref) { this.menu = ref; }; Nav.prototype.render = function render() { var _classNames, _classNames2; // eslint-disable-next-line var _props2 = this.props, prefix = _props2.prefix, className = _props2.className, style = _props2.style, children = _props2.children, type = _props2.type, direction = _props2.direction, activeDirection = _props2.activeDirection, mode = _props2.mode, triggerType = _props2.triggerType, inlineIndent = _props2.inlineIndent, openMode = _props2.openMode, popupAlign = _props2.popupAlign, popupClassName = _props2.popupClassName, iconOnly = _props2.iconOnly, iconOnlyWidth = _props2.iconOnlyWidth, iconTextOnly = _props2.iconTextOnly, hasArrow = _props2.hasArrow, hasTooltip = _props2.hasTooltip, embeddable = _props2.embeddable, _popupProps = _props2.popupProps, rtl = _props2.rtl, others = _objectWithoutProperties(_props2, ['prefix', 'className', 'style', 'children', 'type', 'direction', 'activeDirection', 'mode', 'triggerType', 'inlineIndent', 'openMode', 'popupAlign', 'popupClassName', 'iconOnly', 'iconOnlyWidth', 'iconTextOnly', 'hasArrow', 'hasTooltip', 'embeddable', 'popupProps', 'rtl']); var isCollapse = this.context.isCollapse; var newIconOnly = 'iconOnly' in this.props ? iconOnly : isCollapse; var realActiveDirection = activeDirection; if (realActiveDirection && (direction === 'hoz' && (realActiveDirection === 'left' || realActiveDirection === 'right') || direction === 'ver' && (realActiveDirection === 'top' || realActiveDirection === 'bottom'))) { realActiveDirection = null; } if (!newIconOnly && realActiveDirection === undefined) { realActiveDirection = direction === 'hoz' ? 'bottom' : type === 'line' ? 'right' : 'left'; } var cls = classNames((_classNames = {}, _classNames[prefix + 'nav'] = true, _classNames['' + prefix + type] = type, _classNames[prefix + 'active'] = realActiveDirection, _classNames['' + prefix + realActiveDirection] = realActiveDirection, _classNames[prefix + 'icon-only'] = newIconOnly, _classNames[prefix + 'icon-only-text'] = newIconOnly && iconTextOnly, _classNames[prefix + 'custom-icon-only-width'] = newIconOnly && 'iconOnlyWidth' in this.props, _classNames[prefix + 'no-arrow'] = !hasArrow, _classNames[prefix + 'nav-embeddable'] = embeddable, _classNames[className] = !!className, _classNames)); var newStyle = newIconOnly ? _extends({}, style, { width: iconOnlyWidth || 58 }) : style; var props = { prefix: prefix, direction: direction, openMode: openMode, triggerType: triggerType, mode: direction === 'hoz' ? 'popup' : mode, popupAlign: direction === 'hoz' ? 'follow' : popupAlign, inlineIndent: newIconOnly ? 0 : inlineIndent, hasSelectedIcon: false, popupAutoWidth: true, selectMode: 'single', itemClassName: prefix + 'nav-item', popupClassName: classNames((_classNames2 = {}, _classNames2[cls.replace(prefix + 'icon-only', '').replace(prefix + 'nav-embeddable', '')] = mode === 'popup', _classNames2[prefix + 'icon-only'] = newIconOnly && mode === 'inline', _classNames2[popupClassName] = !!popupClassName, _classNames2)), popupProps: function popupProps() { return _extends({}, _popupProps); } }; return React.createElement( Menu, _extends({ className: cls, style: newStyle }, props, others, { ref: this.getMenuRef }), children ); }; return Nav; }(Component), _class.propTypes = { prefix: PropTypes.string, pure: PropTypes.bool, rtl: PropTypes.bool, className: PropTypes.string, style: PropTypes.object, /** * 导航项和子导航 */ children: PropTypes.node, /** * 导航类型 * @enumdesc 普通, 主要, 次要, 线形 */ type: PropTypes.oneOf(['normal', 'primary', 'secondary', 'line']), /** * 导航布局 * @enumdesc 水平, 垂直 */ direction: PropTypes.oneOf(['hoz', 'ver']), /** * 横向导航条 items 和 footer 的对齐方向,在 direction 设置为 'hoz' 并且 header 存在时生效 */ hozAlign: PropTypes.oneOf(['left', 'right']), /** * 设置组件选中状态的 active 边方向 * @enumdesc 无, 上, 下, 左, 右 * @default 当 direction 为 'hoz' 时,默认值为 'bottom',当 direction 为 'ver' 时,默认值为 'left' */ activeDirection: PropTypes.oneOf([null, 'top', 'bottom', 'left', 'right']), /** * 子导航打开的模式(水平导航只支持弹出) * @eumdesc 行内, 弹出 */ mode: PropTypes.oneOf(['inline', 'popup']), /** * 子导航打开的触发方式 */ triggerType: PropTypes.oneOf(['click', 'hover']), /** * 内联子导航缩进距离 */ inlineIndent: PropTypes.number, /** * 首次渲染展开所有的子导航,只在 mode 设置为 'inline' 以及 openMode 设置为 'multiple' 下生效 */ defaultOpenAll: PropTypes.bool, /** * 内联子导航的展开模式,同时可以展开一个同级子导航还是多个同级子导航,该属性仅在 mode 为 inline 时生效 * @eumdesc 一个, 多个 */ openMode: PropTypes.oneOf(['single', 'multiple']), /** * 当前选中导航项的 key 值 */ selectedKeys: PropTypes.oneOfType([PropTypes.string, PropTypes.array]), /** * 初始选中导航项的 key 值 */ defaultSelectedKeys: PropTypes.oneOfType([PropTypes.string, PropTypes.array]), /** * 选中或取消选中导航项触发的回调函数 * @param {Array} selectedKeys 选中的所有导航项的 key * @param {Object} item 选中或取消选中的导航项 * @param {Object} extra 额外参数 * @param {Boolean} extra.select 是否是选中 * @param {Array} extra.key 导航项的 key * @param {Object} extra.label 导航项的文本 * @param {Array} extra.keyPath 导航项 key 的路径 */ onSelect: PropTypes.func, /** * 弹出子导航的对齐方式(水平导航只支持 follow ) * @eumdesc Item 顶端对齐, Nav 顶端对齐 */ popupAlign: PropTypes.oneOf(['follow', 'outside']), /** * 弹出子导航的自定义类名 */ popupClassName: PropTypes.string, /** * 是否只显示图标 */ iconOnly: PropTypes.bool, /** * iconOnly 模式下的宽度(仅在 iconOnly=true 时生效) 如果传入了iconOnlyWidth,那么会隐藏文本,例如 Nav.Item 的 label */ iconOnlyWidth: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), /** * iconOnly模式下是否展示文字(仅在 iconOnly=true 时生效) */ iconTextOnly: PropTypes.bool, /** * 是否显示右侧的箭头(仅在 iconOnly=true 时生效) */ hasArrow: PropTypes.bool, /** * 是否有 ToolTips (仅在 iconOnly=true 时生效) */ hasTooltip: PropTypes.bool, /** * 自定义导航头部 */ header: PropTypes.node, /** * 自定义导航尾部 */ footer: PropTypes.node, /** * 是否开启嵌入式模式,一般用于Layout的布局中,开启后没有默认背景、外层border、box-shadow,可以配合`<Nav style={{lineHeight: '100px'}}>` 自定义高度 * @version 1.18 */ embeddable: PropTypes.bool, popupProps: PropTypes.object }, _class.defaultProps = { prefix: 'next-', pure: false, type: 'normal', direction: 'ver', hozAlign: 'left', mode: 'inline', triggerType: 'click', inlineIndent: 20, defaultOpenAll: false, openMode: 'multiple', defaultSelectedKeys: [], popupAlign: 'follow', hasTooltip: false, embeddable: false, hasArrow: true, popupProps: {} }, _class.childContextTypes = { prefix: PropTypes.string, mode: PropTypes.string, iconOnly: PropTypes.bool, iconOnlyWidth: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), iconTextOnly: PropTypes.bool, hasTooltip: PropTypes.bool, hasArrow: PropTypes.bool }, _class.contextTypes = { isCollapse: PropTypes.bool }, _temp); Nav.displayName = 'Nav'; export default ConfigProvider.config(Nav);