Похоже, вам вообще не нужно жестко кодировать список категорий.В вашем componentDidMount()
извлеките json и сгруппируйте результаты в отдельные категории, например:
const json = {
"results": [
{
category: "category1",
name: "Fred"
},
{
category: "category1",
name: "Teddy"
},
{
category: "category2",
name: "Gilbert"
},
{
category: "category3",
name: "Foxy"
},
]
}
const grouped = json.results.reduce((acc, cur) => {
if (!acc.hasOwnProperty(cur.category)) {
acc[cur.category] = []
}
acc[cur.category].push(cur)
return acc;
}, { })
// parent object now has 3 properties, namely category1, category2 and category3
console.log(JSON.stringify(grouped, null, 4))
// each of these properties is an array of bjects of same category
console.log(JSON.stringify(grouped.category1, null, 4))
console.log(JSON.stringify(grouped.category2, null, 4))
console.log(JSON.stringify(grouped.category3, null, 4))
Обратите внимание, что этот json имеет 4 объекта в массиве результатов, 2 из cat1 и 1 из cat 2 и cat3.Вы можете запустить этот код в отдельном файле, чтобы увидеть, как он работает.Конечно, вы будете получать объект json с сервера.Я просто установил его для демонстрации.
Затем установите состояние: this.setState({ grouped })
Затем в render()
вы показываете только те категории, которые имеют такие элементы, как:
const menuBarButtons = Object.keys(this.state.grouped).map((category) => {
/* your jsx here */
return <MenuItem text={category} key={category} onClick={this.onClick} blah={blah}/>
/* or something , it's up to you */
})
Я предполагаю, что вы показываете предметы, основанные на выбранной в данный момент категории this.state.selected
.Поэтому после того, как вы отобразили свое меню, вы должны сделать что-то вроде:
const selectedCatItems = this.state.grouped[this.state.selected].map((item) => {
return <YourItem name={item.name} key={item.id} blah={blah} />
})
Затем отобразить его:
return (
<div className="app">
<MenuBar blah={blah}>
{menuBarButtons}
</Menubar>
<div for your item showing area>
{selectedCatItems}
</div>
</div>
)
Кроме того, не забудьте изменить onClick()
так, чтобыон устанавливает this.state.selected
состояние правильно.Я полагаю, что вы сами в этом разберетесь.
Надеюсь, это поможет.
PS: Я не написал целое решение для копирования / вставки вашей проблемы просто потому, что неохотно читаю ипонять детали вашего пользовательского интерфейса и весь компонент для передачи данных компонента.