Итерация через ключи неизменяемой карты в реале

Какова хорошая практика для обработки итерации через объект Immutable.js Map? Это работает:

{stocks.map((stock,key)=>{
    return ( <h3>{key}</h3> )
})}

но выдает предупреждение в консоли warning.js: 45 Предупреждение: использование карт в качестве дочерних объектов еще не полностью поддерживается. Это экспериментальная функция, которая может быть удалена. Вместо этого преобразуйте ее в последовательность/итерабельность с помощью клавишных ReactElements. "

Это обсуждалось ранее, и эта ссылка предлагает некоторые стратегии https://github.com/facebook/immutable-js/issues/667, но они кажутся неуклюжими для меня. Как:

posts.entrySeq().map(o => 
     <Post value={o[1]} key={o[0]} />
)

работает, но неуклюжие чувства. Есть ли более естественный способ сделать это?

Ответ 1

Поскольку вы задали этот вопрос, было найдено лучшее решение по проблеме github, с которой вы ссылаетесь. @vinnymac предлагает:

posts.entrySeq().map( ([key, value]) => 
  <Post key={key} value={value} />
)

это хорошо работает, потому что entrySeq() возвращает последовательность цепочек ключей/значений, которые затем можно разрушить в параметрах обратного вызова .map().

edit Теперь я вижу, что вы только запрашиваете ключи. В этом случае используйте keySeq(), если вы хотите использовать ImmutableJS map() или keys(), если вы хотите использовать ES6 map()

Ответ 2

Почему бы не stock.keys()? Поскольку он возвращает итератор ES6, вам нужно отдать его в массив, чтобы он работал в более старых версиях JS: Array.from(stock.keys())

let zoo = Immutable.fromJS({ 'dog': 1, 'cat': 2 })

zoo.keys().map((name, index) => <Animal name={ name } key={ index } />)

Обратите внимание, что я избегал key в качестве переменной, а затем передал значение index как key для дочернего компонента, это потому, что реакция требует ссылок на динамически созданные компоненты, чтобы он мог корректно обрабатывать их в своем VirtualDOM. Подробнее о React Динамические дети.

Ответ 3

Использование метода Immutable Map Reduce - более прямой подход. Так как реагирует на массив, поэтому установка начального значения пустого массива и вставка в него jsx решает проблему. Работает и для неизменного списка.

{
   stocks.reduce((jsxArray, stock, index) => {
      jsxArray.push(
        <h3 key={index}>{index}</h3>,
      )
      return jsxArray;
   }, [])
}