UNPKG

@nutui/nutui-react

Version:

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

206 lines (205 loc) 8.73 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "Ellipsis", { enumerable: true, get: function() { return Ellipsis; } }); var _interop_require_default = require("@swc/helpers/_/_interop_require_default"); var _interop_require_wildcard = require("@swc/helpers/_/_interop_require_wildcard"); var _define_property = require("@swc/helpers/_/_define_property"); var _object_spread = require("@swc/helpers/_/_object_spread"); var _object_spread_props = require("@swc/helpers/_/_object_spread_props"); var _object_without_properties = require("@swc/helpers/_/_object_without_properties"); var _sliced_to_array = require("@swc/helpers/_/_sliced_to_array"); var _react = /*#__PURE__*/ _interop_require_wildcard._(require("react")); var _classnames = /*#__PURE__*/ _interop_require_default._(require("classnames")); var _typings = require("../../utils/typings"); var _useisomprphiclayouteffect = require("../../hooks/use-isomprphic-layout-effect"); var _configprovider = require("../configprovider"); var defaultProps = (0, _object_spread_props._)((0, _object_spread._)({}, _typings.ComponentDefaults), { content: '', direction: 'end', rows: 1, expandText: '', collapseText: '', symbol: '...', lineHeight: '20' }); var classPrefix = "nut-ellipsis"; var Ellipsis = function Ellipsis(props) { var _ellipsis_current, _ellipsis_current1; var _ref = (0, _object_spread._)({}, defaultProps, props), children = _ref.children, content = _ref.content, className = _ref.className, direction = _ref.direction, rows = _ref.rows, expandText = _ref.expandText, collapseText = _ref.collapseText, symbol = _ref.symbol, lineHeight = _ref.lineHeight, onClick = _ref.onClick, onChange = _ref.onChange, rest = (0, _object_without_properties._)(_ref, [ "children", "content", "className", "direction", "rows", "expandText", "collapseText", "symbol", "lineHeight", "onClick", "onChange" ]); var rtl = (0, _configprovider.useRtl)(); var container = null; var maxHeight = 0; var _useState = (0, _sliced_to_array._)((0, _react.useState)(false), 2), exceeded = _useState[0], setExceeded = _useState[1]; var _useState1 = (0, _sliced_to_array._)((0, _react.useState)(false), 2), expanded = _useState1[0], setExpanded = _useState1[1]; var ellipsis = (0, _react.useRef)(); var root = (0, _react.useRef)(null); var rtlClasses = (0, _classnames.default)((0, _define_property._)({}, "".concat(classPrefix, "-rtl"), rtl)); var classes = (0, _classnames.default)(classPrefix, rtlClasses, className); (0, _useisomprphiclayouteffect.useIsomorphicLayoutEffect)(function() { if (content) { createContainer(); } }, [ content ]); // 创建虚拟 container,内容为 contant 的内容 var createContainer = function createContainer() { if (!root.current) return; var originStyle = window.getComputedStyle(root.current); container = document.createElement('div'); var styleNames = Array.prototype.slice.apply(originStyle); styleNames.forEach(function(name) { container.style.setProperty(name, originStyle.getPropertyValue(name)); }); container.style.position = 'fixed'; container.style.left = '999999px'; container.style.top = '999999px'; container.style.zIndex = '-1000'; container.style.height = 'auto'; container.style.minHeight = 'auto'; container.style.maxHeight = 'auto'; container.style.textOverflow = 'clip'; container.style.whiteSpace = 'normal'; container.style.webkitLineClamp = 'unset'; container.style.display = 'block'; var lineH = pxToNumber(originStyle.lineHeight === 'normal' ? lineHeight : originStyle.lineHeight); maxHeight = Math.floor(lineH * (Number(rows) + 0.5) + pxToNumber(originStyle.paddingTop) + pxToNumber(originStyle.paddingBottom)); container.innerText = content; document.body.appendChild(container); calcEllipse(); document.body.removeChild(container); }; // 计算省略号的位置 var calcEllipse = function calcEllipse() { if (container.offsetHeight <= maxHeight) { setExceeded(false); } else { setExceeded(true); var end = content.length; var middle = Math.floor((0 + end) / 2); var ellipsised = direction === 'middle' ? tailorMiddle([ 0, middle ], [ middle, end ]) : tailor(0, end); ellipsis.current = ellipsised; } }; // 计算 start/end 省略 var tailor = function tailor1(left, right) { var actionText = expanded ? collapseText : expandText; var end = content.length; if (right - left <= 1) { if (direction === 'end') { return { leading: content.slice(0, left) + symbol }; } return { tailing: symbol + content.slice(right, end) }; } var middle = Math.round((left + right) / 2); if (direction === 'end') { container.innerText = content.slice(0, middle) + symbol + actionText; } else { container.innerText = actionText + symbol + content.slice(middle, end); } if (container.offsetHeight <= maxHeight) { if (direction === 'end') { return tailor(middle, right); } return tailor(left, middle); } if (direction === 'end') { return tailor(left, middle); } return tailor(middle, right); }; // 计算 middle 省略 var tailorMiddle = function tailorMiddle1(leftPart, rightPart) { var actionText = expanded ? collapseText : expandText; var end = content.length; if (leftPart[1] - leftPart[0] <= 1 && rightPart[1] - rightPart[0] <= 1) { return { leading: content.slice(0, leftPart[0]) + symbol, tailing: symbol + content.slice(rightPart[1], end) }; } var leftPartMiddle = Math.floor((leftPart[0] + leftPart[1]) / 2); var rightPartMiddle = Math.ceil((rightPart[0] + rightPart[1]) / 2); container.innerText = content.slice(0, leftPartMiddle) + symbol + actionText + symbol + content.slice(rightPartMiddle, end); if (container.offsetHeight <= maxHeight) { return tailorMiddle([ leftPartMiddle, leftPart[1] ], [ rightPart[0], rightPartMiddle ]); } return tailorMiddle([ leftPart[0], leftPartMiddle ], [ rightPartMiddle, rightPart[1] ]); }; var pxToNumber = function pxToNumber(value) { if (!value) return 0; var match = value.match(/^\d*(\.\d*)?/); return match ? Number(match[0]) : 0; }; var clickHandle = function clickHandle(type) { if (type === 1) { setExpanded(true); onChange && onChange('expand'); } else { setExpanded(false); onChange && onChange('collapse'); } }; var handleClick = function handleClick() { onClick && onClick(); }; return /*#__PURE__*/ _react.default.createElement("div", (0, _object_spread._)({ className: classes, onClick: handleClick, ref: root }, rest), !exceeded ? content : null, exceeded && !expanded ? /*#__PURE__*/ _react.default.createElement("span", null, (_ellipsis_current = ellipsis.current) === null || _ellipsis_current === void 0 ? void 0 : _ellipsis_current.leading, expandText ? /*#__PURE__*/ _react.default.createElement("span", { className: "nut-ellipsis-text", onClick: function onClick(e) { e.stopPropagation(); clickHandle(1); } }, expandText) : null, (_ellipsis_current1 = ellipsis.current) === null || _ellipsis_current1 === void 0 ? void 0 : _ellipsis_current1.tailing) : null, exceeded && expanded ? /*#__PURE__*/ _react.default.createElement("span", null, content, expandText ? /*#__PURE__*/ _react.default.createElement("span", { className: "nut-ellipsis-text", onClick: function onClick(e) { e.stopPropagation(); clickHandle(2); } }, collapseText) : null) : null); }; Ellipsis.displayName = 'NutEllipsis';