【问题标题】:How to scroll to index in infinite list with react-virtualized如何使用反应虚拟化滚动到无限列表中的索引
【发布时间】:2017-04-28 13:48:42
【问题描述】:

我有一个无限列表(使用来自很棒的 react-virtualized 库的组件 InfiniteLoaderList)。我想滚动到特定行以响应用户生成的事件。

这是我的代码:

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 认为这是滚动到行索引的正确方法。

感谢您的帮助。

【问题讨论】:

  • 不应该是 this.refs.list.scrollToRow() 吗?
  • @Chase,当你向 ref 属性提供字符串时,确实是正确的方法,但这里我提供了一个函数。在调用componentDidMount 之前调用此函数。我用它来定义this.list

标签: reactjs react-virtualized


【解决方案1】:

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

【讨论】:

  • 如果我想回滚到同一周怎么办?假设我有一个滚动到当前日期的按钮。用户可以在任何地方滚动,然后点击按钮,调用scroll_to_week。 scrollToRow 没有改变,所以 List 不会更新。还是每次都更新?在这种情况下,用户将无法滚动离开作为 scrollToRow 给出的行。我真的相信,如果它是一个 prop,你就不可能有一致的行为,因为组件不能始终是其 props 的反射。
  • RV 使用“纯”组件,因此如果道具不改变,它们不会重新渲染。这是滚动到索引的纯 props 方法的限制。目前最好的解决方法是将该道具设置为undefined,以便它发生变化。
  • 我们应该为此创建一个问题吗?如果您愿意,我可以为此提出拉取请求。
  • 我在几个版本前有意删除了scrollToCell 类型的API 方法。理想情况下,React 组件应该通过 props 来控制。 API 方法 require 引用,相比之下使用起来有点尴尬。除了我之前提到的问题之外,我也不喜欢支持多种方式来做一件事(因为它使维护更加复杂)。我看到你的要求已经通过了。我不确定我是否会接受。需要考虑一下。
  • 我已经更新了我的问题来继续这个对话:github.com/bvaughn/react-virtualized/issues/511。此外,如果您不打算更改 API,请至少更正文档(我在问题中提供的链接)
猜你喜欢
  • 2017-02-16
  • 2018-01-03
  • 1970-01-01
  • 2018-04-28
  • 1970-01-01
  • 2018-01-18
  • 2018-06-02
  • 2022-08-05
  • 1970-01-01
相关资源
最近更新 更多