2017-03-27 15 views
0

私は自分のプロジェクトに反応仮想化を実装しようとしています。私は細分のリストを持つサイドパネルを持っています。ユーザーがアイテムを選択したときに、アコーディオンのような機能を持っていたいと思います。ページが最初に読み込まれると、正しく動作しているように見えます。動的リストの高さでreact-virtualizedを使用する方法

screenshot

は、しかし、私はリストを下にスクロールを開始したとき、この

screenshot2

のように見え、ここにコード

const mapStateToProps = state => ({ 
    windowHeight: state.dimensions.windowHeight, 
    sbds: new Immutable.List(state.sbds.data), 
    sbd: state.sbd.data 
}) 

@connect(mapStateToProps) 
export default class SBD extends Component { 
    static propTypes = { 
    windowHeight: PropTypes.number, 
    sbds: PropTypes.instanceOf(Immutable.List), 
    sbd: PropTypes.object 
    } 

    constructor(props) { 
    super(props) 
    this.state = { 
     listHeight: props.windowHeight - 250, 
     listRowHeight: 60, 
     overscanRowCount: 10, 
     rowCount: props.sbds.size, 
     scrollToIndex: undefined, 
     collapse: true 
    } 
    } 

    componentWillUnmount() { 
    } 

    shouldComponentUpdate(nextProps, nextState) { 
    const {sbds} = this.props 
    if (shallowCompare(this, nextProps, nextState)) 
     return true 
    else return stringify(sbds) !== stringify(nextProps.sbds) 
    } 

    _handleSelectRow = selected => { 
    sbdRequest(selected) 
    const obj = {[selected.id]: true} 
    this.setState(obj) 
    } 

    render() { 
    const { 
     listHeight, 
     listRowHeight, 
     overscanRowCount, 
     rowCount, 
     scrollToIndex 
    } = this.state 

    return (
     <div> 
     <SearchGroup /> 
     <Card className='border-0 mt-10 mb-0'> 
      <CardBlock className='p-0'> 
      <AutoSizer disableHeight> 
       {({width}) => (
       <List 
        ref='List' 
        className='' 
        height={listHeight} 
        overscanRowCount={overscanRowCount} 
        rowCount={rowCount} 
        rowHeight={listRowHeight} 
        rowRenderer={this._rowRenderer} 
        scrollToIndex={scrollToIndex} 
        width={width} 
       /> 
      )} 
      </AutoSizer> 
      </CardBlock> 
     </Card> 
     </div> 
    ) 
    } 

    _getDatum = index => { 
    const {sbds} = this.props 
    return sbds.get(index % sbds.size) 
    } 

    _rowRenderer = ({index}) => { 
    const {sbd} = this.props 
    const datum = this._getDatum(index) 
    return (
     <span key={datum.id}> 
     <Button 
      type='button' 
      color='link' 
      block 
      onClick={() => this._handleSelectRow(datum)}> 
      {datum.name} 
     </Button> 
     <Collapse isOpen={this.state[datum.id]}> 
      <Card> 
      <CardBlock> 
      FOO BAR 
      </CardBlock> 
      </Card> 
     </Collapse> 
     </span> 
    ) 
    } 
} 

答えて

1

であるあなたは(styleパラメータを設定していませんあなたのrowRendererに渡されました)。これは絶対に行を配置するものです。それがなければ、スクロールするときにすべて上/左に積み重ねられます。

https://bvaughn.github.io/forward-js-2017/#/32/1

関連する問題