Если вы хотите использовать свойство name
в качестве пути к каждому элементу, то упомянутый вами метод сопоставления (поиска / поиска), на мой взгляд, вероятно, является наилучшим вариантом.Поскольку name
ниже на один уровень для каждого элемента, мы должны найти все наши элементы на соответствие match.params.id
onClick
, чтобы отобразить компонент <Detail/>
s с правильными данными элемента.
Но, если вы открыты для этого, я бы предложил вам использовать ключ верхнего уровня каждого элемента (т. Е. 001
, 002
, 003
) в качестве реквизита to
для вашего сопоставленного <Link/>
компоненты.Таким образом, мы все еще можем достичь O (1), используя этот метод в сочетании с опорой render
для вашего <Route/>
, который обрабатывает рендеринг компонента <Detail/>
с данными выбранного элемента.Мы по-прежнему будем выполнять поиск, используя match.params.id
, но нам нужно будет только взглянуть на верхний уровень items
, чтобы найти правильный элемент и успешно установить правильный цвет фона.
Кодвопрос ниже и ответвление вашего CodeSandbox: https://codesandbox.io/s/xl8von46nw?fontsize=14
/**** Setting each to prop equal to the top-level id for each item ****/
<ul>
{Object.keys(items).map(id => (
<li key={id}>
<Link to={id}>item {items[id].name}</Link>
</li>
))}
</ul>
/**** I used connect() in routes.js to access items ****/
<Route
path="/:id"
render={({ match }) => (
<Detail
item={items[match.params.id]}
/>
)}
/>
Надеюсь, что это поможет или является приемлемым решением!