gui-one-nutui-react-taro
Version:
京东风格的轻量级移动端 React 组件库,支持一套代码生成 H5 和小程序
366 lines (365 loc) • 12.9 kB
JavaScript
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, { useRef, useState, useEffect } from 'react';
import classNames from 'classnames';
import { I as Icon } from './icon.taro-1d0d4fb7.js';
import { c as cn } from './bem-893ad28d.js';
import { g as getRectByTaro } from './useClientRect-bf69d7b3.js';
import { C as ComponentDefaults } from './typings-1c5f2628.js';
var defaultProps = _objectSpread(_objectSpread({}, ComponentDefaults), {}, {
// 滚动方向 across 横向 vertical 纵向
direction: 'across',
list: [],
standTime: 1000,
complexAm: false,
height: 40,
text: '',
closeMode: false,
wrapable: false,
leftIcon: '',
color: '',
background: '',
delay: 1,
scrollable: null,
speed: 50
});
var NoticeBar = function NoticeBar(props) {
var _defaultProps$props = _objectSpread(_objectSpread({}, defaultProps), props),
children = _defaultProps$props.children,
className = _defaultProps$props.className,
style = _defaultProps$props.style,
direction = _defaultProps$props.direction,
list = _defaultProps$props.list,
standTime = _defaultProps$props.standTime,
complexAm = _defaultProps$props.complexAm,
height = _defaultProps$props.height,
text = _defaultProps$props.text,
closeMode = _defaultProps$props.closeMode,
wrapable = _defaultProps$props.wrapable,
leftIcon = _defaultProps$props.leftIcon,
color = _defaultProps$props.color,
background = _defaultProps$props.background,
delay = _defaultProps$props.delay,
scrollable = _defaultProps$props.scrollable,
speed = _defaultProps$props.speed,
rightIcon = _defaultProps$props.rightIcon,
close = _defaultProps$props.close,
click = _defaultProps$props.click,
onClose = _defaultProps$props.onClose,
onClick = _defaultProps$props.onClick,
iconClassPrefix = _defaultProps$props.iconClassPrefix,
iconFontClassName = _defaultProps$props.iconFontClassName;
var wrap = useRef(null);
var content = useRef(null);
var _useState = useState(true),
_useState2 = _slicedToArray(_useState, 2),
showNoticeBar = _useState2[0],
SetShowNoticeBar = _useState2[1];
var scrollList = useRef([]);
var _useState3 = useState(0),
_useState4 = _slicedToArray(_useState3, 2),
wrapWidth = _useState4[0],
SetWrapWidth = _useState4[1];
var _useState5 = useState(true),
_useState6 = _slicedToArray(_useState5, 2),
firstRound = _useState6[0],
SetFirstRound = _useState6[1];
var _useState7 = useState(0),
_useState8 = _slicedToArray(_useState7, 2),
duration = _useState8[0],
SetDuration = _useState8[1];
var _useState9 = useState(0),
_useState10 = _slicedToArray(_useState9, 2),
offsetWidth = _useState10[0],
SetOffsetW = _useState10[1];
var _useState11 = useState(''),
_useState12 = _slicedToArray(_useState11, 2),
animationClass = _useState12[0],
SetAnimationClass = _useState12[1];
var _useState13 = useState(false),
_useState14 = _slicedToArray(_useState13, 2),
animate = _useState14[0],
SetAnimate = _useState14[1];
var _useState15 = useState(0),
_useState16 = _slicedToArray(_useState15, 2),
distance = _useState16[0],
SetDistance = _useState16[1];
var _useState17 = useState(0),
_useState18 = _slicedToArray(_useState17, 2),
timer = _useState18[0],
SetTimer = _useState18[1];
var _useState19 = useState(null),
_useState20 = _slicedToArray(_useState19, 2),
isCanScroll = _useState20[0],
SetIsCanScroll = _useState20[1];
useEffect(function () {
if (direction === 'vertical') {
if (children) {
var arr = [];
React__default.Children.map(children, function (child) {
arr.push(child.props.children);
});
scrollList.current = [].concat(arr);
} else {
scrollList.current = [].concat(list);
}
setTimeout(function () {
complexAm ? startRoll() : startRollEasy();
}, Number(standTime));
} else {
initScrollWrap();
}
return function () {
// 销毁事件
clearInterval(timer);
startRoll();
startRollEasy();
};
}, []);
var cloneChild = function cloneChild(listItem, listIndex) {
return React__default.Children.map(children, function (child, index) {
if (child && index === listIndex) {
return React__default.cloneElement(child, {
key: listIndex,
children: listItem
});
}
return null;
});
};
useEffect(function () {
initScrollWrap();
}, [text]);
useEffect(function () {
if (list && list.length) {
scrollList.current = [].concat(list);
}
}, [list]);
var initScrollWrap = function initScrollWrap(value) {
if (showNoticeBar === false) {
return;
}
setTimeout( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
var warpRes, contentRes, wrapW, offsetW, canScroll;
return _regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
if (!(!wrap.current || !content.current)) {
_context.next = 2;
break;
}
return _context.abrupt("return");
case 2:
_context.next = 4;
return getRectByTaro(wrap.current);
case 4:
warpRes = _context.sent;
_context.next = 7;
return getRectByTaro(content.current);
case 7:
contentRes = _context.sent;
wrapW = warpRes.width;
offsetW = contentRes.width;
canScroll = scrollable == null ? offsetW > wrapW : scrollable;
SetIsCanScroll(canScroll);
if (canScroll) {
SetWrapWidth(wrapW);
SetOffsetW(offsetW);
SetDuration(offsetW / speed);
SetAnimationClass('play');
} else {
SetAnimationClass('');
}
case 13:
case "end":
return _context.stop();
}
}
}, _callee);
})), 0);
};
var handleClick = function handleClick(event) {
click && click(event);
onClick && onClick(event);
};
var onClickIcon = function onClickIcon(event) {
event.stopPropagation();
SetShowNoticeBar(!closeMode);
close && close(event);
onClose && onClose(event);
};
var onAnimationEnd = function onAnimationEnd() {
SetFirstRound(false);
setTimeout(function () {
SetDuration((offsetWidth + wrapWidth) / speed);
SetAnimationClass('play-infinite');
}, 0);
};
/**
* 滚动方式一
*/
var startRollEasy = function startRollEasy() {
showhorseLamp();
var timerCurr = setInterval(showhorseLamp, ~~(height / speed / 4) * 1000 + Number(standTime));
SetTimer(timerCurr);
};
var showhorseLamp = function showhorseLamp() {
SetAnimate(true);
setTimeout(function () {
scrollList.current.push(scrollList.current[0]);
scrollList.current.shift();
SetAnimate(false);
}, ~~(height / speed / 4) * 1000);
};
var startRoll = function startRoll() {
var timerCurr = setInterval(function () {
var chunk = 100;
for (var i = 0; i < chunk; i++) {
scroll(i, !(i < chunk - 1));
}
}, Number(standTime) + 100 * speed);
SetTimer(timerCurr);
};
var scroll = function scroll(n, last) {
SetAnimate(true);
setTimeout(function () {
var _long = distance;
_long -= height / 100;
SetDistance(_long);
if (last) {
scrollList.current.push(scrollList.current[0]);
scrollList.current.shift();
SetDistance(0);
SetAnimate(false);
}
}, n * speed);
};
/**
* 点击滚动单元
*/
var handleClickIcon = function handleClickIcon(event) {
event.stopPropagation();
SetShowNoticeBar(!closeMode);
close && close(event);
onClose && onClose(event);
};
var iconShow = function iconShow() {
if (leftIcon === 'close') {
return false;
}
return true;
};
var iconBg = function iconBg() {
var iconBg = '';
if (leftIcon) {
iconBg = leftIcon;
}
return iconBg;
};
var isEllipsis = function isEllipsis() {
if (isCanScroll == null) {
return wrapable;
}
return !isCanScroll && !wrapable;
};
var contentStyle = {
animationDelay: "".concat(firstRound ? delay : 0, "s"),
animationDuration: "".concat(duration, "s"),
transform: "translateX(".concat(firstRound ? 0 : "".concat(wrapWidth, "px"), ")")
};
var barStyle = {
color: color,
background: background,
height: direction === 'vertical' ? "".concat(height, "px") : ''
};
var duringTime = ~~(height / speed / 4);
var horseLampStyle = {
transform: complexAm ? "translateY(".concat(distance, "px)") : '',
transition: animate ? "all ".concat(duringTime === 0 ? ~~(height / speed) : duringTime, "s") : '',
marginTop: animate ? "-".concat(height, "px") : ''
};
var b = cn('noticebar');
var noticebarClass = classNames({
'nut-noticebar-page': true,
withicon: closeMode,
close: closeMode,
wrapable: wrapable
});
return React__default.createElement("div", {
className: "".concat(b(), " ").concat(className || ''),
style: style
}, showNoticeBar && direction === 'across' ? React__default.createElement("div", {
className: noticebarClass,
style: barStyle,
onClick: handleClick
}, iconShow() ? React__default.createElement("div", {
className: "left-icon",
style: {
backgroundImage: "url(".concat(iconBg() || '', ")")
}
}, !iconBg() ? React__default.createElement(Icon, {
classPrefix: iconClassPrefix,
fontClassName: iconFontClassName,
name: "notice",
size: "16",
color: color
}) : null) : null, React__default.createElement("div", {
ref: wrap,
className: "wrap"
}, React__default.createElement("div", {
ref: content,
className: "content ".concat(animationClass, " ").concat(isEllipsis() ? 'nut-ellipsis' : ''),
style: contentStyle,
onAnimationEnd: onAnimationEnd
}, children, text)), closeMode || rightIcon ? React__default.createElement("div", {
className: "right-icon",
onClick: onClickIcon
}, React__default.createElement(Icon, {
classPrefix: iconClassPrefix,
fontClassName: iconFontClassName,
name: rightIcon || 'close',
color: color
})) : null) : null, showNoticeBar && scrollList.current.length > 0 && direction === 'vertical' ? React__default.createElement("div", {
className: "nut-noticebar-vertical",
style: barStyle,
onClick: handleClick
}, children ? React__default.createElement("div", {
className: "horseLamp_list",
style: horseLampStyle
}, scrollList.current.map(function (item, index) {
return cloneChild(item, index);
})) : React__default.createElement("ul", {
className: "horseLamp_list",
style: horseLampStyle
}, scrollList.current.map(function (item, index) {
return (
// eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions
React__default.createElement("li", {
className: "horseLamp_list_item",
style: {
height: height
},
key: index
}, item)
);
})), React__default.createElement("div", {
className: "go",
onClick: function onClick(e) {
handleClickIcon(e);
}
}, rightIcon || (closeMode ? React__default.createElement(Icon, {
classPrefix: iconClassPrefix,
fontClassName: iconFontClassName,
name: rightIcon || 'close',
color: color,
size: "11px"
}) : null))) : null);
};
NoticeBar.defaultProps = defaultProps;
NoticeBar.displayName = 'NutNoticeBar';
export { NoticeBar as N };