#javascript #arrays #reactjs #redux #parent-child
#javascript #массивы #reactjs #redux #родитель-потомок
Вопрос:
В родительском компоненте manage-categories.jsx
у меня объявлен массив categoryTypes
const categoryTypes = [
{ name: "category", values: props.categories, active: true },
{ name: "type", values: props.types },
{ name: "finish", values: props.finishes },
{ name: "profile", values: props.profiles },
{ name: "thickness", values: props.thicknesses },
{ name: "ral", values: props.rals },
];
и функция selectItem
, которая вызывается в дочернем компоненте category-types-card.jsx
const selectItem = (item, category) => {
switch (category.name) {
case "category":
setSelectedCategoryItem(item);
break;
case "type":
setSelectedTypeItem(item);
break;
case "finish":
setSelectedFinishItem(item);
break;
case "profile":
setSelectedProfileItem(item);
break;
case "thickness":
setSelectedThicknessItem(item);
break;
case "ral":
setSelectedRalItem(item);
}
};
В дочернем компоненте мне нужно показать что-то для категорий, у active: true
которых категория становится активной, когда у нее есть SelectedItem.
Я попытался сделать его активным, как categoryTypes[1] = { ...categoryTypes[1], active: true };
в приведенном выше переключателе, но в дочернем компоненте активное свойство не изменяется для определенной категории.
Вызов дочернего компонента:
<Row className="mb-4">
{categoryTypes.map((category, index) => {
return (
<Colxx
xxs="12"
xs="6"
sm="6"
md="6"
lg="4"
xl="4"
xxl="4"
key={index}
>
<CategoryTypes
category={category}
employee={employee}
selectItem={selectItem}
selectedCategoryItem={selectedCategoryItem}
selectedTypeItem={selectedTypeItem}
selectedFinishItem={selectedFinishItem}
selectedProfileItem={selectedProfileItem}
selectedThicknessItem={selectedThicknessItem}
selectedRalItem={selectedRalItem}
/>
</Colxx>
);
})}
</Row>
Как мне правильно справиться с этой ситуацией?
Заранее спасибо!
Комментарии:
1. Вы должны иметь
active
свойство внутриprops.categories
2. Я попробовал сейчас, но это не сработало
3. @simpller Не могли бы вы, пожалуйста, опубликовать еще немного кода? По крайней мере, покажите, как вы визуализируете дочерний компонент и передаете ему реквизит.
Ответ №1:
Как насчет передачи обратного вызова дочернему компоненту? Вот так:
const ManageCategories = (props) => {
const [categoryTypes, setCategoryTypes] = useState([
{ name: "category", values: props.categories, active: true },
{ name: "type", values: props.types },
{ name: "finish", values: props.finishes },
{ name: "profile", values: props.profiles },
{ name: "thickness", values: props.thicknesses },
{ name: "ral", values: props.rals },
])
const setCategoryTypeActive = (categoryName, active) => {
setCategoryTypes((categoryTypes) =>
categoryTypes.map((categoryType) =>
categoryType.name === categoryName
? { ...categoryType, active }
: categoryType
)
)
}
return (
<Row className="mb-4">
{categoryTypes.map((category, index) => (
<Colxx xxs="12" xs="6" sm="6" md="6" lg="4" xl="4" xxl="4" key={index}>
<CategoryTypes
category={category}
employee={employee}
selectItem={selectItem}
selectedCategoryItem={selectedCategoryItem}
selectedTypeItem={selectedTypeItem}
selectedFinishItem={selectedFinishItem}
selectedProfileItem={selectedProfileItem}
selectedThicknessItem={selectedThicknessItem}
selectedRalItem={selectedRalItem}
setCategoryTypeActive={setCategoryTypeActive}
/>
</Colxx>
))}
</Row>
)
}
Затем, где-нибудь в вашем дочернем компоненте, например:
const CategoryTypesCard = (props) => {
props.setCategoryTypeActive("finish", true)
// ...
}