group.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. "use strict";
  2. "use client";
  3. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
  4. var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
  5. Object.defineProperty(exports, "__esModule", {
  6. value: true
  7. });
  8. exports.default = void 0;
  9. var React = _interopRequireWildcard(require("react"));
  10. var _classnames = _interopRequireDefault(require("classnames"));
  11. var _useId = _interopRequireDefault(require("rc-util/lib/hooks/useId"));
  12. var _useMergedState = _interopRequireDefault(require("rc-util/lib/hooks/useMergedState"));
  13. var _pickAttrs = _interopRequireDefault(require("rc-util/lib/pickAttrs"));
  14. var _configProvider = require("../config-provider");
  15. var _useCSSVarCls = _interopRequireDefault(require("../config-provider/hooks/useCSSVarCls"));
  16. var _useSize = _interopRequireDefault(require("../config-provider/hooks/useSize"));
  17. var _context = require("./context");
  18. var _radio = _interopRequireDefault(require("./radio"));
  19. var _style = _interopRequireDefault(require("./style"));
  20. var _context2 = require("../form/context");
  21. var _useForm = require("../form/hooks/useForm");
  22. const RadioGroup = /*#__PURE__*/React.forwardRef((props, ref) => {
  23. const {
  24. getPrefixCls,
  25. direction
  26. } = React.useContext(_configProvider.ConfigContext);
  27. const {
  28. name: formItemName
  29. } = React.useContext(_context2.FormItemInputContext);
  30. const defaultName = (0, _useId.default)((0, _useForm.toNamePathStr)(formItemName));
  31. const {
  32. prefixCls: customizePrefixCls,
  33. className,
  34. rootClassName,
  35. options,
  36. buttonStyle = 'outline',
  37. disabled,
  38. children,
  39. size: customizeSize,
  40. style,
  41. id,
  42. optionType,
  43. name = defaultName,
  44. defaultValue,
  45. value: customizedValue,
  46. block = false,
  47. onChange,
  48. onMouseEnter,
  49. onMouseLeave,
  50. onFocus,
  51. onBlur
  52. } = props;
  53. const [value, setValue] = (0, _useMergedState.default)(defaultValue, {
  54. value: customizedValue
  55. });
  56. const onRadioChange = React.useCallback(event => {
  57. const lastValue = value;
  58. const val = event.target.value;
  59. if (!('value' in props)) {
  60. setValue(val);
  61. }
  62. if (val !== lastValue) {
  63. onChange === null || onChange === void 0 ? void 0 : onChange(event);
  64. }
  65. }, [value, setValue, onChange]);
  66. const prefixCls = getPrefixCls('radio', customizePrefixCls);
  67. const groupPrefixCls = `${prefixCls}-group`;
  68. // Style
  69. const rootCls = (0, _useCSSVarCls.default)(prefixCls);
  70. const [wrapCSSVar, hashId, cssVarCls] = (0, _style.default)(prefixCls, rootCls);
  71. let childrenToRender = children;
  72. // 如果存在 options, 优先使用
  73. if (options && options.length > 0) {
  74. childrenToRender = options.map(option => {
  75. if (typeof option === 'string' || typeof option === 'number') {
  76. // 此处类型自动推导为 string
  77. return /*#__PURE__*/React.createElement(_radio.default, {
  78. key: option.toString(),
  79. prefixCls: prefixCls,
  80. disabled: disabled,
  81. value: option,
  82. checked: value === option
  83. }, option);
  84. }
  85. // 此处类型自动推导为 { label: string value: string }
  86. return /*#__PURE__*/React.createElement(_radio.default, {
  87. key: `radio-group-value-options-${option.value}`,
  88. prefixCls: prefixCls,
  89. disabled: option.disabled || disabled,
  90. value: option.value,
  91. checked: value === option.value,
  92. title: option.title,
  93. style: option.style,
  94. className: option.className,
  95. id: option.id,
  96. required: option.required
  97. }, option.label);
  98. });
  99. }
  100. const mergedSize = (0, _useSize.default)(customizeSize);
  101. const classString = (0, _classnames.default)(groupPrefixCls, `${groupPrefixCls}-${buttonStyle}`, {
  102. [`${groupPrefixCls}-${mergedSize}`]: mergedSize,
  103. [`${groupPrefixCls}-rtl`]: direction === 'rtl',
  104. [`${groupPrefixCls}-block`]: block
  105. }, className, rootClassName, hashId, cssVarCls, rootCls);
  106. const memoizedValue = React.useMemo(() => ({
  107. onChange: onRadioChange,
  108. value,
  109. disabled,
  110. name,
  111. optionType,
  112. block
  113. }), [onRadioChange, value, disabled, name, optionType, block]);
  114. return wrapCSSVar(/*#__PURE__*/React.createElement("div", Object.assign({}, (0, _pickAttrs.default)(props, {
  115. aria: true,
  116. data: true
  117. }), {
  118. className: classString,
  119. style: style,
  120. onMouseEnter: onMouseEnter,
  121. onMouseLeave: onMouseLeave,
  122. onFocus: onFocus,
  123. onBlur: onBlur,
  124. id: id,
  125. ref: ref
  126. }), /*#__PURE__*/React.createElement(_context.RadioGroupContextProvider, {
  127. value: memoizedValue
  128. }, childrenToRender)));
  129. });
  130. var _default = exports.default = /*#__PURE__*/React.memo(RadioGroup);