Работает ли реактивная виртуализация внутри функционального компонента?

Я спрашиваю, потому что все примеры, которые я видел, относятся к классам es6.

И: я преобразовал свой класс es6 в функциональный компонент. Теперь строки больше не появляются. И ошибки тоже нет. Похоже, что средство визуализации строк просто больше не отображает строки.


person Alex    schedule 06.03.2017    source источник
comment
Да, реактивная виртуализация работает внутри компонентов класса или функции. Возможно, вам больше повезет получить помощь в конкретной ситуации, если вы дадите ссылку на Plnkr, который показывает некоторый код и проблему, которую вы описываете.   -  person bvaughn    schedule 06.03.2017
comment
спасибо @brianvaughn, тогда я, должно быть, испортил свой код. И БОЛЬШОЕ СПАСИБО за этот замечательный инструмент!   -  person Alex    schedule 08.03.2017


Ответы (1)


Да, вы можете использовать функциональный компонент с react-virtualized

Он работает так же хорошо, как классовый компонент? Понятия не имею, расскажите в комментариях ;)

Пример:

import React from 'react'
import {Grid, Typography} from '@material-ui/core'
import PackageItem from './PackageItem'
import {PackagesByCategory} from '../functions/src/types'
import {makeStyles} from '@material-ui/core/styles'
import {WindowScroller, AutoSizer, List, ListRowRenderer, CellMeasurer, CellMeasurerCache} from 'react-virtualized'


const useStyles = makeStyles(theme => ({
    container: {
        minHeight: "80vh",
        width: "100%"
    },
    title: {
        marginTop: 64,
    },
}))

const cache = new CellMeasurerCache({
    defaultHeight: 60,
    fixedWidth: true
});


const PackageCategoriesList = ({packagesByCategories}: PackageCategoriesList) => {
    const classes = useStyles()

    if(!packagesByCategories) {
        return <></>
    }

    const rowRender: ListRowRenderer = ({index, key, style, parent}) => {
        const packageByCategory = packagesByCategories[index]

        return <CellMeasurer
            cache={cache}
            columnIndex={0}
            key={key}
            overscanRowCount={10}
            parent={parent}
            rowIndex={index}
        >
            <Grid item key={key} style={style}>
                    <Typography variant="h1" className={classes.title}>
                        {packageByCategory.category.name}
                    </Typography>
                </Grid>
        </CellMeasurer>
    }

    return <div className={classes.container}>
        <WindowScroller
            scrollElement={window}>
            {({height, isScrolling, registerChild, onChildScroll, scrollTop}) => (
                <div className={classes.list}>
                    {console.log("re der list" , height, isScrolling, scrollTop)}
                    <AutoSizer disableHeight>
                        {({width}) => (
                            <div ref={registerChild}>
                                <List
                                    autoHeight
                                    height={height}
                                    isScrolling={isScrolling}
                                    onScroll={onChildScroll}
                                    overscanRowCount={2}
                                    rowCount={packagesByCategories.length}
                                    rowHeight={cache.rowHeight}
                                    rowRenderer={rowRender}
                                    scrollTop={scrollTop}
                                    width={width}
                                />
                            </div>
                        )}
                    </AutoSizer>
                </div>
            )}
        </WindowScroller>

    </div>
}

export default PackageCategoriesList

person Hugo Gresse    schedule 17.10.2020
comment
Хороший ответ, есть идеи, как к нему подойти, если вам нужно предоставить keyMapper, а keyMapper зависит от реквизита функционального компонента? Обратите внимание, что ему не нужно каждый раз воссоздавать кеш, так как это, предположительно, дорого и приведет к повторному рендерингу любых дочерних компонентов, в которые вы передаете кеш, что может быть ненужным. - person Tim Trewartha; 28.04.2021
comment
Никогда не использовал keyMapper, но, возможно, у вас также может быть собственная система кэширования, если вам нужны более конкретные функции. - person Hugo Gresse; 29.04.2021