Узнав о нормализации данных с помощью реакции/редукции, я поместил свои списки в объекты с ключами, являющимися идентификаторами, и значениями, являющимися элементами списка. Это выглядит примерно так:

list = {
  5: {
    name: "Bob",
    id: 5
  },
  3: {
    name: "Natalie",
    id: 3
  },
x`  14: {
    name: "Ian",
    id: 14
  }
}

По сути, это делало мою жизнь намного проще, чем работа с массивами, когда дело доходило до доступа к определенным элементам в моем списке. Позиция не имела значения, только id. Однако у меня возникла проблема с моими реагирующими компонентами и получением правильной информации в нужном месте.

Делаю фотогалерею. У меня есть страницы GalleryContainer (GC) и GalleryShow (GS). GC рендерит GS (реакция 101). В galleryReducer у меня list: {}, activeGallery: 0 . Я планирую использовать list[activeGallery] для доступа к нужной мне галерее.

Вот основная идея (псевдокод):

--galleryReducer.js--
  state = {list: {}, activeGallery: 0}
--GalleryContainer-- // '/galleries'
{
  return(
    <div>
      <Route exact path='/galleries' render={props =>
        <GalleryList //has function that alters url & activeGallery
          galleries={this.props.galleries}
        />
      }/>
      <Route exact path='/galleries/:id' render={props =>
        <GalleryShow
          gallery={this.props.galleries[this.props.activeGallery]}
        />
      }/>
    </div>
  )
  
  componentDidMount = () => {
    this.props.fetchGalleries()
  }
}
--GalleryShow--
{
  return(
    <div>
      {this.props.gallery.name}
    </div>
  )
  componentDidMount = () => {
    this.props.fetchPhotos(gallery.id)
  }
}

Можете ли вы определить проблему? Я имею в виду, что это может быть непросто с псевдокодом, поэтому я просто скажу вам. Нет проблем, если пользователь переходит в контейнер галереи, нажимает на галерею и отправляется на страницу GS. Выполняется вызов извлечения, и фотографии добавляются на страницу. Ура! Однако проблема в том, что если кто-то перейдет прямо по URL-адресу галереи, он нарушит код.

Список галерей не извлекается из серверной части до тех пор, пока componentDidMount не вызовет его из GC. К сожалению, GS уже пытался получить фотографии, используя идентификатор галереи. Которого, как известно, еще нет. Я мог бы просто заставить пользователя перейти по ссылке «/galleries», и мы все были бы счастливы. Однако я не думаю, что U-eX будет очень плавным.

Я обошел проблему, используя магию componentWillReceiveProps и внедрив быструю проверку логики в cDM в компоненте GS. Сначала я проверяю, есть ли галерея, если нет, устанавливаю ее, если есть, загружаю фотографии. И все счастливы. В основном.

componentWillReceiveProps = nextProps => {
    if(!this.props.gallery && nextProps.gallery){
      this.fetchPhotos(nextProps.gallery.name)
    }
  }