debouncedWatch.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.debounceFilter = debounceFilter;
  7. exports.default = debouncedWatch;
  8. exports.watchWithFilter = watchWithFilter;
  9. var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
  10. var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
  11. var _vue = require("vue");
  12. var _excluded = ["eventFilter"],
  13. _excluded2 = ["debounce"];
  14. var bypassFilter = function bypassFilter(invoke) {
  15. return invoke();
  16. };
  17. /**
  18. * Create an EventFilter that debounce the events
  19. *
  20. * @param ms
  21. */
  22. function debounceFilter(ms) {
  23. var timer;
  24. var filter = function filter(invoke) {
  25. var duration = (0, _vue.unref)(ms);
  26. if (timer) clearTimeout(timer);
  27. if (duration <= 0) return invoke();
  28. timer = setTimeout(invoke, duration);
  29. };
  30. return filter;
  31. }
  32. /**
  33. * @internal
  34. */
  35. function createFilterWrapper(filter, fn) {
  36. function wrapper() {
  37. var _this = this;
  38. for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
  39. args[_key] = arguments[_key];
  40. }
  41. filter(function () {
  42. return fn.apply(_this, args);
  43. }, {
  44. fn: fn,
  45. thisArg: this,
  46. args: args
  47. });
  48. }
  49. return wrapper;
  50. }
  51. // implementation
  52. function watchWithFilter(source, cb) {
  53. var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
  54. var _options$eventFilter = options.eventFilter,
  55. eventFilter = _options$eventFilter === void 0 ? bypassFilter : _options$eventFilter,
  56. watchOptions = (0, _objectWithoutProperties2.default)(options, _excluded);
  57. return (0, _vue.watch)(source, createFilterWrapper(eventFilter, cb), watchOptions);
  58. }
  59. // implementation
  60. function debouncedWatch(source, cb) {
  61. var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
  62. var _options$debounce = options.debounce,
  63. debounce = _options$debounce === void 0 ? 0 : _options$debounce,
  64. watchOptions = (0, _objectWithoutProperties2.default)(options, _excluded2);
  65. return watchWithFilter(source, cb, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, watchOptions), {}, {
  66. eventFilter: debounceFilter(debounce)
  67. }));
  68. }