2016-12-13 3 views
0

У меня есть бесконечный список (с использованием компонентов InfiniteLoader и List из библиотеки awesome react-virtualized). Я хочу прокрутить до определенной строки, чтобы ответить на событие, созданное пользователем.Как прокрутить до индекса в бесконечном списке с помощью virtual-virtualized

Это мой код:

class Weeks extends Component { 
    constructor(props) { 
    super(props) 
    this.state = { 
     week_count: 10, 
    } 
    auto_bind(this) 
    } 

    is_week_loaded(week) { 
    return week < this.state.week_count 
    } 

    load_more_weeks() { 
    this.setState({week_count: this.state.week_count + 1}) 
    } 

    scroll_to_week(week) { 
    if (this.state.week_count <= week) { 
     this.setState({week_count: week + 1}) 
    } 
    this.list.scrollToRow(week) 
    } 

    render_week({key, index, style}) { 
    return (
     <div key={key} style={style}> 
     <Week week={index}/> 
     </div> 
    ) 
    } 

    render() { 
    return (
     <AutoSizer> 
     {({height, width}) => (
      <InfiniteLoader 
      isRowLoaded={this.is_week_loaded} 
      loadMoreRows={this.load_more_weeks} 
      rowCount={this.state.week_count + 1} 
      > 
      {({onRowsRendered, registerChild}) => (
       <List 
       height={height} 
       width={width} 
       onRowsRendered={onRowsRendered} 
       ref={(list) => { 
        this.list = list 
        registerChild(list) 
       }} 
       rowCount={this.state.week_count} 
       rowHeight={row_height} 
       rowRenderer={this.render_week} 
       /> 
      )} 
      </InfiniteLoader> 
     )} 
     </AutoSizer> 
    ) 
    } 
} 

Однако, я получаю следующее сообщение об ошибке:

Uncaught TypeError: this.list.scrollToRow is not a function 

, когда я вызываю метод scroll_to_week.

Я подумал из документации https://github.com/bvaughn/react-virtualized/blob/master/docs/reverseList.md, что это был правильный способ прокрутки до индекса строки.

Благодарим за помощь.

+0

не должна быть this.refs.list.scrollToRow()? – Chase

+0

@Chase, когда вы предоставляете строку ref ref, это действительно правильный способ, но здесь я предоставляю функцию. Эта функция вызывается до вызова 'componentDidMount'. Я использовал его для определения 'this.list'. –

ответ

2

scrollToRow является опорой, а не функцией. =)

Попробуйте это:

class Weeks extends Component { 
    constructor(props) { 
    super(props) 
    this.state = { 
     week_count: 10, 
    } 
    auto_bind(this) 
    } 

    is_week_loaded(week) { 
    return week < this.state.week_count 
    } 

    load_more_weeks() { 
    this.setState({week_count: this.state.week_count + 1}) 
    } 

    scroll_to_week(week) { 
    if (this.state.week_count <= week) { 
     this.setState({ 
     scroll_to_week: week, 
     week_count: week + 1 
     }) 
    } 
    } 

    render_week({key, index, style}) { 
    return (
     <div key={key} style={style}> 
     <Week week={index}/> 
     </div> 
    ) 
    } 

    render() { 
    return (
     <AutoSizer> 
     {({height, width}) => (
      <InfiniteLoader 
      isRowLoaded={this.is_week_loaded} 
      loadMoreRows={this.load_more_weeks} 
      rowCount={this.state.week_count + 1} 
      > 
      {({onRowsRendered, registerChild}) => (
       <List 
       height={height} 
       width={width} 
       onRowsRendered={onRowsRendered} 
       ref={(list) => { 
        registerChild(list) 
       }} 
       rowCount={this.state.week_count} 
       rowHeight={row_height} 
       rowRenderer={this.render_week} 
       scrollToRow={this.state.scroll_to_week} 
       /> 
      )} 
      </InfiniteLoader> 
     )} 
     </AutoSizer> 
    ) 
    } 
} 
+0

Как насчет того, хочу ли я вернуться к той же неделе? Скажем, у меня есть кнопка, которая прокручивается до текущего дня. Пользователь может прокручивать в любом месте, а затем нажать кнопку, которая вызывает scroll_to_week. scrollToRow не изменяется, поэтому List не будет обновляться. Или он обновляется каждый раз? в этом случае пользователю будет невозможно прокручиваться от строки, указанной как scrollToRow. Я действительно верю, что вы не можете иметь последовательное поведение, если оно является опорой, потому что компонент не может быть отражением его реквизита во все времена. –

+0

RV использует «чистые» компоненты, поэтому они не будут повторно отображаться, если реквизит не изменится. Это ограничение подхода чистого реквизита для прокрутки к индексу. Лучшая текущая работа заключается в том, чтобы установить эту опору для 'undefined' между ними, чтобы она изменилась. – brianvaughn

+0

Должны ли мы создать проблему для этого? Я могу сделать запрос Pull, если вы захотите. –