Как создать виртуальную прокрутку изображений с помощью React js

Каково мое требование: у меня есть несколько изображений в моей внешней папке, и мне нужно импортировать в компонент и отображать его, а также использовать Виртуальный свиток, здесь я должен отображать 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>

изменить componentWillMount на componentDidMount

Junius L. 26.05.2019 21:17
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
1
3 891
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если у вас возникли проблемы с реализацией виртуальной прокрутки, обратите внимание, что при этом важен порядок импорта, поэтому обратите на это внимание — это может способствовать вашей проблеме. (Кроме того, существует 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, он кое-что работал, но в результате были сгенерированы сложенные изображения, пожалуйста, проверьте обновленный вопрос

Madpop 27.05.2019 18:45
Ответ принят как подходящий

вы также можете использовать плагин 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;

Я надеюсь, что это решит вашу проблему

Хорошо, позвольте мне попробовать

Madpop 29.05.2019 07:10

Это работает, так что такой формат хорош, но все же я могу сделать некоторые улучшения.

Madpop 29.05.2019 07:19

какие улучшения вам нужны?

Phani 29.05.2019 07:20

Некоторые css, как и приведенный выше, используют собственный css, поэтому мне нужно проверить

Madpop 29.05.2019 07:30

конечно плагин дает свой css но все же вы можете его отредактировать

Phani 29.05.2019 07:34

Другие вопросы по теме