Как заполнить категорию и подкатегорию на основе json?

#javascript #reactjs #chakra-ui

Вопрос:

Я создаю эту форму администратора, где категория и подкатегория будут выбраны в раскрывающемся списке, а параметры будут из заданного Json (categories.json), и соответствующая подкатегория будет заполнена после выбора категории при создании продукта. например, если я выберу category_slug мужская мода, появится подкатегория, такая как футболка. Как это сделать в React? файл json

 {  "categories": [  {  "id": "1",  "name": "Men's Fashion",  "category_slug": "men's-fashion",  "category_type": "product",  "child_categories": [  {  "id": "2",  "name": "T-Shirt",  "category_slug": "t-shirt"  },  {  "id": "3",  "name": "Panjabi amp; Fatua",  "category_slug": "panjabi-amp;-fatua"  },  {  "id": "4",  "name": "Polo Shirts",  "category_slug": "polo-shirts"  },  {  "id": "5",  "name": "Jeans",  "category_slug": "jeans"  },  {  "id": "6",  "name": "Men's Sweaters ",  "category_slug": "men's-sweaters-"  }  ]  },  {  "id": "7",  "name": "Electronic Device ",  "category_slug": "electronic-device-",  "child_cat": [  {  "id": "8",  "name": "Mobile ",  "category_slug": "mobile-12"  },  {  "id": "9",  "name": "Tablets",  "category_slug": "tablets"  },  {  "id": "10",  "name": "Laptops",  "category_slug": "laptops"  },  {  "id": "11",  "name": "Desktops",  "category_slug": "desktops"  },  {  "id": "12",  "name": "Gaming Consoles",  "category_slug": "gaming-consoles"  },  {  "id": "13",  "name": "Cameras",  "category_slug": "cameras"  },  {  "id": "14",  "name": "Security Cameras",  "category_slug": "security-cameras"  },  {  "id": "15",  "name": "Test",  "category_slug": "test"  }  ]  },  {  "id": "16",  "name": "Electronic Accessories ",  "category_slug": "electronic-accessories-",  "child_cat": [  {  "id": "17",  "name": "Mobile Accessories",  "category_slug": "mobile-accessories"  },  {  "id": "18",  "name": "Wearable",  "category_slug": "wearable"  },  {  "id": "19",  "name": "Console Accessories",  "category_slug": "console-accessories"  },  {  "id": "20",  "name": "Camera Accessories",  "category_slug": "camera-accessories"  },  {  "id": "21",  "name": "Computer Accessories",  "category_slug": "computer-accessories"  },  {  "id": "22",  "name": "Storage",  "category_slug": "storage"  },  {  "id": "23",  "name": "Printers",  "category_slug": "printers"  },  {  "id": "24",  "name": "Computer Components",  "category_slug": "computer-components"  },  {  "id": "25",  "name": "Network Components",  "category_slug": "network-components"  },  {  "id": "26",  "name": "Software",  "category_slug": "software"  }  ]  },  {  "id": "27",  "name": "TV amp; Home Appliances",  "category_slug": "tv-amp;-home-appliances"  },  {  "id": "28",  "name": "Health amp; Beauty",  "category_slug": "health-amp;-beauty",  "child_cat": [  {  "id": "29",  "name": "Bath amp; Body",  "category_slug": "bath-amp;-body"  },  {  "id": "30",  "name": "Beauty Tools",  "category_slug": "beauty-tools"  },  {  "id": "31",  "name": "Fragrances",  "category_slug": "fragrances"  },  {  "id": "32",  "name": "Hair Care",  "category_slug": "hair-care"  },  {  "id": "33",  "name": "Makeup",  "category_slug": "makeup"  },  {  "id": "35",  "name": "Personal Care",  "category_slug": "personal-care"  },  {  "id": "36",  "name": "Skin Care",  "category_slug": "skin-care"  },  {  "id": "5f2a9798e7abc4290b6c6275",  "name": "Medical Supplies",  "category_slug": "medical-supplies"  }  ]  }  ] }  

Форма. Для этого я использовал Чакрауи.

 export default function AddProductForm() {  return (  lt;Box display='flex' justifyContent='center' alignItems='center'gt;  lt;Box  w={[300, 400, 600]}  border='1px'  boxShadow='md'  p={5}  rounded='md'  bg='white'  borderColor='gray.400'  mx='auto'  gt;  lt;FormControl id='product' isRequiredgt;  lt;FormLabelgt;Product Namelt;/FormLabelgt;  lt;Input type='text' /gt;  lt;FormLabelgt;Categorylt;/FormLabelgt;   lt;Selectgt;  lt;optiongt;United Arab Emirateslt;/optiongt;  lt;optiongt;Nigerialt;/optiongt;  lt;/Selectgt;  lt;FormLabelgt;Sub-categorylt;/FormLabelgt;  lt;Selectgt;  lt;optiongt;United Arab Emirateslt;/optiongt;  lt;optiongt;Nigerialt;/optiongt;  lt;/Selectgt;  lt;FormLabelgt;Descriptionlt;/FormLabelgt;  lt;Input type='text' /gt;  lt;FormLabelgt;Imagelt;/FormLabelgt;  lt;Input type='text' /gt;  lt;FormLabelgt;Regular Pricelt;/FormLabelgt;  lt;Input type='number' /gt;  lt;FormLabelgt;Sell Pricelt;/FormLabelgt;  lt;Input type='number' /gt;  lt;FormLabelgt;Stock Quantitylt;/FormLabelgt;  lt;NumberInput max={5} min={1}gt;  lt;NumberInputField /gt;  lt;NumberInputSteppergt;  lt;NumberIncrementStepper /gt;  lt;NumberDecrementStepper /gt;  lt;/NumberInputSteppergt;  lt;/NumberInputgt;  lt;/FormControlgt;  lt;/Boxgt;  lt;/Boxgt;  ); }  

Ответ №1:

Используйте useState() крючок для отслеживания значения родительского выбора. Для ребенка выберите просто найти родителя по какому-либо уникальному ключу (в вашем случае » id » или «slug») и сопоставьте «дочерние категории» найденного объекта в качестве тега опции.

Ваши ключи JSON также несовместимы, так что исправьте это.

Ваш код должен выглядеть следующим образом:

 export default function Example() {  const [parent, setParent] = useState("");   return (  lt;divgt;  {/* parent */}  lt;select value={parent} onChange={(e) =gt; setParent(e.target.value)}gt;  lt;option value=""gt;lt;/optiongt;  {categories.map((category) =gt; (  lt;option value={category.id}gt;{category.name}lt;/optiongt;  ))}  lt;/selectgt;  {/* child */}  lt;selectgt;  lt;option value=""gt;lt;/optiongt;  {categories  .find((x) =gt; x.id === parent)  ?.child_categories?.map((category) =gt; (  lt;option value={category.id}gt;{category.name}lt;/optiongt;  ))}  lt;/selectgt;  lt;/divgt;  ); }