UNPKG

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