@bnorth/components
Version:
bnorth, components, react
251 lines (206 loc) • 7.79 kB
JavaScript
"use strict";
var _interopRequireWildcard = require("@babel/runtime-corejs2/helpers/interopRequireWildcard");
var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
var _Object$defineProperty2 = require("@babel/runtime-corejs2/core-js/object/define-property");
_Object$defineProperty2(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _defineProperty = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/define-property"));
var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/extends"));
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/objectWithoutProperties"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/getPrototypeOf"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/inherits"));
var _react = _interopRequireDefault(require("react"));
var _BaseComponent2 = _interopRequireWildcard(require("./BaseComponent"));
var _Panel = _interopRequireDefault(require("./Panel"));
/**
* @module
*/
/**
* 滚动监控组件
* @component
* @exportdefault
*/
var ScrollSpy =
/*#__PURE__*/
function (_React$Component) {
(0, _inherits2.default)(ScrollSpy, _React$Component);
function ScrollSpy() {
(0, _classCallCheck2.default)(this, ScrollSpy);
return (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(ScrollSpy).apply(this, arguments));
}
(0, _createClass2.default)(ScrollSpy, [{
key: "_getTargetOffset",
value: function _getTargetOffset() {
this.targetOffset = null;
var _this$props = this.props,
_this$props$target = _this$props.target,
target = _this$props$target === void 0 ? true : _this$props$target,
onRelativeChange = _this$props.onRelativeChange;
if (!target || !onRelativeChange) return;
if (target === true) {
this.targetOffset = (0, _BaseComponent2.domOffset)(this, this.dock);
} else if (target === 'parent') {
var dom = (0, _BaseComponent2.domFindNode)(this);
if (!dom) return;
dom = dom.parentNode;
if (!dom) return;
this.targetOffset = (0, _BaseComponent2.domOffset)(dom, this.dock);
}
if (this.targetOffset) this.targetOffset.bottom = this.targetOffset.top + this.targetOffset.height;
}
}, {
key: "_getScrollOffset",
value: function _getScrollOffset() {
if (!this.dock) return {};
return {
top: this.dock.scrollTop,
bottom: this.dock.scrollTop + this.dock.offsetHeight
};
}
}, {
key: "_getRelative",
value: function _getRelative(targetOffset, scrollOffset) {
// top is within the viewport
if (targetOffset.top <= scrollOffset.top && scrollOffset.top <= targetOffset.bottom) {
return 'above_inside';
} // bottom is within the viewport
if (targetOffset.top <= scrollOffset.bottom && scrollOffset.bottom <= targetOffset.bottom) {
return 'below_inside';
} // top is above the viewport and bottom is below the viewport
if (scrollOffset.top <= targetOffset.top && targetOffset.bottom <= scrollOffset.bottom) {
return 'inside';
}
if (targetOffset.bottom < scrollOffset.bottom) {
return 'above';
}
if (scrollOffset.top < targetOffset.top) {
return 'below';
}
}
}, {
key: "componentDidMount",
value: function componentDidMount() {
this.relative = '';
this.dock = (0, _BaseComponent2.domFindScrollDock)(this, this.props.dock, this.props.horizontal);
this._getTargetOffset();
this.offScrollListener = (0, _BaseComponent2.listen)(this.dock, 'scroll', this._handlePosChange.bind(this), true);
this.offResizeListener = (0, _BaseComponent2.listen)(window, 'resize', this._handlePosChange.bind(this), true);
this._handlePosChange();
}
}, {
key: "componentWillUnmount",
value: function componentWillUnmount() {
this.offScrollListener && this.offScrollListener();
this.offResizeListener && this.offResizeListener();
}
}, {
key: "componentDidUpdate",
value: function componentDidUpdate() {
this._getTargetOffset();
this._handlePosChange();
}
}, {
key: "_handlePosChange",
value: function _handlePosChange(event) {
var _this$props2 = this.props,
onPosChange = _this$props2.onPosChange,
onRelativeChange = _this$props2.onRelativeChange;
onPosChange && onPosChange(event, this.dock);
if (!onRelativeChange || !this.targetOffset) return;
var targetOffset = this.targetOffset;
var scrollOffset = this._getScrollOffset();
var relative = this._getRelative(targetOffset, scrollOffset);
if (relative !== this.relative) {
onRelativeChange(relative, this.relative, event, this.dock);
this.relative = relative;
}
}
}, {
key: "render",
value: function render() {
var _BaseComponent = (0, _BaseComponent2.default)(this.props, ScrollSpy),
onPosChange = _BaseComponent.onPosChange,
onRelativeChange = _BaseComponent.onRelativeChange,
horizontal = _BaseComponent.horizontal,
dock = _BaseComponent.dock,
target = _BaseComponent.target,
props = (0, _objectWithoutProperties2.default)(_BaseComponent, ["onPosChange", "onRelativeChange", "horizontal", "dock", "target"]);
return _react.default.createElement(_Panel.default, (0, _extends2.default)({
component: "span",
stylePre: {
fontSize: 0
}
}, props));
}
}]);
return ScrollSpy;
}(_react.default.Component);
ScrollSpy.defaultProps = {};
/**
* TODO
* @type {boolean|string}
*/
ScrollSpy.defaultProps.target = true;
/**
* TODO
* @attribute module:ScrollSpy.ScrollSpy.dock
* @type {boolean}
*/
/**
* 监听横向滚动条,默认监听纵向滚动条
* @attribute module:ScrollSpy.ScrollSpy.horizontal
* @type {boolean}
*/
/**
* 相对位置
*
* - above_inside:
* - below_inside:
* - inside:
* - above:
* - below:
*
* @typedef RelativeType
* @type {string}
*/
/**
* 相对位置改变回调函数
* @callback onRelativeChangeCallback
* @param {module:ScrollSpy~RelativeType} relative - 相对位置
* @param {module:ScrollSpy~RelativeType} preRelative - 改变前的相对位置
* @param {event} event - 引起改变的滚动事件
* @param {element} dock - 滚动对象的 dom 元素
*/
/**
* 设置滚动位置改变时引起,监控组件与滚动组件相对位置改变的事件的回调函数
* @attribute module:ScrollSpy.ScrollSpy.onRelativeChange
* @type {module:ScrollSpy~onRelativeChangeCallback}
*/
/**
* 滚动位置改变回调函数
* @callback onPosChangeCallback
* @param {event} event - 引起改变的滚动事件
* @param {element} dock - 滚动对象的 dom 元素
*/
/**
* 设置滚动位置改变时触发事件的回调函数
* @attribute module:ScrollSpy.ScrollSpy.onPosChange
* @type {module:ScrollSpy~onPosChangeCallback}
*/
(0, _defineProperty.default)(ScrollSpy, "ScrollSpy", {
get: function get() {
return ScrollSpy;
},
set: function set(val) {
ScrollSpy = val;
}
});
ScrollSpy.isBnorth = true;
ScrollSpy.defaultProps['b-precast'] = {};
var _default = ScrollSpy;
exports.default = _default;