useRefWithInitialValueFactory.js 653 Bytes
Newer Older
Sangjune Bae's avatar
Sangjune Bae committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import { useRef } from 'react';
var dft = Symbol('default value sigil');
/**
 * Exactly the same as `useRef` except that the initial value is set via a
 * factroy function. Useful when the default is relatively costly to construct.
 *
 *  ```ts
 *  const ref = useRefWithInitialValueFactory<ExpensiveValue>(() => constructExpensiveValue())
 *
 *  ```
 *
 * @param initialValueFactory A factory function returning the ref's default value
 * @category refs
 */

export default function useRefWithInitialValueFactory(initialValueFactory) {
  var ref = useRef(dft);

  if (ref.current === dft) {
    ref.current = initialValueFactory();
  }

  return ref;
}