Form.js 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
  3. var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
  4. Object.defineProperty(exports, "__esModule", {
  5. value: true
  6. });
  7. exports.default = void 0;
  8. var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
  9. var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
  10. var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
  11. var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
  12. var React = _interopRequireWildcard(require("react"));
  13. var _useForm3 = _interopRequireDefault(require("./useForm"));
  14. var _FieldContext = _interopRequireWildcard(require("./FieldContext"));
  15. var _FormContext = _interopRequireDefault(require("./FormContext"));
  16. var _valueUtil = require("./utils/valueUtil");
  17. var _ListContext = _interopRequireDefault(require("./ListContext"));
  18. var _excluded = ["name", "initialValues", "fields", "form", "preserve", "children", "component", "validateMessages", "validateTrigger", "onValuesChange", "onFieldsChange", "onFinish", "onFinishFailed", "clearOnDestroy"];
  19. var Form = function Form(_ref, ref) {
  20. var name = _ref.name,
  21. initialValues = _ref.initialValues,
  22. fields = _ref.fields,
  23. form = _ref.form,
  24. preserve = _ref.preserve,
  25. children = _ref.children,
  26. _ref$component = _ref.component,
  27. Component = _ref$component === void 0 ? 'form' : _ref$component,
  28. validateMessages = _ref.validateMessages,
  29. _ref$validateTrigger = _ref.validateTrigger,
  30. validateTrigger = _ref$validateTrigger === void 0 ? 'onChange' : _ref$validateTrigger,
  31. onValuesChange = _ref.onValuesChange,
  32. _onFieldsChange = _ref.onFieldsChange,
  33. _onFinish = _ref.onFinish,
  34. onFinishFailed = _ref.onFinishFailed,
  35. clearOnDestroy = _ref.clearOnDestroy,
  36. restProps = (0, _objectWithoutProperties2.default)(_ref, _excluded);
  37. var nativeElementRef = React.useRef(null);
  38. var formContext = React.useContext(_FormContext.default);
  39. // We customize handle event since Context will makes all the consumer re-render:
  40. // https://reactjs.org/docs/context.html#contextprovider
  41. var _useForm = (0, _useForm3.default)(form),
  42. _useForm2 = (0, _slicedToArray2.default)(_useForm, 1),
  43. formInstance = _useForm2[0];
  44. var _getInternalHooks = formInstance.getInternalHooks(_FieldContext.HOOK_MARK),
  45. useSubscribe = _getInternalHooks.useSubscribe,
  46. setInitialValues = _getInternalHooks.setInitialValues,
  47. setCallbacks = _getInternalHooks.setCallbacks,
  48. setValidateMessages = _getInternalHooks.setValidateMessages,
  49. setPreserve = _getInternalHooks.setPreserve,
  50. destroyForm = _getInternalHooks.destroyForm;
  51. // Pass ref with form instance
  52. React.useImperativeHandle(ref, function () {
  53. return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, formInstance), {}, {
  54. nativeElement: nativeElementRef.current
  55. });
  56. });
  57. // Register form into Context
  58. React.useEffect(function () {
  59. formContext.registerForm(name, formInstance);
  60. return function () {
  61. formContext.unregisterForm(name);
  62. };
  63. }, [formContext, formInstance, name]);
  64. // Pass props to store
  65. setValidateMessages((0, _objectSpread2.default)((0, _objectSpread2.default)({}, formContext.validateMessages), validateMessages));
  66. setCallbacks({
  67. onValuesChange: onValuesChange,
  68. onFieldsChange: function onFieldsChange(changedFields) {
  69. formContext.triggerFormChange(name, changedFields);
  70. if (_onFieldsChange) {
  71. for (var _len = arguments.length, rest = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
  72. rest[_key - 1] = arguments[_key];
  73. }
  74. _onFieldsChange.apply(void 0, [changedFields].concat(rest));
  75. }
  76. },
  77. onFinish: function onFinish(values) {
  78. formContext.triggerFormFinish(name, values);
  79. if (_onFinish) {
  80. _onFinish(values);
  81. }
  82. },
  83. onFinishFailed: onFinishFailed
  84. });
  85. setPreserve(preserve);
  86. // Set initial value, init store value when first mount
  87. var mountRef = React.useRef(null);
  88. setInitialValues(initialValues, !mountRef.current);
  89. if (!mountRef.current) {
  90. mountRef.current = true;
  91. }
  92. React.useEffect(function () {
  93. return function () {
  94. return destroyForm(clearOnDestroy);
  95. };
  96. },
  97. // eslint-disable-next-line react-hooks/exhaustive-deps
  98. []);
  99. // Prepare children by `children` type
  100. var childrenNode;
  101. var childrenRenderProps = typeof children === 'function';
  102. if (childrenRenderProps) {
  103. var _values = formInstance.getFieldsValue(true);
  104. childrenNode = children(_values, formInstance);
  105. } else {
  106. childrenNode = children;
  107. }
  108. // Not use subscribe when using render props
  109. useSubscribe(!childrenRenderProps);
  110. // Listen if fields provided. We use ref to save prev data here to avoid additional render
  111. var prevFieldsRef = React.useRef();
  112. React.useEffect(function () {
  113. if (!(0, _valueUtil.isSimilar)(prevFieldsRef.current || [], fields || [])) {
  114. formInstance.setFields(fields || []);
  115. }
  116. prevFieldsRef.current = fields;
  117. }, [fields, formInstance]);
  118. var formContextValue = React.useMemo(function () {
  119. return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, formInstance), {}, {
  120. validateTrigger: validateTrigger
  121. });
  122. }, [formInstance, validateTrigger]);
  123. var wrapperNode = /*#__PURE__*/React.createElement(_ListContext.default.Provider, {
  124. value: null
  125. }, /*#__PURE__*/React.createElement(_FieldContext.default.Provider, {
  126. value: formContextValue
  127. }, childrenNode));
  128. if (Component === false) {
  129. return wrapperNode;
  130. }
  131. return /*#__PURE__*/React.createElement(Component, (0, _extends2.default)({}, restProps, {
  132. ref: nativeElementRef,
  133. onSubmit: function onSubmit(event) {
  134. event.preventDefault();
  135. event.stopPropagation();
  136. formInstance.submit();
  137. },
  138. onReset: function onReset(event) {
  139. var _restProps$onReset;
  140. event.preventDefault();
  141. formInstance.resetFields();
  142. (_restProps$onReset = restProps.onReset) === null || _restProps$onReset === void 0 || _restProps$onReset.call(restProps, event);
  143. }
  144. }), wrapperNode);
  145. };
  146. var _default = exports.default = Form;