遇到两个孩子用同一把钥匙

时间:2017-02-19 19:45:13

标签: javascript reactjs redux

我真的很想做出反应和减少开发。我有一个连接到容器的列表组件。我想在滚动时更新列表,但我得到:

Encountered two children with the same key

我的组件:

import React, { Component, PropTypes } from 'react'
import Track from './Track'
import styles from './TrackList.css'

const altImg = require('../images/sc.jpg');

export default class TrackList extends Component  {

  static propTypes = {
    tracks: PropTypes.arrayOf(PropTypes.shape({
    id: PropTypes.number.isRequired
      }).isRequired).isRequired,
    onTrackListScroll: PropTypes.func.isRequired
  }

 render() {
    const { tracks, onTrackListScroll } = this.props;
    return (
      <div>
      <ul className='tracks'
        onScroll={(e)=>{
          console.log('SCROLL!!',e)
          onTrackListScroll()
        }}>
        {tracks.map(track =>
          <Track
            key={track.id}
            {...track}
            //onClick={() => onTrackClick(track.id)}
            text={track.title}
            imgSrc={!track.artwork_url ? altImg : track.artwork_url}
          />
        )}
      </ul>
      </div>
    )

  }
}

更新状态的reducer是:

const toSearchResultOb = (tracks) => {
  return  {
    tracks: tracks
  }
}


case 'UPDATE_SEARCH_RESULT':
      return Object.assign({}, state, 
toSearchResultOb(state.tracks.concat(action.tracks)))

使用redux更新组件onScroll的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

您收到此错误,因为组件兄弟之间的键必须是唯一的。您的track.id数组中可能有重复的tracks

这是一个简单的解决方法:

{tracks.map(track, i =>
  <Track
    key={i}
    {...track}
    //onClick={() => onTrackClick(track.id)}
    text={track.title}
    imgSrc={!track.artwork_url ? altImg : track.artwork_url}
  />
)}

如果您查看MDNmap()的文档,您会看到:

  

callback生成新数组元素的函数   三个论点:

     
      
  • currentValue正在处理的当前元素   数组。

  •   
  • index正在处理的当前元素的索引   数组。

  •   

因此,在上面的示例中,i是当前元素的索引。此索引在每次迭代时递增,这保证了map()内的唯一键。现在你不必担心track.id是什么。

相关问题