We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
最近在研究react的性能相关的问题,就学习了一下react-virtualized, 也顺便看了一下react-tiny-virtual-list的源码。然后根据自己的理解,大致实现了一个简单版的。
他的大致流程如下:
const wrapperStyle = {...STYLE_WRAPPER, height: height + "px"}; const innerHeight = itemSize * itemCount, innerStyle = {...STYLE_INNER, height: innerHeight + "px"}; return ( <div ref={this.rootNode} style={wrapperStyle}> <div style={innerStyle}> {items} </div> </div> )
这是展示区域的样式,这里已经确定了每一个item的高度和可视区域的高度来实现的。
这里只做了一个简单的例子,用来计算当滚动的时候,该显示的数据。
这里需要注意的是,当endIndex > lastIndex的时候,说明滚动条已经到底了,那么当endIndex 就该等于lastIndex。 而且在滚动的过程中,加了overscanCount,这是为了有所缓存,不至于滚动的时候,页面有所卡顿。
componentDidMount(){ this.rootNode.current.addEventListener('scroll', this.handleScroll); } handleScroll = () => { const rootNode = this.rootNode.current, {showCount, overscanCount, lastIndex} = this, {itemSize} = this.props, scrollTop = rootNode.scrollTop, startIndex = parseInt(scrollTop/itemSize) + 1; let endIndex = startIndex + showCount + overscanCount; if(startIndex + showCount > lastIndex){ endIndex = lastIndex; } this.setState({ startIndex: startIndex, endIndex: endIndex }) }
性能优化点
handleScroll = () => { if(!this.ticking){ requestAnimationFrame(this.caculateStartAndEndIndex); this.ticking = true; } }
getStyle(index){ const style = this.styleCache[index], {itemSize} = this.props; if(style){ return style; } return this.styleCache[index] = {...STYLE_ITEM, top: index*itemSize + "px", left: 0, height: itemSize+"px"} }
The text was updated successfully, but these errors were encountered:
No branches or pull requests
最近在研究react的性能相关的问题,就学习了一下react-virtualized, 也顺便看了一下react-tiny-virtual-list的源码。然后根据自己的理解,大致实现了一个简单版的。
他的大致流程如下:
这里有两种实现方式:
确定一些元素的大小
这是展示区域的样式,这里已经确定了每一个item的高度和可视区域的高度来实现的。
滚动计算展示的
这里只做了一个简单的例子,用来计算当滚动的时候,该显示的数据。
这里需要注意的是,当endIndex > lastIndex的时候,说明滚动条已经到底了,那么当endIndex 就该等于lastIndex。
而且在滚动的过程中,加了overscanCount,这是为了有所缓存,不至于滚动的时候,页面有所卡顿。
性能优化点
The text was updated successfully, but these errors were encountered: