debouncedWatch.js 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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 _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
  10. var _vue = require("vue");
  11. // copy from https://github.dev/vueuse/vueuse
  12. var __rest = void 0 && (void 0).__rest || function (s, e) {
  13. var t = {};
  14. for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];
  15. if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
  16. if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];
  17. }
  18. return t;
  19. };
  20. const bypassFilter = invoke => {
  21. return invoke();
  22. };
  23. /**
  24. * Create an EventFilter that debounce the events
  25. *
  26. * @param ms
  27. */
  28. function debounceFilter(ms) {
  29. let timer;
  30. const filter = invoke => {
  31. const duration = (0, _vue.unref)(ms);
  32. if (timer) clearTimeout(timer);
  33. if (duration <= 0) return invoke();
  34. timer = setTimeout(invoke, duration);
  35. };
  36. return filter;
  37. }
  38. /**
  39. * @internal
  40. */
  41. function createFilterWrapper(filter, fn) {
  42. function wrapper() {
  43. for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
  44. args[_key] = arguments[_key];
  45. }
  46. filter(() => fn.apply(this, args), {
  47. fn,
  48. thisArg: this,
  49. args
  50. });
  51. }
  52. return wrapper;
  53. }
  54. // implementation
  55. function watchWithFilter(source, cb) {
  56. let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
  57. const {
  58. eventFilter = bypassFilter
  59. } = options,
  60. watchOptions = __rest(options, ["eventFilter"]);
  61. return (0, _vue.watch)(source, createFilterWrapper(eventFilter, cb), watchOptions);
  62. }
  63. // implementation
  64. function debouncedWatch(source, cb) {
  65. let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
  66. const {
  67. debounce = 0
  68. } = options,
  69. watchOptions = __rest(options, ["debounce"]);
  70. return watchWithFilter(source, cb, (0, _extends2.default)((0, _extends2.default)({}, watchOptions), {
  71. eventFilter: debounceFilter(debounce)
  72. }));
  73. }