BackTop.js 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.default = void 0;
  7. var _vue = require("vue");
  8. var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
  9. var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
  10. var _VerticalAlignTopOutlined = _interopRequireDefault(require("@ant-design/icons-vue/lib/icons/VerticalAlignTopOutlined"));
  11. var _transition = require("../_util/transition");
  12. var _FloatButton = _interopRequireWildcard(require("./FloatButton"));
  13. var _useConfigInject = _interopRequireDefault(require("../config-provider/hooks/useConfigInject"));
  14. var _getScroll = _interopRequireDefault(require("../_util/getScroll"));
  15. var _scrollTo = _interopRequireDefault(require("../_util/scrollTo"));
  16. var _throttleByAnimationFrame = _interopRequireDefault(require("../_util/throttleByAnimationFrame"));
  17. var _propsUtil = require("../_util/props-util");
  18. var _interface = require("./interface");
  19. var _style = _interopRequireDefault(require("./style"));
  20. var _context = require("./context");
  21. function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
  22. function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
  23. const BackTop = (0, _vue.defineComponent)({
  24. compatConfig: {
  25. MODE: 3
  26. },
  27. name: 'ABackTop',
  28. inheritAttrs: false,
  29. props: (0, _propsUtil.initDefaultProps)((0, _interface.backTopProps)(), {
  30. visibilityHeight: 400,
  31. target: () => window,
  32. duration: 450,
  33. type: 'default',
  34. shape: 'circle'
  35. }),
  36. // emits: ['click'],
  37. setup(props, _ref) {
  38. let {
  39. slots,
  40. attrs,
  41. emit
  42. } = _ref;
  43. const {
  44. prefixCls,
  45. direction
  46. } = (0, _useConfigInject.default)(_FloatButton.floatButtonPrefixCls, props);
  47. const [wrapSSR] = (0, _style.default)(prefixCls);
  48. const domRef = (0, _vue.ref)();
  49. const state = (0, _vue.reactive)({
  50. visible: props.visibilityHeight === 0,
  51. scrollEvent: null
  52. });
  53. const getDefaultTarget = () => domRef.value && domRef.value.ownerDocument ? domRef.value.ownerDocument : window;
  54. const scrollToTop = e => {
  55. const {
  56. target = getDefaultTarget,
  57. duration
  58. } = props;
  59. (0, _scrollTo.default)(0, {
  60. getContainer: target,
  61. duration
  62. });
  63. emit('click', e);
  64. };
  65. const handleScroll = (0, _throttleByAnimationFrame.default)(e => {
  66. const {
  67. visibilityHeight
  68. } = props;
  69. const scrollTop = (0, _getScroll.default)(e.target, true);
  70. state.visible = scrollTop >= visibilityHeight;
  71. });
  72. const bindScrollEvent = () => {
  73. const {
  74. target
  75. } = props;
  76. const getTarget = target || getDefaultTarget;
  77. const container = getTarget();
  78. handleScroll({
  79. target: container
  80. });
  81. container === null || container === void 0 ? void 0 : container.addEventListener('scroll', handleScroll);
  82. };
  83. const scrollRemove = () => {
  84. const {
  85. target
  86. } = props;
  87. const getTarget = target || getDefaultTarget;
  88. const container = getTarget();
  89. handleScroll.cancel();
  90. container === null || container === void 0 ? void 0 : container.removeEventListener('scroll', handleScroll);
  91. };
  92. (0, _vue.watch)(() => props.target, () => {
  93. scrollRemove();
  94. (0, _vue.nextTick)(() => {
  95. bindScrollEvent();
  96. });
  97. });
  98. (0, _vue.onMounted)(() => {
  99. (0, _vue.nextTick)(() => {
  100. bindScrollEvent();
  101. });
  102. });
  103. (0, _vue.onActivated)(() => {
  104. (0, _vue.nextTick)(() => {
  105. bindScrollEvent();
  106. });
  107. });
  108. (0, _vue.onDeactivated)(() => {
  109. scrollRemove();
  110. });
  111. (0, _vue.onBeforeUnmount)(() => {
  112. scrollRemove();
  113. });
  114. const floatButtonGroupContext = (0, _context.useInjectFloatButtonGroupContext)();
  115. return () => {
  116. const {
  117. description,
  118. type,
  119. shape,
  120. tooltip,
  121. badge
  122. } = props;
  123. const floatButtonProps = (0, _extends2.default)((0, _extends2.default)({}, attrs), {
  124. shape: (floatButtonGroupContext === null || floatButtonGroupContext === void 0 ? void 0 : floatButtonGroupContext.shape.value) || shape,
  125. onClick: scrollToTop,
  126. class: {
  127. [`${prefixCls.value}`]: true,
  128. [`${attrs.class}`]: attrs.class,
  129. [`${prefixCls.value}-rtl`]: direction.value === 'rtl'
  130. },
  131. description,
  132. type,
  133. tooltip,
  134. badge
  135. });
  136. const transitionProps = (0, _transition.getTransitionProps)('fade');
  137. return wrapSSR((0, _vue.createVNode)(_transition.Transition, transitionProps, {
  138. default: () => [(0, _vue.withDirectives)((0, _vue.createVNode)(_FloatButton.default, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, floatButtonProps), {}, {
  139. "ref": domRef
  140. }), {
  141. icon: () => {
  142. var _a;
  143. return ((_a = slots.icon) === null || _a === void 0 ? void 0 : _a.call(slots)) || (0, _vue.createVNode)(_VerticalAlignTopOutlined.default, null, null);
  144. }
  145. }), [[_vue.vShow, state.visible]])]
  146. }));
  147. };
  148. }
  149. });
  150. var _default = exports.default = BackTop;