Dashboard sipadu mbip
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

useStableMemo.js 1.2KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. "use strict";
  2. exports.__esModule = true;
  3. exports.default = useStableMemo;
  4. var _react = require("react");
  5. function isEqual(a, b) {
  6. if (a.length !== b.length) return false;
  7. for (var i = 0; i < a.length; i++) {
  8. if (a[i] !== b[i]) {
  9. return false;
  10. }
  11. }
  12. return true;
  13. }
  14. /**
  15. * Identical to `useMemo` _except_ that it provides a semantic guarantee that
  16. * values will not be invalidated unless the dependencies change. This is unlike
  17. * the built in `useMemo` which may discard memoized values for performance reasons.
  18. *
  19. * @param factory A function that returns a value to be memoized
  20. * @param deps A dependency array
  21. */
  22. function useStableMemo(factory, deps) {
  23. var isValid = true;
  24. var valueRef = (0, _react.useRef)(); // initial hook call
  25. if (!valueRef.current) {
  26. valueRef.current = {
  27. deps: deps,
  28. result: factory() // subsequent calls
  29. };
  30. } else {
  31. isValid = !!(deps && valueRef.current.deps && isEqual(deps, valueRef.current.deps));
  32. }
  33. var cache = isValid ? valueRef.current : {
  34. deps: deps,
  35. result: factory() // must update immediately so any sync renders here don't cause an infinite loop
  36. };
  37. valueRef.current = cache;
  38. return cache.result;
  39. }