React는 어떻게 빅데이터 양의 목록을 렌더링합니까?
그러나 만약 당신이 수천 수만 개의 데이터를 동시에 전시해야 한다면, 브라우저가 끊기고, 프레임을 잃어버리고, 심지어는 끊기는 문제를 초래할 것이다.
본고는react-virtualized를 이용하여 빅데이터 양의 목록을 효율적으로 렌더링하는 것을 소개할 것이다.
시작합시다!
우선 React 애플리케이션 생성
create-react-app virtualization
적용은 다음과 같은 1000개의 의견을 표시합니다.
타사 라이브러리 lorem-ipsum을 도입하여 아날로그 데이터를 생성합니다.
cd virtualization
npm install --save lorem-ipsum
src/App.js
에 lorem-ipsum
도입:import loremIpsum from 'lorem-ipsum';
다음은 1000개의 데이터 배열입니다.
const rowCount = 1000;
class App extends Component {
constructor() {
super();
this.list = Array(rowCount).fill().map((val, idx) => {
return {
id: idx,
name: 'John Doe',
image: 'http://via.placeholder.com/40',
text: loremIpsum({
count: 1,
units: 'sentences',
sentenceLowerBound: 4,
sentenceUpperBound: 8
})
}
});
}
//...
}
각 데이터는
id
,
,
, 4~8
으로 구성됩니다.render()
에서 이 그룹을 사용합니다.render() {
return (
<div className="App">
<header className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<h1 className="App-title">Welcome to Reacth1>
header>
<div className="list">
{this.list.map(this.renderRow.bind(this))}
div>
div>
);
}
renderRow()
을 추가하여 열을 만듭니다.renderRow(item) {
return (
<div key={item.id} className="row">
<div className="image">
<img src={item.image} alt="" />
div>
<div className="content">
<div>{item.name}div>
<div>{item.text}div>
div>
div>
);
}
src/App.css
에 스타일 추가:.list {
padding: 10px;
}
.row {
border-bottom: 1px solid #ebeced;
text-align: left;
margin: 5px 0;
display: flex;
align-items: center;
}
.image {
margin-right: 10px;
}
.content {
padding: 10px;
}
자, 시작 프로젝트
yarn start
은 다음과 같은 화면을 볼 수 있습니다.요소를 살펴보면
DOM
에 div
이 많이 마운트되어 있습니다.저희가 성능을 측정해 보도록 하겠습니다.
만약 당신이 크롬을 사용한다면, 몇 걸음으로 성능을 빠르게 테스트할 수 있습니다.
render
드롭다운 상자에서 Show Rendering
을 선택합니다.render
쪽, FPS Meter
앞체크.이어서 리얼리티-virtualized가 어떻게 성능을 향상시켰는지 살펴볼까요?
react-virtualized 원리
핵심 원리: 네가 본 것만 과장한다.
위의 앱은 1000개의 댓글을 덧붙였지만, 화면에는 10여 개의 데이터만 보여 주었고, 나머지 990개의 댓글은 낭비였다.
만약 우리가 보이는 평론만 과장한다면, 마우스를 굴려서 더 많은 것을 볼 때, 새로운 노드를 낡은 노드로 바꿉니다.이렇게 하면 성능 병목의 문제를 완벽하게 해결할 수 있다.
어떻게 쓰지?
먼저
src/App.js
에 List
구성 요소를 도입합니다.import { List } from "react-virtualized";
기존 코드
render()
교체:
{this.list.map(this.renderRow.bind(this))}
List
구성 요소 사용const listHeight = 600;
const rowHeight = 50;
const rowWidth = 800;
//...
"list">
<List
width={rowWidth}
height={listHeight}
rowHeight={rowHeight}
rowRenderer={this.renderRow.bind(this)}
rowCount={this.list.length} />
div>
renderRow()
:
renderRow({ index, key, style }) {
return (
<div key={key} style={style} className="row">
<div className="image">
<img src={this.list[index].image} alt="" />
div>
<div className="content">
<div>{this.list[index].name}div>
<div>{this.list[index].text}div>
div>
div>
);
}
애플리케이션 시작 yarn start
:
요소를 보려면 다음과 같이 하십시오.
보이는 요소만 렌더링된 것을 볼 수 있습니다.
성능은 어떤가요?
위의 동일한 방법으로 테스트:
기본적으로 60프레임 정도 유지되는 것을 볼 수 있다.성능(^ ^)
이상은react-virtualized의 간단한 응용일 뿐입니다. 관심이 있으면 한번 해 보세요!
읽어주셔서 감사합니다!
Esteban Herrera의 Rendering large lists with React Virtualized
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.