React-window: HTML рддрд╛рд▓рд┐рдХрд╛ рддрддреНрд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

рдХреЛ рдирд┐рд░реНрдорд┐рдд 21 рд╕рд┐рддре░ 2018  ┬╖  34рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: bvaughn/react-window

рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ? рдореИрдВ рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЗрд╕ рдмрд╛рдд рдХрд╛ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдпрд╛ рддреЛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╛ рдХрд┐ рдореИрдВ рдХреБрдЫ рдЧрд▓рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
рдореИрдВрдиреЗ "рдЯреЗрдмрд▓" рдФрд░ рдЗрдирд░рдЯреИрдЧреНрдирдиреЗрдо рдХреЛ "tbody" рдореЗрдВ рдЖрдЙрдЯрд░рдЯреЗрдЧрдиреЗрдо рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдХреЛрдИ рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ рдирд╣реАрдВ рдорд┐рд▓реАред

рдпрд╣рд╛рдБ рдореЗрд░рд╛ рдХреЛрдб рд╣реИ, рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдорджрдж рдХрд░рддрд╛ рд╣реИ (рдЖрдЗрдЯрдо рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕реВрдЪреА рд╣реИ):

 <List
            outerRef={this._list}
            outerTagName="table"
            innerTagName="tbody"
            height={300}
            itemData={items}
            itemSize={() => 30}
            itemCount={items.length}
            itemKey={item => item.uniqueId}>
            {({index, style, data}) => {
              return (
                <tr style={style} key={index}>
                  <td>Item {index}</td>
                </tr>
              );
            }}
          </List>

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

@pupudu рдореИрдВ рдЖрдкрдХреЗ рдЦреБрд▓реЗ рд╕реНрд░реЛрдд рдХреЗ рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЕрдкрдиреЗ рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреЗрдЦрд╛ рд╣реИред рдореИрдВ рдмрд╕ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рд╕реБрдкрд░ рд╕реАрдзреА рдмрд╛рдд рджреВрд╕рд░реЗ рд▓реЛрдЧ рдЦреЛрдЬ рд░рд╣реЗ рдереЗ: рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓реЗрдХрд┐рди рддрд╛рд▓рд┐рдХрд╛ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рдеред

рдмрд╛рд╣рд░ рдореБрдбрд╝рддрд╛ рд╣реИ рдореИрдВ рдХреЛрдб рдХреЗ рдПрдХ рдмрд╣реБрдд рдЫреЛрдЯреЗ рд╕реЗ, рдФрд░ рдмрд╣реБрдд рд░рдЪрдирд╛рддреНрдордХрддрд╛ рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдЦреАрдВрдЪрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред рдХреЛрдб рдЗрддрдирд╛ рд╕рд░рд▓ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдХреЛ рднреА рдХреЙрдкреА / рдкреЗрд╕реНрдЯ рдХрд░рдиреЗ рдФрд░ рдЕрдкрдиреА рдкрд╕рдВрдж рдХреЛ рдмрдврд╝рд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред @bvaughn рдХреИрд╕реЗ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдпрджрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рдмрд╣реБрдд рд╣реА рдорд╛рдореВрд▓реА рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдмрд╣реБрдд рдорд╛рдореВрд▓реА рд╣реИред

рдЗрд╕рдХреА рдХрдореА :

  • рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдХреА "рд╢реАрд░реНрд╖" рд╢реИрд▓реА рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░реЗрдВ
  • рдЙрд╕ рдореВрд▓реНрдп рдХреЛ React.Context рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░реЗрдВ рддрд╛рдХрд┐ рд╣рдо рдЗрд╕реЗ рдкрд╛рд╕ рдХрд░ рд╕рдХреЗрдВ
  • рдорд╛рди рдХреЛ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдШрдЯрдХ рдкрд░ рд▓рд╛рдЧреВ рдХрд░реЗрдВ рдЬреЛ рд╡рд╣ рд╣реЛрдЧрд╛ рдЬреЛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдмрдЬрд╛рдп рд╕реНрд╡рдпрдВ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ
  • рд╣реЗрдбрд░ рдФрд░ рдлреВрдЯрд░ рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрд▓реЙрдЯ рдЬреЛрдбрд╝реЗрдВред
  • рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдПрд░реНрдЧреЛрдиреЙрдорд┐рдХреНрд╕ рдЪреАрдЬреЛрдВ рдХреЛ рдмрдбрд╝реЗ рдХрд░реАрдиреЗ рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП React.Context рдХреНрд░реЙрд╕ рдШрдЯрдХ рд╕рдВрдЪрд╛рд░ рдХреЛ рдкрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реАрд░реЛ рд╣реИред

рд╡рд░реНрдХрд┐рдВрдЧ рдХреЛрдб рд╕реИрдВрдбрдмреЙрдХреНрд╕: https://codesandbox.io/s/react-window-with-table-elements-n8686o

рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рдХреЛрдб

import React from 'react'
import { useState, useRef, useContext } from 'react'
import { FixedSizeList, FixedSizeListProps } from 'react-window'
import { render } from 'react-dom'

/** Context for cross component communication */
const VirtualTableContext = React.createContext<{
  top: number
  setTop: (top: number) => void
  header: React.ReactNode
  footer: React.ReactNode
}>({
  top: 0,
  setTop: (value: number) => {},
  header: <></>,
  footer: <></>,
})

/** The virtual table. It basically accepts all of the same params as the original FixedSizeList.*/
function VirtualTable({
  row,
  header,
  footer,
  ...rest
}: {
  header?: React.ReactNode
  footer?: React.ReactNode
  row: FixedSizeListProps['children']
} & Omit<FixedSizeListProps, 'children' | 'innerElementType'>) {
  const listRef = useRef<FixedSizeList | null>()
  const [top, setTop] = useState(0)

  return (
    <VirtualTableContext.Provider value={{ top, setTop, header, footer }}>
      <FixedSizeList
        {...rest}
        innerElementType={Inner}
        onItemsRendered={props => {
          const style =
            listRef.current &&
            // @ts-ignore private method access
            listRef.current._getItemStyle(props.overscanStartIndex)
          setTop((style && style.top) || 0)

          // Call the original callback
          rest.onItemsRendered && rest.onItemsRendered(props)
        }}
        ref={el => (listRef.current = el)}
      >
        {row}
      </FixedSizeList>
    </VirtualTableContext.Provider>
  )
}

/** The Row component. This should be a table row, and noted that we don't use the style that regular `react-window` examples pass in.*/
function Row({ index }: { index: number }) {
  return (
    <tr>
      {/** Make sure your table rows are the same height as what you passed into the list... */}
      <td style={{ height: '36px' }}>Row {index}</td>
      <td>Col 2</td>
      <td>Col 3</td>
      <td>Col 4</td>
    </tr>
  )
}

/**
 * The Inner component of the virtual list. This is the "Magic".
 * Capture what would have been the top elements position and apply it to the table.
 * Other than that, render an optional header and footer.
 **/
const Inner = React.forwardRef<HTMLDivElement, React.HTMLProps<HTMLDivElement>>(
  function Inner({ children, ...rest }, ref) {
    const { header, footer, top } = useContext(VirtualTableContext)
    return (
      <div {...rest} ref={ref}>
        <table style={{ top, position: 'absolute', width: '100%' }}>
          {header}
          <tbody>{children}</tbody>
          {footer}
        </table>
      </div>
    )
  }
)

/**
 * Render Our Example
 **/
render(
  <VirtualTable
    height={300}
    width="100%"
    itemCount={1000}
    itemSize={36}
    header={
      <thead>
        <tr>
          <th>Index</th>
          <th>Header 2</th>
          <th>Header 3</th>
          <th>Header 4</th>
        </tr>
      </thead>
    }
    row={Row}
    footer={
      <tfoot>
        <tr>
          <td>Footer 1</td>
          <td>Footer 2</td>
          <td>Footer 3</td>
          <td>Footer 4</td>
        </tr>
      </tfoot>
    }
  />,
  document.querySelector('main')
)

рд╕рднреА 34 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдореЗрд░реА рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, HTMLTableElement рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрд╕ рддрд░рд╣ рд╕реЗ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдПрдХ рд╡рд┐рдВрдбреЛрд┐рдВрдЧ рдШрдЯрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЖрдк _could_ рд╢реИрд▓реА рдХреЛ display: block рдмрджрд▓рддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЕрднреА рднреА рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдХрд╛рдлреА рд╕рд╣реА рд╣реЛрдЧрд╛ред ( рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ ред)

рдЖрдкрдХреЛ рдЯреЗрдмрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрдирд▓рд╛рдЗрди рдмреНрд▓реЙрдХ рдпрд╛ рдлреНрд▓реЗрдХреНрд╕ рд▓реЗрдЖрдЙрдЯ рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рдХреЙрд▓рдо рд▓реЗрдЖрдЙрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрддрд┐рд░рд┐рдХреНрдд рдЪреАрдЬреЛрдВ рдХреА рдЬреЛрдбрд╝реА:

  • рдЖрдк рдПрдХ рдЖрд╡рд╢реНрдпрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ width рд╕реЗ List
  • рдЖрдкрдХреЛ рдЕрдкрдиреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ key рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ
  • itemSize 30 рдмрдЬрд╛рдп () => 30 (рдпрд╣ рдереЛрдбрд╝рд╛ рдХрдо рд╣реЛрдЧрд╛)

рддреБрд░рдВрдд рдЬрд╡рд╛рдм рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
рд╣рдо рдкрд╣рд▓реЗ рд╣реА рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд░реНрдЪрд╛ рдХрд░ рдЪреБрдХреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдпрд╣ рдПрдХ рдореМрдЬреВрджрд╛ рдирд╣реАрдВ рдмрд▓реНрдХрд┐ рдмрдбрд╝реЗ рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЙрд╕ рдкрдЯрдХрдерд╛ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗред рдореИрдВрдиреЗ рдЖрд░рд╕реА-рдЯреЗрдмрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЕрдиреНрдп рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рджреЗрдЦреАрдВ, рдЗрд╕рд▓рд┐рдП рд╕реЛрдЪрд╛ рдХрд┐ рд╢рд╛рдпрдж рдпрд╣ рдХрд╛рдо рдХрд░рдирд╛ рд╣реИред
рд╡реИрд╕реЗ рднреА, рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдорди рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд╛рдпрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореБрдЭреЗ рдкрдВрдХреНрддрд┐ рдкрд░ рдХреБрдВрдЬреА рдХреЗ рдмрд┐рдирд╛ рдХреБрдВрдЬреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЪреЗрддрд╛рд╡рдиреА рдорд┐рд▓реА, рдЬреЛ рдореБрдЭреЗ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдореИрдВ рдПрдХ рдЖрдЗрдЯрдо рд╕реЗрдЯ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рдХрд░реЗрдВ рдХрд┐ рд╡рд╣рд╛рдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред

рдзрдиреНрдпрд╡рд╛рдж

Einar

21 рд╕рд┐рддрдВрдмрд░ 2018 рдХреЛ, 16:52 рдмрдЬреЗ, рдмреНрд░рд╛рдпрди рд╡реЙрди рд╕реВрдЪрдирд╛рдПрдБ @ithub.com рдиреЗ рд▓рд┐рдЦрд╛:

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдореЗрд░реА рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, HTMLTableElement рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрд╕ рддрд░рд╣ рд╕реЗ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдПрдХ рд╡рд┐рдВрдбреЛрд┐рдВрдЧ рдШрдЯрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЖрдк рд╢реИрд▓реА рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ: рдмреНрд▓реЙрдХ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЕрднреА рднреА рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдХрд╛рдлреА рд╕рд╣реА рд╣реЛрдЧрд╛ред

рдЖрдкрдХреЛ рдЯреЗрдмрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрдирд▓рд╛рдЗрди рдмреНрд▓реЙрдХ рдпрд╛ рдлреНрд▓реЗрдХреНрд╕ рд▓реЗрдЖрдЙрдЯ рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рдХреЙрд▓рдо рд▓реЗрдЖрдЙрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрддрд┐рд░рд┐рдХреНрдд рдЪреАрдЬреЛрдВ рдХреА рдЬреЛрдбрд╝реА:

рдЖрдк рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд╢реНрдпрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдЪреМрдбрд╝рд╛рдИ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ
рдЖрдкрдХреЛ рдЕрдкрдиреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдХреБрдВрдЬреА рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ
рдЖрдЗрдЯрдорд╕рд╛рдЗрдЬрд╝ рд╕рд┐рд░реНрдл 30 рдХреЗ рдмрдЬрд╛рдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ () => 30 (рдпрд╣ рдереЛрдбрд╝рд╛ рдмреЗрд╣рддрд░ рдкреНрд░рджрд░реНрд╢рди рдХрд░реЗрдЧрд╛)
-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдереНрд░реЗрдб рдЕрдзрд┐рдХреГрдд рдХрд┐рдпрд╛ рд╣реИред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ, рдпрд╛ рдереНрд░реЗрдб рдХреЛ рдореНрдпреВрдЯ рдХрд░реЗрдВред

рдореБрдЭреЗ рдкрдВрдХреНрддрд┐ рдкрд░ рдХреБрдВрдЬреА рдХреЗ рдмрд┐рдирд╛ рдХреБрдВрдЬреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЪреЗрддрд╛рд╡рдиреА рдорд┐рд▓реА, рдЬреЛ рдореБрдЭреЗ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдореИрдВ рдПрдХ рдЖрдЗрдЯрдо рд╕реЗрдЯ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рдХрд░реЗрдВ рдХрд┐ рд╡рд╣рд╛рдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред

рдпрд╣ рдЕрдкреЗрдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИред рдХреНрдпрд╛ рдЖрдк рдореЗрд░реЗ рд╕рд╛рде (рдХреЛрдб рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) рд░реЗрдкреНрд░реЛ рдХреЗрд╕ рд╢реЗрдпрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдКрд╣, рдХреНрд╖рдорд╛ рдХрд░реЗрдВред рдореБрдЭреЗ рдпрд╣ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ _only_ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрдкрдХреЗ itemKey рдлрд╝рдВрдХреНрд╢рди рдиреЗ рдХреБрдЫ рдЖрдЗрдЯрдореЛрдВ рдХреЗ рд▓рд┐рдП undefined рд▓реМрдЯрд╛ рджрд┐рдпрд╛ рд╣реИ - рдЬрд┐рд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

@bvaughn рдореИрдВ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рд╕рдорд░реНрдерди рдПрдХ рд╕реАрдорд┐рдд рдХрд╛рд░рдХ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЦрд╛рд╕ рдирд╣реАрдВ рдкрд╛ рд░рд╣рд╛ рд╣реВрдВред рдЙрддреНрд╕реБрдХрддрд╛ рд╕реЗ, рдореИрдВ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдореБрдЭреЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдердХрд╛рдК рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреЗрд╡рд▓ рдЖрдзрд╛рд░ рд╕реВрдЪреА рддрддреНрд╡ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ рдЬреЛ рдХрд┐ рдЗрд╕ рд╕рдордп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХрд░реНрддрд╛ рдХреА рдкрд╕рдВрдж рд╕реЗ рдмрд╛рд╣рд░ рд╣реИред рдЦреБрдж рдХреЗ рд▓рд┐рдП рдФрд░ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рднреА, рдЬреЛ рдирд┐рд╢реНрдЪрд┐рдд рд╣реЗрдбрд░ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд╡рд┐рдВрдбреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдпрд╣ рдЯреЗрдмрд▓ рд▓реЗрдЖрдЙрдЯ рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдирд┐рд╣рд┐рдд рд╕рд╛рд░рдгреАрдмрджреНрдз рд╕рдорд░реНрдерди рд╣рд╛рд╕рд┐рд▓ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдбрд┐рд╕реНрдкреНрд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛: рдЯреЗрдмрд▓ "рдХреБрдЫ" рджреЗрд╡ рдУрд╡рд░рд╣реЗрдб рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЖрд╕рдкрд╛рд╕ рдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ-рдмрдВрдж рд▓реЗрдЖрдЙрдЯ рд╣реИ рдЬреЛ рд╕рдВрднрд╡рддрдГ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рд╣рдореЗрд╢рд╛ рд╕реАрдПрд╕рдПрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдпрд╛ рдЕрдиреНрдп рдЧреБрдгреЛрдВ рдХреЛ рдореЛрдбрд╝ рд╕рдХрддрд╛ рд╣реВрдВ (рдореИрдВ рд╡реИрд╕реЗ рднреА рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ)ред рдХреНрдпрд╛ рдПрдХ рдПрд▓рд┐рдореЗрдВрдЯ рдЯрд╛рдЗрдк рдкреНрд░рд╢реНрди рд╕реЗ рдмрд╛рд╣рд░ рд╣реИ?

@bvaughn рдореИрдВ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рд╕рдорд░реНрдерди рдПрдХ рд╕реАрдорд┐рдд рдХрд╛рд░рдХ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЦрд╛рд╕ рдирд╣реАрдВ рдкрд╛ рд░рд╣рд╛ рд╣реВрдВред

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдлреЛрдВрдЯрд╕рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛ - рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рд╕реИрдВрдбрдмреЙрдХреНрд╕ I рд╕реЗ рдЬреБрдбрд╝реЗ (

рдпрд╣рд╛рдБ рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬреЛ рд╕рд┐рд░реНрдл HTML рд╣реИ: lx65871p69

HTMLSelectElement ( <tbody> ) height рдФрд░ overflow рдЬреИрд╕реА рд╢реИрд▓рд┐рдпреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддрд╛ рд╣реИ - рдЗрд╕реЗ рд╡рд┐рдВрдбреЛрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдмреЗрдХрд╛рд░ рдмрдирд╛ рджреЗрддрд╛ рд╣реИред рдЖрдк рдЗрд╕рдХрд╛ рдбрд┐рд╕реНрдкреНрд▓реЗ рдореЛрдб ( display: block ) рдмрджрд▓рдХрд░ рдЗрд╕реЗ "рдареАрдХ" рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдпрд╣ HTMLTableElement рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЛ рдкрд░рд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХреЙрд▓рдо рд╕рд╛рдЗрдЬрд┐рдВрдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИред

рд╡рд╣ рдХреЙрд▓рдо рд╕рд╛рдЗрдЬрд╝рд┐рдВрдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рд╡реИрд╕реЗ рднреА рдЦрд┐рдбрд╝рдХреА рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреВрдЯ рдЧрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдХрд╛рд░ рдХреЙрд▓рдо рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИ (рдЬреЛ рдХрд┐ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╕реНрдХреНрд░реЙрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛)ред

рд▓реЗрдХрд┐рди рдпрд╣ рдХреЗрд╡рд▓ рдЖрдзрд╛рд░ рд╕реВрдЪреА рддрддреНрд╡ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдЗрд╕ рд╕рдордп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХрд░реНрддрд╛ рдХреА рдкрд╕рдВрдж рд╕реЗ рдмрд╛рд╣рд░ рд╣реИ ... рдХреНрдпрд╛ рдПрдХ рдПрд▓рд┐рдореЗрдВрдЯ рдЯрд╛рдЗрдк рдкреНрд░рд╢реНрди рд╕реЗ рдмрд╛рд╣рд░ рд╣реИ?

рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЯреИрдЧ рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ ( 2j0z718mwy ) рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдпрд╣ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдпрд╣ рдЖрдкрдХреЛ рдХреНрдпрд╛ рд▓рд╛рдн рджреЗрддрд╛ рд╣реИред

рдЦреБрдж рдХреЗ рд▓рд┐рдП рдФрд░ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рднреА, рдЬреЛ рдирд┐рд╢реНрдЪрд┐рдд рд╣реЗрдбрд░ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд╡рд┐рдВрдбреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдпрд╣ рдЯреЗрдмрд▓ рд▓реЗрдЖрдЙрдЯ рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдирд┐рд╣рд┐рдд рд╕рд╛рд░рдгреАрдмрджреНрдз рд╕рдорд░реНрдерди рд╣рд╛рд╕рд┐рд▓ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

рдКрдкрд░ рдмрддрд╛рдП рдЧрдП рдХрд╛рд░рдгреЛрдВ рд╕реЗ HTMLTableElement рдХрд░рдирд╛ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реЛрдЧрд╛ред рдпрджрд┐ рдЖрдк рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╣реЗрдбрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рд░рдгреАрдмрджреНрдз / рдЧреНрд░рд┐рдб рд▓реЗрдЖрдЙрдЯ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕реЗ рдирд┐рдпрдорд┐рдд рд╕реВрдЪреА рдШрдЯрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреВрд░рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: pk78pvwnkx

рдЖрдкрдХреЛ рдЯреЗрдмрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрдирд▓рд╛рдЗрди рдмреНрд▓реЙрдХ рдпрд╛ рдлреНрд▓реЗрдХреНрд╕ рд▓реЗрдЖрдЙрдЯ рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рдХреЙрд▓рдо рд▓реЗрдЖрдЙрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╢рд╛рдпрдж рдХреБрдЫ рдПрдХреНрд╕реЗрд╕рд┐рдмрд┐рд▓рд┐рдЯреА рдХреЗ рд▓рд┐рдП рдЯреЗрдмрд▓ рд╕рдВрд░рдЪрдирд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (рдЬреИрд╕реЗ, рдЧреИрд░-рд╢рдмреНрджрд╛рд░реНрде рд╡рд┐рднрд╛рдЧ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмреЗрд╣рддрд░ рд╕реНрдХреНрд░реАрди рд░реАрдбрд┐рдВрдЧ)? рдореИрдВ рдпрд╣рд╛рдБ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд░рд╣рд╛ рд╣реВрдБред

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ рд╕реАрдПрд╕рдПрд╕ рдкреНрд░рджрд░реНрд╢рди рд╢реИрд▓реА рдФрд░ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рд╢реИрд▓рд┐рдпреЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдЬрд╛рдКрдВрдЧрд╛ рдЬреЛ рдЯреЗрдмрд▓ рддрддреНрд╡реЛрдВ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИрдВред

рдореЗрд░рд╛ рдЕрдиреБрднрд╡ рд▓рдЧрднрдЧ рдиреМ рд╕рд╛рд▓ рдкрд╣рд▓реЗ (рддрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЛрдИ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рдереА, рдХреЛрдИ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рдереА) рдФрд░ рдЬрд╣рд╛рдБ рддрдХ рдореБрдЭреЗ рдХреЛрдИ рд╡рд░реНрдЪреБрдЕрд▓рд╛рдЗрдЬреЗрд╢рди рдпрд╛рдж рдирд╣реАрдВ рд╣реИ) рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рдореЗрд░реЗ рд╕рд╣рдпреЛрдЧреА рдиреЗ рдЗрд╕реЗ рдЙрдЪрд┐рдд рддрд╛рд▓рд┐рдХрд╛ рддрддреНрд╡реЛрдВ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдХреБрдЫ рддрд░реАрдХреЛрдВ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЗрдЖрдЙрдЯ рдХреЛ рдордЬрдмреВрд░ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдХрд┐рдпрд╛, рдФрд░ рдлрд┐рд░ рд╢реБрджреНрдз рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЯреЗрдмрд▓ рд▓реЗрдЖрдЙрдЯ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рдмрд┐рд▓реНрдХреБрд▓ рддреИрдирд╛рдд рдФрд░ рдЖрдХрд╛рд░ред рдЙрд╕ рд╕рдорд╛рдзрд╛рди рдиреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛: рдХреЛрдИ рдЕрдЬреАрдм рд▓реЗрдЖрдЙрдЯ рдХреВрджрддрд╛ рдирд╣реАрдВ, рдЪрд┐рдХрдиреА рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ (рдкреНрд░рддрд┐ рдкрдВрдХреНрддрд┐ / рдкреНрд░рддрд┐-рд╕реНрддрдВрдн рдирд╣реАрдВ), рдЖрджрд┐ред

рд╢рд╛рдпрдж рдХреБрдЫ рдПрдХреНрд╕реЗрд╕рд┐рдмрд┐рд▓рд┐рдЯреА рдХреЗ рд▓рд┐рдП рдЯреЗрдмрд▓ рд╕рдВрд░рдЪрдирд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (рдЬреИрд╕реЗ, рдЧреИрд░-рд╢рдмреНрджрд╛рд░реНрде рд╡рд┐рднрд╛рдЧ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмреЗрд╣рддрд░ рд╕реНрдХреНрд░реАрди рд░реАрдбрд┐рдВрдЧ)? рдореИрдВ рдпрд╣рд╛рдБ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд░рд╣рд╛ рд╣реВрдБред

рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрд░рд┐рдпрд╛ рднреВрдорд┐рдХрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

рд╕реБрдкрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ, рдзрдиреНрдпрд╡рд╛рджред рдЖрдкрдиреЗ рдореБрдЭреЗ рдПрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦрд░рдЧреЛрд╢ рдХреЗ рдЫреЗрдж рдХреЗ рдиреАрдЪреЗ рдЬрд╛рдиреЗ рд╕реЗ рдмрдЪрд╛рдпрд╛, рдЬреЛ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХреЗрд╡рд▓ рджреВрд╕рд░реЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд▓ рдХрд░реЗрдЧрд╛ред

рдирдорд╕реНрддреЗ
рдореИрдВрдиреЗ рдПрдХ рдирдпрд╛ рдмрдирд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдореМрдЬреВрджрд╛ рдзрд╛рдЧрд╛ рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдореИрдВ рдЕрдЪреНрдЫреА рдЬрдЧрд╣ рдкрд░ рд╣реВрдВ ...

рдХреНрдпрд╛ FixedSizeGrid рд▓рд┐рдП рджреЛ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдорд┐рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП "colspan" рдХреА рддрд░рд╣ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ (рд╢рд╛рдпрдж рдореЗрд░реЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрдПрдЧрд╛)?
рдпрд╣ рд╕рд╡рд╛рд▓ рдпрд╣рд╛рдВ рд╢реБрд░реВ рд╣реБрдИ рдПрдХ рдФрд░ рдЪрд░реНрдЪрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛

рдХреНрдпрд╛ рдлрд┐рдХреНрд╕реНрдбрд╕рд╛рдЗрдЬрдЧреНрд░рд┐рдб рдХреЗ рд▓рд┐рдП рджреЛ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдорд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП "рдХреЛрд▓реНрдкреНрд╕рди" рдХреА рддрд░рд╣ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ (рд╢рд╛рдпрдж рдореЗрд░реЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрдПрдЧрд╛)?

рдирд╣реАрдВред рдпрд╣ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИред

@einarq @BlaineBradbury @sompylasar рдпрджрд┐ рдЖрдк рдЕрднреА рднреА рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдЯреЗрдмрд▓ рдЯреИрдЧ рдХреЗ рд╕рд╛рде рд╡рд┐рдВрдбреЛрд┐рдВрдЧ рдХрд╛рд░реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдлрд▓ рд░рд╣рд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореИрдВрдиреЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдЦрд┐рдбрд╝рдХреА рдХреЛ рд▓рдкреЗрдЯрдХрд░ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмрдирд╛рдпрд╛ред рдЖрдк рдпрд╣рд╛рдВ рдПрдХ рд▓рд╛рдЗрд╡ рдбреЗрдореЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ: https://window-table.netlify.com/

рдЯреЗрдмрд▓ рдЯреИрдЧ рдореИрдВ рдХреНрдпреЛрдВ рдЪрд╛рд╣рддрд╛ рдерд╛ рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд╕реНрдЯрд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдерд╛ред рдПрдХ рдирд┐рдпрдорд┐рдд html рдЯреЗрдмрд▓ рдХреЛ рд╕реНрдЯрд╛рдЗрд▓ рдХрд░рдирд╛ рдЯреНрд╡рд┐рд╕реНрдЯ-рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдореИрдВ рдПрдХ рд╡рд┐рдВрдбреЛ рдЯреЗрдмрд▓ рдХреЗ рд╕рд╛рде рднреА рдпрд╣реА рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред

рдореБрдЭреЗ рдмреНрд░рд╛рдпрди рдХреЛ рдЯреИрдЧ рдХрд░рдиреЗ рдФрд░ рдкреВрдЫрдиреЗ рдХреЗ рд▓рд┐рдП рд▓реБрднрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╡рд╣ рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реИрдВ (рдЪреВрдВрдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдерд╛ рдХрд┐ html рдЯреЗрдмрд▓ рдЯреИрдЧ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ)ред рд▓реЗрдХрд┐рди рдЙрд╕рдиреЗ рдкрд╣рд▓реЗ рд╣реА рдореЗрд░реА рдХрд╛рдлреА рдорджрдж рдХреАред рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдЖрдк рд▓реЛрдЧреЛрдВ рдкрд░ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛ред

рдзрдиреНрдпрд╡рд╛рджред

рдпрд╣ @pupudu рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рд╣реЗрдбрд░ рдФрд░ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ <table> рдЯреИрдЧ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдПрдХреНрд╕реЗрд╕рд┐рдмрд┐рд▓рд┐рдЯреА рдХреА рдЪрд┐рдВрддрд╛ рд╣реЛрдЧреА рдпрд╛ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдиреНрдпрдерд╛ рд╕рд╛рдл рд╣реИред

рдореИрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ react-datasheet рдХреЗ рд╕рд╛рде react-window , рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

function sheetRenderer(props) {
  const Row = ({ index, style }) => (
    React.cloneElement(props.children[index], { style })
  );
  return (
    <table className={props.className}>
        <tbody>
          <FixedSizeList
              height={150}
              itemCount={1000}
              itemSize={35}
              width={300}
          >
            {Row}
          </FixedSizeList>
        </tbody>
    </table>
  )
}

export default function EntityTable(props: IEntityTableProps) {
  const initialGrid = useMemo(() => {
    return getTableGridFromCSV(props.entityListCSV);
  }, [props.entityListCSV]);
  const [modifiedGrid, updateModifiedGrid] = useImmer(initialGrid);
  return (
    <ReactDataSheet
      data={modifiedGrid}
      sheetRenderer={sheetRenderer}
      valueRenderer={cell => cell.value}
      onCellsChanged={changes => {
        updateModifiedGrid(draft => {
          changes.forEach(({ cell, row, col, value }) => {
            draft[row][col].value = value || '';
          });
        });
      }}
    />
  );
}

function getTableGridFromCSV(csv: string) {
  return csv.split('\n').map(row =>
    row.split(',').map((cell, index) => {
      if (index === 0) {
        return {
          value: cell,
          forceComponent: true,
          component: <button onClick={() => console.log(cell)}>{cell}</button>,
        };
      }
      if (index === 2) {
        return {
          value: cell,
        };
      }
      return {
        value: cell,
        component: <span>{cell}</span>,
      };
    }),
  );
}

рдпрд╣ рдкреНрд░рддрд┐рдкрд╛рджрди рдХрд░рддрд╛ рд╣реИ, рдПрдХрдорд╛рддреНрд░ рд╕рдорд╕реНрдпрд╛ Warning: validateDOMNesting(...): <tr> cannot appear as a child of <div>. index.js:1437 Warning: validateDOMNesting(...): <div> cannot appear as a child of <tbody>.

рдЕрд░реЗ, рдореИрдВ рдЗрд╕реЗ рд░рд┐рдПрдХреНрдЯ-рдЯреЗрдмрд▓ рдХреЗ рд╕рд╛рде рдЖрдЬрд╝рдорд╛ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдзреНрдпрд╛рди рджреЗ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдореБрдЭреЗ рдЯреЗрдмрд▓ рдПрд▓рд┐рдореЗрдВрдЯреНрд╕ рдХреЗ рдмрдЬрд╛рдп рдбрд┐рд╡ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдирд╛ рд╣реИред рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╕рд╛рдордЧреНрд░реА / рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдЬреИрд╕реА рд╕реНрдЯрд╛рдЗрд▓рд┐рдВрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЙрди рддрддреНрд╡реЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рддрд╛рд▓рд┐рдХрд╛ рддрддреНрд╡реЛрдВ рдХреЗ рдмрдЬрд╛рдп рдореЗрд░реА рддрд╛рд▓рд┐рдХрд╛ рд╕реНрдХреАрдорд╛ рдХреЛ divs рдореЗрдВ рдмрджрд▓рдирд╛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХрд╛рдо рд╣реИред рдХреНрдпрд╛ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдЯреЗрдмрд▓ рдПрд▓рд┐рдореЗрдВрдЯреНрд╕ рдХреЛ рдбрд┐рдлрд░реЗрдВрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ рдпрд╛ рдХреНрдпрд╛ рдореБрдЭреЗ рдЕрдм рдЕрдкрдирд╛ рд╕реНрдЯрд╛рдЗрд▓ рдмрдирд╛рдирд╛ рд╣реИ?

@simkessy рдЬрдм рддрдХ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдЧреМрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рдЖрдкрдХреЛ рд╡рд┐рдВрдбреЛ-рдЯреЗрдмрд▓ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рдпрд╣ html рдЯреЗрдмрд▓ рдЯреИрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдореЗрдВ рдореМрдЬреВрджрд╛ рд╢реИрд▓рд┐рдпреЛрдВ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рддрд╛рд▓рд┐рдХрд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЙрдиреНрдирдд рдирд╣реАрдВ рд╣реИред
https://window-table.netlify.com/

@pupudu рдореИрдВ рдЖрдкрдХреЗ рдЦреБрд▓реЗ рд╕реНрд░реЛрдд рдХреЗ рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЕрдкрдиреЗ рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреЗрдЦрд╛ рд╣реИред рдореИрдВ рдмрд╕ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рд╕реБрдкрд░ рд╕реАрдзреА рдмрд╛рдд рджреВрд╕рд░реЗ рд▓реЛрдЧ рдЦреЛрдЬ рд░рд╣реЗ рдереЗ: рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓реЗрдХрд┐рди рддрд╛рд▓рд┐рдХрд╛ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рдеред

рдмрд╛рд╣рд░ рдореБрдбрд╝рддрд╛ рд╣реИ рдореИрдВ рдХреЛрдб рдХреЗ рдПрдХ рдмрд╣реБрдд рдЫреЛрдЯреЗ рд╕реЗ, рдФрд░ рдмрд╣реБрдд рд░рдЪрдирд╛рддреНрдордХрддрд╛ рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдЦреАрдВрдЪрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред рдХреЛрдб рдЗрддрдирд╛ рд╕рд░рд▓ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдХреЛ рднреА рдХреЙрдкреА / рдкреЗрд╕реНрдЯ рдХрд░рдиреЗ рдФрд░ рдЕрдкрдиреА рдкрд╕рдВрдж рдХреЛ рдмрдврд╝рд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред @bvaughn рдХреИрд╕реЗ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдпрджрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рдмрд╣реБрдд рд╣реА рдорд╛рдореВрд▓реА рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдмрд╣реБрдд рдорд╛рдореВрд▓реА рд╣реИред

рдЗрд╕рдХреА рдХрдореА :

  • рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдХреА "рд╢реАрд░реНрд╖" рд╢реИрд▓реА рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░реЗрдВ
  • рдЙрд╕ рдореВрд▓реНрдп рдХреЛ React.Context рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░реЗрдВ рддрд╛рдХрд┐ рд╣рдо рдЗрд╕реЗ рдкрд╛рд╕ рдХрд░ рд╕рдХреЗрдВ
  • рдорд╛рди рдХреЛ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдШрдЯрдХ рдкрд░ рд▓рд╛рдЧреВ рдХрд░реЗрдВ рдЬреЛ рд╡рд╣ рд╣реЛрдЧрд╛ рдЬреЛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдмрдЬрд╛рдп рд╕реНрд╡рдпрдВ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ
  • рд╣реЗрдбрд░ рдФрд░ рдлреВрдЯрд░ рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрд▓реЙрдЯ рдЬреЛрдбрд╝реЗрдВред
  • рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдПрд░реНрдЧреЛрдиреЙрдорд┐рдХреНрд╕ рдЪреАрдЬреЛрдВ рдХреЛ рдмрдбрд╝реЗ рдХрд░реАрдиреЗ рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП React.Context рдХреНрд░реЙрд╕ рдШрдЯрдХ рд╕рдВрдЪрд╛рд░ рдХреЛ рдкрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реАрд░реЛ рд╣реИред

рд╡рд░реНрдХрд┐рдВрдЧ рдХреЛрдб рд╕реИрдВрдбрдмреЙрдХреНрд╕: https://codesandbox.io/s/react-window-with-table-elements-n8686o

рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рдХреЛрдб

import React from 'react'
import { useState, useRef, useContext } from 'react'
import { FixedSizeList, FixedSizeListProps } from 'react-window'
import { render } from 'react-dom'

/** Context for cross component communication */
const VirtualTableContext = React.createContext<{
  top: number
  setTop: (top: number) => void
  header: React.ReactNode
  footer: React.ReactNode
}>({
  top: 0,
  setTop: (value: number) => {},
  header: <></>,
  footer: <></>,
})

/** The virtual table. It basically accepts all of the same params as the original FixedSizeList.*/
function VirtualTable({
  row,
  header,
  footer,
  ...rest
}: {
  header?: React.ReactNode
  footer?: React.ReactNode
  row: FixedSizeListProps['children']
} & Omit<FixedSizeListProps, 'children' | 'innerElementType'>) {
  const listRef = useRef<FixedSizeList | null>()
  const [top, setTop] = useState(0)

  return (
    <VirtualTableContext.Provider value={{ top, setTop, header, footer }}>
      <FixedSizeList
        {...rest}
        innerElementType={Inner}
        onItemsRendered={props => {
          const style =
            listRef.current &&
            // @ts-ignore private method access
            listRef.current._getItemStyle(props.overscanStartIndex)
          setTop((style && style.top) || 0)

          // Call the original callback
          rest.onItemsRendered && rest.onItemsRendered(props)
        }}
        ref={el => (listRef.current = el)}
      >
        {row}
      </FixedSizeList>
    </VirtualTableContext.Provider>
  )
}

/** The Row component. This should be a table row, and noted that we don't use the style that regular `react-window` examples pass in.*/
function Row({ index }: { index: number }) {
  return (
    <tr>
      {/** Make sure your table rows are the same height as what you passed into the list... */}
      <td style={{ height: '36px' }}>Row {index}</td>
      <td>Col 2</td>
      <td>Col 3</td>
      <td>Col 4</td>
    </tr>
  )
}

/**
 * The Inner component of the virtual list. This is the "Magic".
 * Capture what would have been the top elements position and apply it to the table.
 * Other than that, render an optional header and footer.
 **/
const Inner = React.forwardRef<HTMLDivElement, React.HTMLProps<HTMLDivElement>>(
  function Inner({ children, ...rest }, ref) {
    const { header, footer, top } = useContext(VirtualTableContext)
    return (
      <div {...rest} ref={ref}>
        <table style={{ top, position: 'absolute', width: '100%' }}>
          {header}
          <tbody>{children}</tbody>
          {footer}
        </table>
      </div>
    )
  }
)

/**
 * Render Our Example
 **/
render(
  <VirtualTable
    height={300}
    width="100%"
    itemCount={1000}
    itemSize={36}
    header={
      <thead>
        <tr>
          <th>Index</th>
          <th>Header 2</th>
          <th>Header 3</th>
          <th>Header 4</th>
        </tr>
      </thead>
    }
    row={Row}
    footer={
      <tfoot>
        <tr>
          <td>Footer 1</td>
          <td>Footer 2</td>
          <td>Footer 3</td>
          <td>Footer 4</td>
        </tr>
      </tfoot>
    }
  />,
  document.querySelector('main')
)

@jamesmfriedman рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдкреНрдпрд╛рд░ рд╣реИред рдЗрд╕реЗ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдЯреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рдЪрд╛рд░ред рдореИрдВ рдЗрд╕ рддрдереНрдп рдХреЛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдХреЗрд╡рд▓ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╣реИрдВ, рдореЗрд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╡рд┐рдкрд░реАрдд рдЬрд╣рд╛рдВ рдореИрдВ рджреЛ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реВрдВ, рдПрдХ рд╣реЗрдбрд░ рдХреЗ рд▓рд┐рдП рдФрд░ рдПрдХ рд╢рд░реАрд░ рдХреЗ рд▓рд┐рдПред рдЗрд╕рдиреЗ рд╡рд┐рдВрдбреЛ-рдЯреЗрдмрд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдореЗрдВ рдмрд╣реБрдд рднреНрд░рдо рдкреИрджрд╛ рдХрд┐рдпрд╛ рд╣реИ (рдпрд╣ рдирд╣реАрдВ рджреЗрдЦрд╛ рдХрд┐ рдЖрдиреЗ рд╡рд╛рд▓рд╛ tbh)ред

рдЕрдЧрд░ рдЖрдкрдХреЛ рдХреЛрдИ рдЖрдкрддреНрддрд┐ рдирд╣реАрдВ рд╣реИ рддреЛ рдореИрдВ рдЗрди рд╡рд┐рдЪрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рдВрдбреЛ-рдЯреЗрдмрд▓ рдореЗрдВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдБрдЧрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдмрд╕реЗ рдмрдбрд╝реА рдЪреБрдиреМрддреА рдпрд╣ рд╣реЛрдЧреА рдХрд┐ рд╕рд╛рдордЧреНрд░реА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдСрдЯреЛ-рдЖрдХрд╛рд░ рдХреИрд╕реЗ рджрд┐рдпрд╛ рдЬрд╛рдП (рдЬреЛ рдХрдо рд╕реЗ рдХрдо рд╡рд┐рдВрдбреЛ-рдЯреЗрдмрд▓ рдХреА рд╕рдмрд╕реЗ рдмрдбрд╝реА рдЪреБрдиреМрддреА рдереА)ред

@jamesmfriedman рдЬреЛ рдмрд╣реБрдд рд╣реА рд╣реЛрдирд╣рд╛рд░ рд▓рдЧ рд░рд╣рд╛ рд╣реИред @bvaughn рдХреНрдпрд╛ рдЖрдкрдХреЛ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдЪрд┐рдВрддрд╛ рд╣реИ?

@jamesmfriedman рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣реЗрдбрд░ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рде рд╕реНрдХреНрд░реЙрд▓ рдХрд░рддрд╛ рд╣реИред рдХреНрдпрд╛ рдЗрд╕реЗ рдЪрд┐рдкрдЪрд┐рдкрд╛ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИ?

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдВрднрд╡ рд╣реИ, рдФрд░ рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИред рдмрд╕ HTML рддрд╛рд▓рд┐рдХрд╛ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдЪрд┐рдкрдЪрд┐рдкрд╛ рд╣реЗрдбрд░ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреБрдЫ googling рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ рдЕрд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдпрд╛рдж рд░рдЦрддрд╛ рд╣реВрдВ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ TH рддрддреНрд╡ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЪрд┐рдкрдЪрд┐рдкрд╛ рдмрдирд╛рддрд╛ рд╣реИред

@jamesmfriedman рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд-рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж a @ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдпрд╣рд╛рдБ https://codesandbox.io/s/react-window-with-table-elements-jk70e рдЖрдкрдХреЛ style={{ position: 'sticky', top: 0 }}> рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ th рдЯреИрдЧ

@jamesmfriedman рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рдЗрд╕реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реВрдБред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╢реАрд░реНрд╖ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╢реАрд░реНрд╖ рдФрд░

рддреЛ рд▓рд╛рдЗрди 79 <table style={{ top: 0, position: 'sticky', width: '100%' }}>

рд╡рд╣ рднреА рд╕реНрдХреНрд░реЙрд▓ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдХрд┐ рдпрджрд┐ рдЖрдк рдиреАрдЪреЗ рдХреА рдУрд░ рд╕реНрдХреНрд░реЙрд▓ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВред

HTML рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рдЕрдЪреНрдЫрд╛ рдХрд╛рд░рдг IE11 рдХрд╛ рд╕рдорд░реНрдерди рд╣реИред рдореИрдВ FixedSizeList рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ CSS-рдЧреНрд░рд┐рдб рдХреЗ рд╕рд╛рде рд╕реНрдЯрд╛рдЗрд▓ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдЬрдм рдЖрдкрдХреЛ рдЕрдиреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдЬреИрд╕реЗ рдХрд┐ рдЙрддреНрддрд░рджрд╛рдпреА рдХреЙрд▓рдо, рд╡рд┐рднрд┐рдиреНрди рдЖрдХрд╛рд░реЛрдВ рд╡рд╛рд▓реЗ рдХреЙрд▓рдо рдЖрджрд┐ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдпрд╣ рд╕рднреА IE11 рдХреЗ рд╕рд╛рде рдорд┐рд▓рдХрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдХреЛрдб рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВред рдЬрдмрдХрд┐ HTML рдЯреЗрдмрд▓ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдХреЛрдб рдХреЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

IE11 рдЖрдк рдЕрдм рдФрд░ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреБрдЫ рдирд╣реАрдВ рд╣реИ :)

рд╣рд░ рдПрдХ FE рдбреЗрд╡рд▓рдкрд░ IE11 рдореЗрдВ рдореГрддреНрдпреБ рдЪрд╛рд╣рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╡рд╣рд╛рдБ рдХрдВрдкрдирд┐рдпрд╛рдВ / рд▓реЛрдЧ рдЗрд╕рдХреЗ рд╕рд╛рде рдлрдВрд╕ рдЧрдП рд╣реИрдВ, рдЙрди рдХрд╛рд░рдгреЛрдВ рдХреЗ рдХрд╛рд░рдг рдЗрд╕ рдХрджрдо рдХреЛ рдмрдирд╛рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рд╣реИрдВ рдЬрд┐рдирдХреА рд╣рдо рдХрд▓реНрдкрдирд╛ рднреА рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрдореНрдореАрдж рд╣реИ, рдпрд╣ рд╕рдордп рдореЗрдВ рдХреБрдЫ рд╣реА рд╕рд╛рд▓ рдЖрдЧреЗ рд╣реИред рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ IE11 рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЪрд╛рд╣реЗ рд╣рдо рдЗрд╕реЗ рдкрд╕рдВрдж рдХрд░реЗрдВ рдпрд╛ рдирд╣реАрдВред

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рднреА рдирд┐рдЧрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдард┐рди рдЧреЛрд▓реА рдереАред

@ olafur164 рддреЗрдЬреА рд╕реЗ рд╕реНрдХреНрд░реЙрд▓ рдкрд░ рдирд╣реАрдВ рддреЛрдбрд╝рдиреЗ рд╡рд╛рд▓реЗ рдЪрд┐рдкрдЪрд┐рдкрд╛ рд╣реЗрдбрд░ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рдлрд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдХреНрдпрд╛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ "рдЪрд┐рдкрдЪрд┐рдкрд╛" рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрд╕рд╛рдиреА рд╕реЗ рд╡рд┐рд░реЛрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдордп рдореЗрдВ рдПрдХ рдкрдВрдХреНрддрд┐ рдХреЛ рд╕реНрдХреНрд░реЙрд▓ рдХрд░рддрд╛ рд╣реИ?

рдореБрдЭреЗ рдЕрдкрдирд╛ рдЕрдиреБрднрд╡ рд░рд┐рдПрдХреНрд╢рди-рд╡рд░реНрдЪреБрдЕрд▓рд╛рдЗрдЬреНрдб (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдпрд╣ рд░рд┐рдПрдХреНрд╢рди-рд╡рд┐рдВрдбреЛ рдЗрд╢реНрдпреВрдЬ рдкреЗрдЬ рд╣реИ) рдФрд░ рдХреБрдЫ рдордЯреЗрд░рд┐рдпрд▓ рдпреВрдЖрдИ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдордЯреЗрд░рд┐рдпрд▓-рдЯреЗрдмрд▓ рдХрд╣рд╛ рдЬрд╛рддрд╛ https://github.com/mbrn/ рд╕рд╛рдордЧреНрд░реА-рддрд╛рд▓рд┐рдХрд╛ / рдореБрджреНрджреЗ / 891 # рдЬрд╛рд░реА рдХрд░рдирд╛ -681986647 рдЕрднреА рднреА рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ рдЬреИрд╕реЗ рд╕реНрдЯрд╛рдЗрд▓ рдХреА рд╕рдорд╕реНрдпрд╛рдПрдВ рдФрд░ validateDOMNesting(...) рдЪреЗрддрд╛рд╡рдиреАред

@jamesmfriedman рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж a @ @ рдпрд╣рд╛рдБ рдЪрд┐рдкрдЪрд┐рдкрд╛ рд╣реЗрдбрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдЖрдкрдХреЛ style={{ position: 'sticky', top: 0 }}> рдХреЛ th рдЯреИрдЧ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

рдЕрд░реЗ @JCofman , рдореИрдВрдиреЗ рдЖрдкрдХреЗ CSS рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд▓реЗрдХрд┐рди рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрд╣рд╛рдБ рдХреЛрдб рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдЙрджрд╛рд╣рд░рдг рд╣реИ - https://codesandbox.io/s/react-window-with-table-elements-forked-huti6?file=/src/index.tsx : 514-542

рджреЛ рдореБрджреНрджреЗ рд╣реИрдВ -

  1. рд╢реАрд░реНрд╖ рд▓реЗрдЦ рдЬрдЧрд╣ рдореЗрдВ рд╢реИрд▓рд┐рдпреЛрдВ рдХреЗ рдмрд╛рд╡рдЬреВрдж рд╢реАрд░реНрд╖ рдкрд░ рдирд╣реАрдВ рдЪрд┐рдкрдХреЗ рд╣реБрдП рд╣реИрдВред
  2. рд╣реЗрдбрд░ рдКрдкрд░ рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рдЬреЛрд░ рд╕реЗ рд╕реНрдХреНрд░реЙрд▓ рдХрд░рддреЗ рд╣реБрдП рдЪрдордХрддрд╛ / рдЯрд┐рдордЯрд┐рдорд╛ рд░рд╣рд╛ рд╣реИред
    [рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрджрдо - релреж% рдиреАрдЪреЗ рд╕реНрдХреНрд░реЙрд▓ рдХрд░реЗрдВ рдлрд┐рд░ рддреЗрдЬреА рд╕реЗ рд╕реНрдХреНрд░реЙрд▓ рдХрд░реЗрдВ рдФрд░ рд╣реЗрдбрд░ рдЖрдВрджреЛрд▓рди рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░реЗрдВ]ред

рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рдзрдиреНрдпрд╡рд╛рдж :)

@jamesmfriedman рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдкреНрдпрд╛рд░ рд╣реИред рдЗрд╕реЗ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдЯреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рдЪрд╛рд░ред рдореИрдВ рдЗрд╕ рддрдереНрдп рдХреЛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдХреЗрд╡рд▓ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╣реИрдВ, рдореЗрд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╡рд┐рдкрд░реАрдд рдЬрд╣рд╛рдВ рдореИрдВ рджреЛ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реВрдВ, рдПрдХ рд╣реЗрдбрд░ рдХреЗ рд▓рд┐рдП рдФрд░ рдПрдХ рд╢рд░реАрд░ рдХреЗ рд▓рд┐рдПред рдЗрд╕рдиреЗ рд╡рд┐рдВрдбреЛ-рдЯреЗрдмрд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдореЗрдВ рдмрд╣реБрдд рднреНрд░рдо рдкреИрджрд╛ рдХрд┐рдпрд╛ рд╣реИ (рдпрд╣ рдирд╣реАрдВ рджреЗрдЦрд╛ рдХрд┐ рдЖрдиреЗ рд╡рд╛рд▓рд╛ tbh)ред

рдЕрдЧрд░ рдЖрдкрдХреЛ рдХреЛрдИ рдЖрдкрддреНрддрд┐ рдирд╣реАрдВ рд╣реИ рддреЛ рдореИрдВ рдЗрди рд╡рд┐рдЪрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рдВрдбреЛ-рдЯреЗрдмрд▓ рдореЗрдВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдБрдЧрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдмрд╕реЗ рдмрдбрд╝реА рдЪреБрдиреМрддреА рдпрд╣ рд╣реЛрдЧреА рдХрд┐ рд╕рд╛рдордЧреНрд░реА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдСрдЯреЛ-рдЖрдХрд╛рд░ рдХреИрд╕реЗ рджрд┐рдпрд╛ рдЬрд╛рдП (рдЬреЛ рдХрдо рд╕реЗ рдХрдо рд╡рд┐рдВрдбреЛ-рдЯреЗрдмрд▓ рдХреА рд╕рдмрд╕реЗ рдмрдбрд╝реА рдЪреБрдиреМрддреА рдереА)ред

рдореИрдВрдиреЗ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рдорд╛рди рд╕рдорд╛рдзрд╛рди рдвреВрдВрдврдирд╛ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП display: grid display: contents рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореВрд▓ рд░реВрдк рд╕реЗ table > tr рддрддреНрд╡реЛрдВ рдХреА рдХрдореА рдХрд╛ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реВрдВред

рдЖрдкрдиреЗ рдПрдХ рдЖрдВрддрд░рд┐рдХ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрдн + рд░реЗрдлреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкрд╣рд▓реЗ рдмрдЪреНрдЪреЗ рдХреА рд╢реИрд▓реА рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЗрд╕реЗ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

const Inner = React.forwardRef<HTMLDivElement, React.HTMLProps<HTMLDivElement>>(
  function Inner({ children, ...rest }, ref) {
    const { header, footer } = useContext(VirtualTableContext)
    const {style} = children[0].props;
    return (
      <div {...rest} ref={ref}>
        <table style={style}>
          {header}
          <tbody>{children}</tbody>
          {footer}
        </table>
      </div>
    )
  }
)

рд╕реНрдЯрд╛рдЗрд▓ рдкреНрд░реЛрдк рдХреЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рджреНрд╡рд╛рд░рд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП createElement рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЪреВрдВрдХрд┐ рдЖрдкрдХреЗ рд╡рд┐рд╢реЗрд╖ Row рдШрдЯрдХ style рд╕реЗ tr рдЕрд╕рд╛рдЗрди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдирд╣реАрдВ рд╣реИрдВ рдЙрдиреНрд╣реЗрдВ рднреА рдиреАрдЪреЗ рдкрд╛рд░рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИред

рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдореИрдВ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ред рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╣рдо рд╕реАрдПрд╕рдПрд╕ рдХрд╕реНрдЯрдо рдЧреБрдг ss рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЫрджреНрдо рддрддреНрд╡реЛрдВ (рдмрд╛рдж рдореЗрдВ / рдкрд╣рд▓реЗ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧрджреНрджреА рдХреЗ рд╕рд╛рде рдкреВрд░реЗ рдЯреЗрдмрд▓ рдмреЙрдбреА рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ

рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЕрднрд┐рдХреНрд░рд┐рдпрд╛-рдЖрднрд╛рд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ https://codesandbox.io/s/poc-react-virtual-table-jyz0m

рдореБрдЭреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА рддрд╛рдХрд┐ рдореИрдВ рдпреВрдПрдХреНрд╕ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХреВрдВ рдЬреЛ рдореИрдВ рдЪрд╛рд╣рддрд╛ рдерд╛ рдФрд░ react-window рд╕рд╛рде рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдХрдЖрд░реНрдб рд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рдирд╣реАрдВ рдерд╛ред

рдореИрдВрдиреЗ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ рд╕рд┐рд░реНрдл рд╡рд╛рдпрд░рд▓рд╛рдЗрдЬреЗрд╢рди рд▓реЙрдЬрд┐рдХ рдХреЛ рдПрдХ рд╣реБрдХ рд╕реЗ рдирд┐рдХрд╛рд▓рдиреЗ рдФрд░ рдЗрд╕реЗ рджреЛ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╣реЗрдбрд░ рдХреЗ рд▓рд┐рдП рдФрд░ рджреВрд╕рд░рд╛ рдХрдВрдЯреЗрдВрдЯ рдХреЗ рд▓рд┐рдП, рдЬреЛ рдКрдкрд░ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдХреЗ рд╕рдорд╛рди рд╣реИред рдореЗрд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рджреВрд╕рд░реА рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЕрднреА рднреА рдорд╛рд░реНрдХрдЕрдк рдореЗрдВ рдЗрд╕рдХреЗ рд╣реЗрдбрд░ рдереЗ, рд▓реЗрдХрд┐рди рдиреЗрддреНрд░рд╣реАрди рдЫрд┐рдкреЗ рд╣реБрдП рдереЗ рддрд╛рдХрд┐ рдпрд╣ рд╕реБрд▓рдн рд░рд╣реЗ, рдЬрдмрдХрд┐ рдкрд╣рд▓реЗ рд╡рд╛рд▓реЗ рд╣реЗрдбрд░ рдХреЗрд╡рд▓ рджреЗрдЦреЗ рдЧрдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдереЗ рдФрд░ рд╕реНрдереИрддрд┐рдХ рд░реВрдк рд╕реЗ рдЪрд┐рдкрдХреЗ рд╣реБрдП рдереЗред рдПрдХ рдЖрдХрд░реНрд╖рдг рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд┐рдпрд╛, рдФрд░ рдХреЛрдб рдХрд╛рдлреА рд╕рд░рд▓ рдерд╛ред

рдЕрдЧрд░ рдХреЛрдИ рдРрд╕рд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рддреЛ рдмрд╕ рдЙрд╕реЗ рд╡рд╣реАрдВ рдлреЗрдВрдХ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред

@piecyk рдпрд╣ рдПрдХ рдорд╣рд╛рди рд╣реИ, рдмрд╣реБрдд рд╣реА https://virtuoso.dev/grouped-by-first-letter/

рдореБрдЭреЗ рдкреВрд░реНрдг / рд╢реАрд░реНрд╖ рдХреЗ рд╕рд╛рде рдкреВрд░реЗ рдХрдВрдЯреЗрдирд░ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╡рд╛рд▓реА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрд░реЛрдо рдХреЗ рд╕рд╛рде рдПрдХ рдкреВрд░реНрдг рдСрдбрд┐рдЯ рдЪрд▓рд╛рдиреЗ рд╕реЗ рдореБрдЭреЗ рд╕реАрдПрд▓рдПрд╕ рдХреА рд╕рдорд╕реНрдпрд╛рдПрдВ https://b6udg.csb.app/ (рднрд▓реЗ рд╣реА рдПрдХ рдмрдбрд╝реЗ рдЖрдХрд╛рд░ рдХрд╛ рдХрдВрдЯреЗрдирд░ рд╣реЛ)ред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдкреИрдбрд┐рдВрдЧ-рдЯреЙрдк / рдмреЙрдЯрдо рдХреЗ рд╕рд╛рде рдХреЛрдИ CLS рдирд╣реАрдВ рд╣реИ!

рдореИрдВ рд╕реНрд╡рдпрдВ рдЗрд╕рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдВрдЧрд╛ рдФрд░ рдЬрд▓реНрдж рд╣реА рдХреБрдЫ рд╕рдордп рдХреЗ рдЕрдВрддрд░ рдХреЛ рдорд╛рдкреВрдВрдЧрд╛ред

@pupudu рдореИрдВ рдЖрдкрдХреЗ рдЦреБрд▓реЗ рд╕реНрд░реЛрдд рдХреЗ рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЕрдкрдиреЗ рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреЗрдЦрд╛ рд╣реИред рдореИрдВ рдмрд╕ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рд╕реБрдкрд░ рд╕реАрдзреА рдмрд╛рдд рджреВрд╕рд░реЗ рд▓реЛрдЧ рдЦреЛрдЬ рд░рд╣реЗ рдереЗ: рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓реЗрдХрд┐рди рддрд╛рд▓рд┐рдХрд╛ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рдеред

рдмрд╛рд╣рд░ рдореБрдбрд╝рддрд╛ рд╣реИ рдореИрдВ рдХреЛрдб рдХреЗ рдПрдХ рдмрд╣реБрдд рдЫреЛрдЯреЗ рд╕реЗ, рдФрд░ рдмрд╣реБрдд рд░рдЪрдирд╛рддреНрдордХрддрд╛ рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдЦреАрдВрдЪрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред рдХреЛрдб рдЗрддрдирд╛ рд╕рд░рд▓ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдХреЛ рднреА рдХреЙрдкреА / рдкреЗрд╕реНрдЯ рдХрд░рдиреЗ рдФрд░ рдЕрдкрдиреА рдкрд╕рдВрдж рдХреЛ рдмрдврд╝рд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред @bvaughn рдХреИрд╕реЗ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдпрджрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рдмрд╣реБрдд рд╣реА рдорд╛рдореВрд▓реА рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдмрд╣реБрдд рдорд╛рдореВрд▓реА рд╣реИред

_ рдпрд╣ рдЫреЛрдЯрд╛ рд╣реИ:

  • рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдХреА "рд╢реАрд░реНрд╖" рд╢реИрд▓реА рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░реЗрдВ
  • рдЙрд╕ рдореВрд▓реНрдп рдХреЛ React.Context рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░реЗрдВ рддрд╛рдХрд┐ рд╣рдо рдЗрд╕реЗ рдкрд╛рд╕ рдХрд░ рд╕рдХреЗрдВ
  • рдорд╛рди рдХреЛ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдШрдЯрдХ рдкрд░ рд▓рд╛рдЧреВ рдХрд░реЗрдВ рдЬреЛ рд╡рд╣ рд╣реЛрдЧрд╛ рдЬреЛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдмрдЬрд╛рдп рд╕реНрд╡рдпрдВ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ
  • рд╣реЗрдбрд░ рдФрд░ рдлреВрдЯрд░ рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрд▓реЙрдЯ рдЬреЛрдбрд╝реЗрдВред
  • рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдПрд░реНрдЧреЛрдиреЙрдорд┐рдХреНрд╕ рдЪреАрдЬреЛрдВ рдХреЛ рдмрдбрд╝реЗ рдХрд░реАрдиреЗ рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП React.Context рдХреНрд░реЙрд╕ рдШрдЯрдХ рд╕рдВрдЪрд╛рд░ рдХреЛ рдкрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реАрд░реЛ рд╣реИред

рд╡рд░реНрдХрд┐рдВрдЧ рдХреЛрдб рд╕реИрдВрдбрдмреЙрдХреНрд╕: https://codesandbox.io/s/react-window-with-table-elements-n8686o

рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рдХреЛрдб

import React from 'react'
import { useState, useRef, useContext } from 'react'
import { FixedSizeList, FixedSizeListProps } from 'react-window'
import { render } from 'react-dom'

/** Context for cross component communication */
const VirtualTableContext = React.createContext<{
  top: number
  setTop: (top: number) => void
  header: React.ReactNode
  footer: React.ReactNode
}>({
  top: 0,
  setTop: (value: number) => {},
  header: <></>,
  footer: <></>,
})

/** The virtual table. It basically accepts all of the same params as the original FixedSizeList.*/
function VirtualTable({
  row,
  header,
  footer,
  ...rest
}: {
  header?: React.ReactNode
  footer?: React.ReactNode
  row: FixedSizeListProps['children']
} & Omit<FixedSizeListProps, 'children' | 'innerElementType'>) {
  const listRef = useRef<FixedSizeList | null>()
  const [top, setTop] = useState(0)

  return (
    <VirtualTableContext.Provider value={{ top, setTop, header, footer }}>
      <FixedSizeList
        {...rest}
        innerElementType={Inner}
        onItemsRendered={props => {
          const style =
            listRef.current &&
            // @ts-ignore private method access
            listRef.current._getItemStyle(props.overscanStartIndex)
          setTop((style && style.top) || 0)

          // Call the original callback
          rest.onItemsRendered && rest.onItemsRendered(props)
        }}
        ref={el => (listRef.current = el)}
      >
        {row}
      </FixedSizeList>
    </VirtualTableContext.Provider>
  )
}

/** The Row component. This should be a table row, and noted that we don't use the style that regular `react-window` examples pass in.*/
function Row({ index }: { index: number }) {
  return (
    <tr>
      {/** Make sure your table rows are the same height as what you passed into the list... */}
      <td style={{ height: '36px' }}>Row {index}</td>
      <td>Col 2</td>
      <td>Col 3</td>
      <td>Col 4</td>
    </tr>
  )
}

/**
 * The Inner component of the virtual list. This is the "Magic".
 * Capture what would have been the top elements position and apply it to the table.
 * Other than that, render an optional header and footer.
 **/
const Inner = React.forwardRef<HTMLDivElement, React.HTMLProps<HTMLDivElement>>(
  function Inner({ children, ...rest }, ref) {
    const { header, footer, top } = useContext(VirtualTableContext)
    return (
      <div {...rest} ref={ref}>
        <table style={{ top, position: 'absolute', width: '100%' }}>
          {header}
          <tbody>{children}</tbody>
          {footer}
        </table>
      </div>
    )
  }
)

/**
 * Render Our Example
 **/
render(
  <VirtualTable
    height={300}
    width="100%"
    itemCount={1000}
    itemSize={36}
    header={
      <thead>
        <tr>
          <th>Index</th>
          <th>Header 2</th>
          <th>Header 3</th>
          <th>Header 4</th>
        </tr>
      </thead>
    }
    row={Row}
    footer={
      <tfoot>
        <tr>
          <td>Footer 1</td>
          <td>Footer 2</td>
          <td>Footer 3</td>
          <td>Footer 4</td>
        </tr>
      </tfoot>
    }
  />,
  document.querySelector('main')
)

рдЗрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдХреНрдпрд╛ рдХрд┐рд╕реА рдиреЗ (рд╕рдлрд▓рддрд╛ рдХреЗ рд╕рд╛рде) InfiniteLoader рдШрдЯрдХ рдХреЗ рд╕рд╛рде рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ? ... рдореИрдВрдиреЗ рдЗрд╕реЗ рдЪрд╛рд░реЛрдВ рдУрд░ рд╕реЗ рд▓рд╛рдд рдорд╛рд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЖрдВрддрд░рд┐рдХ "рдЖрд╡рд░рдг" рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЬреЛ рдХрд┐ рдореИрдВ рдорд╛рди рд▓реЗрдВ рдХреНрдпреЛрдВрдХрд┐ рдЕрдирдВрдд рд▓реЛрдбрд░ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЗрдирд░ рдХреНрд▓реЗрдореЗрдВрдЯрдЯрд╛рдЗрдк рд╕реЗ рдЧреБрдЬрд░ рд░рд╣рд╛ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

carolin913 picture carolin913  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

daihuaye picture daihuaye  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

migueloller picture migueloller  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

janhesters picture janhesters  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

delateurj picture delateurj  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ