2016-12-13 1 views
0

나는 react-virtualized 라이브러리의 구성 요소 InfiniteLoaderList을 사용하여 무한한 목록을 가지고 있습니다. 사용자가 생성 한 이벤트에 응답하기 위해 특정 행으로 스크롤하고 싶습니다. 나는 scroll_to_week 메소드를 호출반응 가상화로 무한 목록에서 색인으로 스크롤하는 방법

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

:

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> 
    ) 
    } 
} 

는 그러나, 나는 다음과 같은 오류가 발생합니다 :

이 내 코드입니다.

문서에서 https://github.com/bvaughn/react-virtualized/blob/master/docs/reverseList.md은 행 인덱스로 스크롤하는 올바른 방법이라고 생각했습니다.

도움 주셔서 감사합니다.

+0

그것이 this.refs.list.scrollToRow 안()? – Chase

+0

@Chase, ref prop에 문자열을 제공하면 실제로 올바른 방법이지만 여기서는 함수를 제공하고 있습니다. 이 함수는'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는 "순수한"구성 요소를 사용하므로 소품이 변경되지 않으면 다시 렌더링하지 않습니다. 이것은 scroll-to-index에 대한 pure props 접근 방식의 한계입니다. 최선의 해결 방법은 변경 사항을 반영하기 위해 해당 소품을 중간에 '정의되지 않음'으로 설정하는 것입니다. – brianvaughn

+0

우리는 그 문제를 만들어야합니까? 네가 원하면 당겨 줄 수있어. –

관련 문제