~useWatch.js 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. "use strict";
  2. var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
  3. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
  4. Object.defineProperty(exports, "__esModule", {
  5. value: true
  6. });
  7. exports.default = void 0;
  8. exports.stringify = stringify;
  9. var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
  10. var _warning = _interopRequireDefault(require("rc-util/lib/warning"));
  11. var _FieldContext = _interopRequireWildcard(require("./FieldContext"));
  12. var _react = require("react");
  13. var _valueUtil = require("./utils/valueUtil");
  14. var _typeUtil = require("./utils/typeUtil");
  15. function stringify(value) {
  16. try {
  17. return JSON.stringify(value);
  18. } catch (err) {
  19. return Math.random();
  20. }
  21. }
  22. var useWatchWarning = process.env.NODE_ENV !== 'production' ? function (namePath) {
  23. var fullyStr = namePath.join('__RC_FIELD_FORM_SPLIT__');
  24. var nameStrRef = (0, _react.useRef)(fullyStr);
  25. (0, _warning.default)(nameStrRef.current === fullyStr, '`useWatch` is not support dynamic `namePath`. Please provide static instead.');
  26. } : function () {};
  27. function useWatch() {
  28. for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
  29. args[_key] = arguments[_key];
  30. }
  31. var _args$ = args[0],
  32. dependencies = _args$ === void 0 ? [] : _args$,
  33. _args$2 = args[1],
  34. _form = _args$2 === void 0 ? {} : _args$2;
  35. var options = (0, _typeUtil.isFormInstance)(_form) ? {
  36. form: _form
  37. } : _form;
  38. var form = options.form;
  39. var _useState = (0, _react.useState)(),
  40. _useState2 = (0, _slicedToArray2.default)(_useState, 2),
  41. value = _useState2[0],
  42. setValue = _useState2[1];
  43. var valueStr = (0, _react.useMemo)(function () {
  44. return stringify(value);
  45. }, [value]);
  46. var valueStrRef = (0, _react.useRef)(valueStr);
  47. valueStrRef.current = valueStr;
  48. var fieldContext = (0, _react.useContext)(_FieldContext.default);
  49. var formInstance = form || fieldContext;
  50. var isValidForm = formInstance && formInstance._init;
  51. // Warning if not exist form instance
  52. if (process.env.NODE_ENV !== 'production') {
  53. (0, _warning.default)(args.length === 2 ? form ? isValidForm : true : isValidForm, 'useWatch requires a form instance since it can not auto detect from context.');
  54. }
  55. var namePath = (0, _valueUtil.getNamePath)(dependencies);
  56. var namePathRef = (0, _react.useRef)(namePath);
  57. namePathRef.current = namePath;
  58. useWatchWarning(namePath);
  59. (0, _react.useEffect)(function () {
  60. // Skip if not exist form instance
  61. if (!isValidForm) {
  62. return;
  63. }
  64. var getFieldsValue = formInstance.getFieldsValue,
  65. getInternalHooks = formInstance.getInternalHooks;
  66. var _getInternalHooks = getInternalHooks(_FieldContext.HOOK_MARK),
  67. registerWatch = _getInternalHooks.registerWatch;
  68. var cancelRegister = registerWatch(function (values, allValues) {
  69. var newValue = (0, _valueUtil.getValue)(options.preserve ? allValues : values, namePathRef.current);
  70. var nextValueStr = stringify(newValue);
  71. // Compare stringify in case it's nest object
  72. if (valueStrRef.current !== nextValueStr) {
  73. valueStrRef.current = nextValueStr;
  74. setValue(newValue);
  75. }
  76. });
  77. // TODO: We can improve this perf in future
  78. var initialValue = (0, _valueUtil.getValue)(options.preserve ? getFieldsValue(true) : getFieldsValue(), namePathRef.current);
  79. setValue(initialValue);
  80. return cancelRegister;
  81. },
  82. // We do not need re-register since namePath content is the same
  83. // eslint-disable-next-line react-hooks/exhaustive-deps
  84. [isValidForm]);
  85. return value;
  86. }
  87. var _default = exports.default = useWatch;