Каково мое требование: у меня есть несколько изображений в моей внешней папке, и мне нужно импортировать в компонент и отображать его, а также использовать Виртуальный свиток, здесь я должен отображать 1 строку в div, и в этой 1 строке должно отображаться 5-6 изображений
Что я сделал: я использовал изображения, используя контекст из внешней папки, и показывал изображения в 1 строке в div и 5-6 изображений, но я столкнулся с проблемой, не могу установить для нее значение Виртуальная прокрутка.
поскольку я проверил плагин реактивной виртуализации и реактивного окна, но я не уверен, как мои данные используются в этом формате
После использования изображений react-tiny-virtual-list они складываются
ниже мой код
class App extends React.Component{
state = {
Response:[],
}
importAll(r) {
return r.keys().map(r);
}
componentWillMount() {
let data = this.importAll(require.context('./imageFolder/', false, /\.(png|jpe?g|svg)$/));
this.setState({ Response:data})
}
render(){
return(
<div className = "container" id = "imagecontainer">
<div className = "viewport">
{this.state.Response.map((image, index) => <img key = {index} src = {image} alt = "info"></img> )} }
</div>
</div>
)
}
.container {
padding: 0% 6%;
height: 400px;
}
.viewport {
height: -webkit-fill-available;
width: 100%;
border: 1px solid black;
overflow: scroll;
}
img {
height: 250px;
width: 150px;
padding: 35px;
}
After implementing React-tiny-list
<div id = "container">
<div id = "viewport">
<VirtualList
height='400px'
width='100%'
itemCount = {this.state.items.length}
itemSize = {20} // Also supports variable heights (array or function getter)
style = {{padding:'20px'}}
renderItem = {({index, style}) =>
<div key = {index} style = {style}>
<img key = {index} src = {this.state.items[index]} alt = "info"></img>
</div>
}
/>
</div>
</div>



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Если у вас возникли проблемы с реализацией виртуальной прокрутки, обратите внимание, что при этом важен порядок импорта, поэтому обратите на это внимание — это может способствовать вашей проблеме. (Кроме того, существует npm-плагин для реализации виртуального списка.)
Обзор порядка импорта для виртуальной прокрутки:
import * as React from 'react';
import Paper from '@material-ui/core/Paper';
import {
Grid,
VirtualTable,
TableHeaderRow,
} [from material ui];
import {
your-components
} from 'your-path';
(выше не конкретно, просто примерное руководство по порядку)
Вы также можете использовать ScrollView, если вы не можете реализовать «виртуальную прокрутку». Следующий стиль даст вам горизонтальную прокрутку (в отличие от вертикальной по умолчанию), чтобы вы могли отображать свои изображения в строке с горизонтальной прокруткой.
<ScrollView horizontal = {true}>
Надеюсь это поможет
Представление прокрутки предназначено для правильного реагирования, и я проверил плагин npm, он кое-что работал, но в результате были сгенерированы сложенные изображения, пожалуйста, проверьте обновленный вопрос
вы также можете использовать плагин https://github.com/bvaughn/реакт-виртуализированный, если вы хотите отобразить это как таблицу, вы можете выбрать список или вы также можете выбрать сетку. Для вашего требования я рекомендую использовать Каменная кладка из «реагирующей виртуализации»;
ниже образец для отображения
import React from 'react';
import {
CellMeasurer,
CellMeasurerCache,
createMasonryCellPositioner,
Masonry
} from 'react-virtualized';
import 'react-virtualized/styles.css';
var images = [];
const columnWidth = 250;
const defaultHeight = 260;
const defaultWidth = columnWidth;
const cache = new CellMeasurerCache({
defaultHeight,
defaultWidth,
fixedWidth: true
})
// Our masonry layout will use 3 columns with a 10px gutter between
const cellPositioner = createMasonryCellPositioner({
cellMeasurerCache: cache,
columnCount: 4,
columnWidth,
spacer: 27
})
function cellRenderer ({ index, key, parent, style }) {
const datum = images[index]
const height = columnWidth || defaultHeight ;
return (
<CellMeasurer
cache = {cache}
index = {index}
key = {key}
parent = {parent}
>
<div style = {style}>
<img
src = {datum}
style = {{
height: height,
width: columnWidth,
display: "block"
}}
alt = "info"
/>
</div>
</CellMeasurer>
)
}
class Grid extends React.Component{
importAll(r) {
return r.keys().map(r);
}
componentWillMount() {
images = this.importAll(require.context('../imageFolder/', false, /\.(png|jpe?g|svg)$/));
}
render(){
return(
<div id = "container">
<div id = "viewport">
<Masonry
cellCount = {images.length}
cellMeasurerCache = {cache}
cellPositioner = {cellPositioner}
cellRenderer = {cellRenderer}
height = {400}
width = {1320}
/>
</div>
</div>
)
}
}
export default Grid;
Я надеюсь, что это решит вашу проблему
Хорошо, позвольте мне попробовать
Это работает, так что такой формат хорош, но все же я могу сделать некоторые улучшения.
какие улучшения вам нужны?
Некоторые css, как и приведенный выше, используют собственный css, поэтому мне нужно проверить
конечно плагин дает свой css но все же вы можете его отредактировать
изменить
componentWillMountнаcomponentDidMount