Как управлять состоянием между маршрутизатором React и redux

#reactjs #redux #react-router

#reactjs #redux #react-маршрутизатор

Вопрос:

У меня есть данные, которые я бы извлекал из api, хранящегося как items ,

 { '001': {id: '001', name:'foo',color:'blue' }}, '002': { id: '002',name:'bar',color:'orange' }, '003': { id: '003',name:'baz',color:'pink' }}
  

который был бы добавлен в мое дерево состояний redux и определял бы, что отображается по определенному пути. Например, переход к /foo перенаправил бы пользователя на страницу с фоновым цветом соответствующего цвета, blue . У меня есть некоторый код, который я начал, пытаясь реализовать это, но не понимаю, как я буду это координировать. Я рассматривал возможность выполнения чего-то вроде running Object.keys(props.items).find(id => props.items[id].name === match.params.name) , но понял, что это не было бы супер масштабируемым решением и привело бы к потере поиска O (1), предоставляемого наличием объекта. Код находится здесь:https://codesandbox.io/s/n562wzzmkm

Ответ №1:

Если вы хотите использовать name свойство в качестве пути к каждому элементу, то упомянутый вами метод сопоставления (searching / нахождение), на мой взгляд, вероятно, является лучшим вариантом. Поскольку name каждый элемент находится на одном уровне ниже, нам приходится искать соответствие во всех наших элементах match.params.id onClick , чтобы отобразить <Detail/> компонент s с правильными данными элемента.

Но, если вы открыты для этого, я бы предложил вам использовать ключ верхнего уровня каждого элемента (т. Е. 001 , 002 , 003 ) в качестве to реквизита для ваших сопоставленных <Link/> компонентов. Таким образом, мы все еще можем достичь O (1), используя этот метод в сочетании с render prop for your <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]}
      />
    )}
  />

  

Надеюсь, это поможет или является приемлемым решением!