GoodsCategoryCascadeSelector.tsx 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. import React from 'react';
  2. import { useFormContext } from 'react-hook-form';
  3. import {
  4. FormField,
  5. FormItem,
  6. FormLabel,
  7. FormControl,
  8. FormMessage,
  9. } from '@d8d/shared-ui-components/components/ui/form';
  10. import GoodsCategorySelector from './GoodsCategorySelector';
  11. interface GoodsCategoryCascadeSelectorProps {
  12. formNamePrefix?: string;
  13. required?: boolean;
  14. }
  15. const GoodsCategoryCascadeSelector: React.FC<GoodsCategoryCascadeSelectorProps> = ({
  16. formNamePrefix = '',
  17. required = false,
  18. }) => {
  19. const form = useFormContext();
  20. // 监听一级分类变化,重置二级和三级分类
  21. const handleCategoryId1Change = (value: number) => {
  22. form.setValue(`${formNamePrefix}categoryId1`, value);
  23. form.setValue(`${formNamePrefix}categoryId2`, 0);
  24. form.setValue(`${formNamePrefix}categoryId3`, 0);
  25. };
  26. // 监听二级分类变化,重置三级分类
  27. const handleCategoryId2Change = (value: number) => {
  28. form.setValue(`${formNamePrefix}categoryId2`, value);
  29. form.setValue(`${formNamePrefix}categoryId3`, 0);
  30. };
  31. // 监听三级分类变化
  32. const handleCategoryId3Change = (value: number) => {
  33. form.setValue(`${formNamePrefix}categoryId3`, value);
  34. };
  35. return (
  36. <div className="grid grid-cols-3 gap-4">
  37. <FormField
  38. control={form.control}
  39. name={`${formNamePrefix}categoryId1`}
  40. render={({ field }) => (
  41. <FormItem>
  42. <FormLabel>
  43. 一级分类
  44. {required && <span className="text-red-500"> *</span>}
  45. </FormLabel>
  46. <FormControl>
  47. <GoodsCategorySelector
  48. value={field.value || undefined}
  49. onChange={handleCategoryId1Change}
  50. level={1}
  51. />
  52. </FormControl>
  53. <FormMessage />
  54. </FormItem>
  55. )}
  56. />
  57. <FormField
  58. control={form.control}
  59. name={`${formNamePrefix}categoryId2`}
  60. render={({ field }) => (
  61. <FormItem>
  62. <FormLabel>
  63. 二级分类
  64. {required && <span className="text-red-500"> *</span>}
  65. </FormLabel>
  66. <FormControl>
  67. <GoodsCategorySelector
  68. value={field.value || undefined}
  69. onChange={handleCategoryId2Change}
  70. level={2}
  71. parentId={form.watch(`${formNamePrefix}categoryId1`)}
  72. disabled={!form.watch(`${formNamePrefix}categoryId1`)}
  73. />
  74. </FormControl>
  75. <FormMessage />
  76. </FormItem>
  77. )}
  78. />
  79. <FormField
  80. control={form.control}
  81. name={`${formNamePrefix}categoryId3`}
  82. render={({ field }) => (
  83. <FormItem>
  84. <FormLabel>
  85. 三级分类
  86. {required && <span className="text-red-500"> *</span>}
  87. </FormLabel>
  88. <FormControl>
  89. <GoodsCategorySelector
  90. value={field.value || undefined}
  91. onChange={handleCategoryId3Change}
  92. level={3}
  93. parentId={form.watch(`${formNamePrefix}categoryId2`)}
  94. disabled={!form.watch(`${formNamePrefix}categoryId2`)}
  95. />
  96. </FormControl>
  97. <FormMessage />
  98. </FormItem>
  99. )}
  100. />
  101. </div>
  102. );
  103. };
  104. export default GoodsCategoryCascadeSelector;