useOptions.js 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. import * as React from 'react';
  2. import { convertChildrenToData } from "../utils/legacyUtil";
  3. /**
  4. * Parse `children` to `options` if `options` is not provided.
  5. * Then flatten the `options`.
  6. */
  7. var useOptions = function useOptions(options, children, fieldNames, optionFilterProp, optionLabelProp) {
  8. return React.useMemo(function () {
  9. var mergedOptions = options;
  10. var childrenAsData = !options;
  11. if (childrenAsData) {
  12. mergedOptions = convertChildrenToData(children);
  13. }
  14. var valueOptions = new Map();
  15. var labelOptions = new Map();
  16. var setLabelOptions = function setLabelOptions(labelOptionsMap, option, key) {
  17. if (key && typeof key === 'string') {
  18. labelOptionsMap.set(option[key], option);
  19. }
  20. };
  21. var dig = function dig(optionList) {
  22. var isChildren = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
  23. // for loop to speed up collection speed
  24. for (var i = 0; i < optionList.length; i += 1) {
  25. var option = optionList[i];
  26. if (!option[fieldNames.options] || isChildren) {
  27. valueOptions.set(option[fieldNames.value], option);
  28. setLabelOptions(labelOptions, option, fieldNames.label);
  29. // https://github.com/ant-design/ant-design/issues/35304
  30. setLabelOptions(labelOptions, option, optionFilterProp);
  31. setLabelOptions(labelOptions, option, optionLabelProp);
  32. } else {
  33. dig(option[fieldNames.options], true);
  34. }
  35. }
  36. };
  37. dig(mergedOptions);
  38. return {
  39. options: mergedOptions,
  40. valueOptions: valueOptions,
  41. labelOptions: labelOptions
  42. };
  43. }, [options, children, fieldNames, optionFilterProp, optionLabelProp]);
  44. };
  45. export default useOptions;