์๋๋ก์ด๋์ Recycler view
RecyclerView์ ์๋ ์๋ฆฌ
RecyclerView๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ViewHolder ํจํด์ ์ฌ์ฉํ์ฌ ํญ๋ชฉ ๋ทฐ์ ์ฌํ์ฉ์ ๊ด๋ฆฌํฉ๋๋ค. ์ด๋ ์คํฌ๋กค ์ ๊ธฐ์กด์ ๋ทฐ๋ฅผ ์ฌํ์ฉํจ์ผ๋ก์จ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ต์ํํ๊ณ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฆฌ์คํธ์ ์ฒซ ๋ฒ์งธ ํญ๋ชฉ์ด ํ๋ฉด์์ ๋ฒ์ด๋๋ฉด ํด๋น ๋ทฐ๋ฅผ ์๋ก์ด ํญ๋ชฉ์ ์ฌ์ฌ์ฉํฉ๋๋ค.
ย
ย
ย
import React from 'react'; import {FixedSizeList as List} from 'react-window'; interface Base { id?: string | number; } interface Props<T> { itemCount: number; itemSize: number; items: (T & Base)[]; renderItem: (item: T, index: number) => React.ReactNode; keyExtractor?: (item: T) => string; initialNumToRender?: number; } function RecyclerView<T>({ itemCount, items, renderItem, keyExtractor, initialNumToRender, itemSize, }: Props<T>) { return ( <List height={itemSize * ((initialNumToRender || itemCount) - 1)} overscanCount={0} itemCount={itemCount} itemSize={itemSize} width='100%' > {({index, style}) => { const item = items[index]; return ( <div style={style} key={keyExtractor ? keyExtractor(item) : item.id}> {renderItem(item, index)} </div> ); }} </List> ); } export default RecyclerView;
ย
์ ์ฝ๋๋ reactwindow ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ์ฉํ ๋ชจ์ต.
List ์ปดํฌ๋ํธ๋ฅผ wrappingํ๋๋ฐ
๋ฐ๋ณต์ ์ธ ๋ฐฐ์ด ์์๋ฅผ ๋๋๋งํด์ ๋ฆฌํดํ๋ ๋ถ๋ถ์ด ์ธ์์ ์.
๋ List๋ฅผ ์ฌ์ฉํด map์ ์ฌ์ฉ์ํ๊ณ ๋ ๋ฐฐ์ด ๋๋๋งํจ.
์ฌ์ฌ์ฉ์ฑ์ด ์ง์ง ๋์๋ณด์ธ๋ค.
ย
์๋๋ ํ์ฉ.
import React, {useEffect, useState} from 'react'; import RecyclerView from "./RecyclerView"; interface Source { id?: string; name: string; } interface Feed { author?: string; content: string; description: string; publishedAt: string; source: Source; title: string; url: string; urlToImage?: string; } type Feeds = Feed[]; const NewsFeed: React.FC = () => { const [feeds, setFeeds] = useState<Feeds>([]); useEffect(() => { // Example of fetching data from an API endpoint fetch('https://newsapi.org/v2/top-headlines?country=us', { headers: { "X-Api-Key": "9f6482a584804376874b848980b7a044" } }) .then(response => response.json()) .then(data => { setFeeds(data.articles); }); }, []); return ( <div className="news-feed-container"> {feeds.length === 0 ? ( <p>Loading...</p> ) : ( <RecyclerView initialNumToRender={3} keyExtractor={(item) => item.title} itemCount={feeds.length} items={feeds} itemSize={300} renderItem={(feed,) => ( <div key={feed.url} className="news-feed-item"> <h2>{feed.title}</h2> <p><strong>Author:</strong> {feed.author || 'Unknown'}</p> <p><strong>Source:</strong> {feed.source.name}</p> <p>{feed.description}</p> <p>{feed.content}</p> <a href={feed.url} target="_blank" rel="noopener noreferrer">Read more</a> <img src={feed.urlToImage} alt={feed.title}/> <p><strong>Published At:</strong> {new Date(feed.publishedAt).toLocaleString()}</p> </div> ) }/> )} </div> ); } export default NewsFeed;
ย
ย
react window๋ฅผ ์ฌ์ฉํด ๋ณด์ด์ง ์๋ ๋ถ๋ถ ๋๋๋ง ํ์ง ์๊ธฐ
ย
โฃ
ย

