Code Monkey home page Code Monkey logo

react-virtual's Introduction

React Virtual Header

Hooks for virtualizing scrollable elements in React

#TanStack semantic-release Join the discussion on Github

Enjoy this library? Try them all! React Table, React Query, React Form, React Charts

Quick Features

  • Row, Column, and Grid virtualization
  • One single headless hook
  • Fixed, variable and dynamic measurement modes
  • Imperative scrollTo control for offset, indices and alignment
  • Custom scrolling function support (eg. smooth scroll)

Examples

Sponsors

This library is being built and maintained by me, @tannerlinsley and I am always in need of more support to keep projects like this afloat. If you would like to get premium support, add your logo or name on this README, or simply just contribute to my open source Sponsorship goal, visit my Github Sponsors page!

Diamond Sponsors

Get Your Logo Here!

Diamond Sponsors

Get Your Logo Here!

Diamond Sponsors

Diamond Sponsors

Get Your Logo Here!

Diamond Sponsors

Get Your Name Here!

Diamond Sponsors

Get Your Name Here!

Documentation

Installation

$ npm i --save react-virtual
# or
$ yarn add react-virtual

Why?

React Virtual's most distinguishing feature is that it's just one single custom hook instead of a set of components. In more trendy terms, this means that it is "headless", allowing you to control 100% all of the markup and styles, exactly how you want.

React Virtual supplies you with primitive utilities that allow you to build any range of virtualized experiences. One testament to this is that you can combine 2 instances of useVirtual onto the same markup to achieve a virtualized grid, where with other utilites, you would need to use a dedicated Grid-like component.

Sample

This is just a quick sample of what it looks like to use React Virtual. Please refer to the examples for more usage patterns.

function RowVirtualizerFixed() {
  const parentRef = React.useRef()

  const rowVirtualizer = useVirtual({
    size: 10000,
    parentRef,
    estimateSize: React.useCallback(() => 35, []),
  })

  return (
    <>
      <div
        ref={parentRef}
        className="List"
        style={{
          height: `150px`,
          width: `300px`,
          overflow: 'auto',
        }}
      >
        <div
          className="ListInner"
          style={{
            height: `${rowVirtualizer.totalSize}px`,
            width: '100%',
            position: 'relative',
          }}
        >
          {rowVirtualizer.virtualItems.map(virtualRow => (
            <div
              key={virtualRow.index}
              className={virtualRow.index % 2 ? 'ListItemOdd' : 'ListItemEven'}
              style={{
                position: 'absolute',
                top: 0,
                left: 0,
                width: '100%',
                height: `${virtualRow.size}px`,
                transform: `translateY(${virtualRow.start}px)`,
              }}
            >
              Row {virtualRow.index}
            </div>
          ))}
        </div>
      </div>
    </>
  )
}

API

useVirtual

const {
  virtualItems: [
    { index, start, size, end, measureRef },
    /* ... */
  ],
  totalSize,
  scrollToIndex,
  scrollToOffset,
} = useVirtual({
  size,
  parentRef,
  estimateSize,
  overscan,
  horizontal,
  scrollToFn,
  useObserver,
})

Options

  • size: Integer
    • Required
    • The size of the virtualizer
  • parentRef: React.useRef(DOMElement)
    • Required
    • The parent element whose inner-content is scrollable
  • estimateSize: Function(index) => Integer
    • Required
    • Must be memoized using React.useCallback()
    • This function receives the index of each item and should return either:
      • A fixed size
      • A variable size per-item
      • A best-guess size (when using dynamic measurement rendering)
    • When this function's memoization changes, the entire list is recalculated
  • overscan: Integer
    • Defaults to 1
    • The amount of items to load both behind and ahead of the current window range
  • horizontal: Boolean
    • Defaults to false
    • When true, this virtualizer will use width and scrollLeft instead of height and scrollTop to determine size and offset of virtualized items.
  • scrollToFn: Function(offset, defaultScrollToFn) => void 0
    • Optional
    • This function, if passed, is responsible for implementing the scrollTo log for the parentRef which is used when methods like scrolllToOffset and scrollToIndex are called.
    • Eg. You can use this function implement smooth scrolling by using the supplied offset and the defaultScrollToFn as seen in the sandbox's Smooth Scroll example.
  • useObserver: Function(parentRef) => ({ width: number; height: number })
  • paddingStart: Integer
    • Defaults to 0
    • The amount of padding in pixels to add to the start of the virtual list
  • paddingEnd: Integer
    • Defaults to 0
    • The amount of padding in pixels to add to the end of the virtual list

Returns

  • virtualItems: Array<item>
    • item: Object
      • index: Integer
        • The index of the item
      • start: Integer
        • The starting measurement of the item
        • Most commonly used for positioning elements
      • size: Integer
        • The static/variable or, if dynamically rendered, the measured size of the item
      • end: Integer
        • The ending measurement of the item
      • measureRef: React.useRef | Function(el: DOMElement) => void 0
        • The ref/function to place on the rendered element to enable dynamic measurement rendering
  • totalSize: Integer
    • The total size of the entire virtualizer
    • When using dynamic measurement refs, this number may change as items are measured after they are rendered.
  • scrollToIndex: Function(index: Integer, { align: String }) => void 0
    • Call this function to scroll the top/left of the parentRef element to the start of the item located at the passed index.
    • align: 'start' | 'center' | 'end' | 'auto'
      • Defaults to auto
      • start places the item at the top/left of the visible scroll area
      • center places the item in the center of the visible scroll area
      • end places the item at the bottom/right of the visible scroll area
      • auto brings the item into the visible scroll area either at the start or end, depending on which is closer. If the item is already in view, it is placed at the top/left of the visible scroll area.
  • scrollToOffset: Function(offsetInPixels: Integer, { align: String }) => void 0
    • Call this function to scroll the top/left of the parentRef element to the passed pixel offset.
    • align: 'start' | 'center' | 'end' | 'auto'
      • Defaults to start
      • start places the offset at the top/left of the visible scroll area
      • center places the offset in the center of the visible scroll area
      • end places the offset at the bottom/right of the visible scroll area
      • auto brings the offset into the visible scroll area either at the start or end, depending on which is closer. If the offset is already in view, it is placed at the top/left of the visible scroll area.

Contributors ✨

Thanks goes to these wonderful people (emoji key):


Tanner Linsley

💻 🤔 💡 🚧 👀

This project follows the all-contributors specification. Contributions of any kind welcome!

react-virtual's People

Contributors

4shub avatar adbayb avatar crubier avatar hampuskraft avatar johnnyreilly avatar kentcdodds avatar lukas742 avatar mogelbrod avatar nstfkc avatar o-alexandrov avatar oskarhane avatar shastri9999 avatar shotmk avatar siemko avatar tannerlinsley avatar wellyshen avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.