๊ธฐ์กด ๋ชฉ๋ก ๋ฐ ๊ทธ๋ฆฌ๋ ๊ตฌ์ฑ ์์์ ๋น์ฉ์ ์ถ๊ฐํ์ง ์์ผ๋ ค๋ฉด ์ ๋ณํ์ ๋ง๋ญ๋๋ค (์ : DynamicSizeList
๋ฐ DynamicSizeGrid
). ์ด ๋ณํ์ ์ปค๋ฐ ๋จ๊ณ ๋์ ์ฝํ
์ธ ๋ฅผ ์๋์ผ๋ก ์ธก์ ํด์ผํฉ๋๋ค.
์ด๊ธฐ ๊ตฌํ์ CellMeasurer
๊ฐ ๋ฐ์ ๊ฐ์ํ์์ ์๋ํ๋ ๋ฐฉ์๊ณผ ์ ์ฌํ๊ฒ ์๋ ํ ์ ์์ต๋๋ค.
์์ ์ธ ๋ฒ์งธ ์ ์ฝ ์กฐ๊ฑด์ ์ ๊ฑฐํ์ฌ ์ด์ ํญ๋ชฉ์ ์ธก์ ํ์ง ์๊ณ ์์ ์ก์ธ์ค (ํญ๋ชฉ ์ธ๋ฑ์ค ๋๋ ์คํฌ๋กค ์คํ์ )๋ฅผ ํ์ฉํ๋ฉด์ด ๊ตฌ์ฑ ์์๊ฐ ๋ ์ ์ํ ๋ ์ ์์ต๋๋ค. ์ด๊ฒ์ ์ฑํ ์์ฉ ํ๋ก๊ทธ๋จ๊ณผ ๊ฐ์ ์ฌ์ฉ ์ฌ๋ก์์ ๋ฐ์ ์ฐฝ์ ํจ์ฌ ๋ ์ฑ๋ฅ์๊ฒ ๋ง๋ญ๋๋ค.
๋ํ ResizeObserver ๋ฅผ ์ฌ์ฉํ์ฌ ( react-measure ๋ฅผ ํตํด) ํญ๋ชฉ ํฌ๊ธฐ๋ฅผ ์๋์ผ๋ก ๊ฐ์งํ๊ณ ์์น ๋ฐ ์ธก์ ์บ์๋ฅผ ์์ ํ ์ ๊ฑฐํ๋ ๊ธฐ๋ฅ์ ์ ๊ธ ํด์ ํฉ๋๋ค. ์ด๋ ๊ฒํ๋ฉด ์บ์ ๋ ์ธก์ ์ ๊ฐ์ ๋ก ์ฌ์ค์ ํ ํ์๊ฐ ์์ด์ง๊ณ API๊ฐ ํฌ๊ฒ ํฅ์๋ฉ๋๋ค.
์์ ์์ ์ด ๊ฐ๋ฅํ๋ ค๋ฉด ๋์ ๋ชฉ๋ก / ๊ทธ๋ฆฌ๋ ๊ตฌ์ฑ ์์๊ฐ ์คํ์ ์ ์ธ๋ฑ์ค์ ๋งคํํ๋ ๋ฐ ๊ทน์ ์ผ๋ก ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํด์ผํ๋ฉฐ ๊ทธ ๋ฐ๋์ ๊ฒฝ์ฐ๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. ( react-virtualized์ "scroll anchoring"์ ๋ํ์ด ์ฃผ์ ์๋ ๋ฉ์ง ๋น์ฃผ์ผ์ด ์์ต๋๋ค.) ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ์์ ์ ์ํํด์ผํฉ๋๋ค.
estimatedItemSize
์ํ์ ๊ณฑํ ํญ๋ชฉ ์๋ฅผ ๊ธฐ์ค์ผ๋ก ์ด ํฌ๊ธฐ๋ฅผ ์ถ์ ํฉ๋๋ค. (์๋์ ์ค๋ช
๋ ๋งคํ์ด ๋ชจํธํ์ง ์๊ธฐ ๋๋ฌธ์์ด ์์ ํฌ๊ธฐ๋ ์กฐ์ ํ ํ์๊ฐ ์์ต๋๋ค.)
์คํฌ๋กค ์์น๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์ ์คํ์ ์ ์ด์ ์คํ์ ๊ณผ ๋น๊ตํฉ๋๋ค. ๋ธํ๊ฐ [๊ฒฐ์ ์์ ] ์๊ณ ๊ฐ๋ณด๋ค ํฌ๋ฉด ์ ์คํ์ ์ "์คํฌ๋กค ์ต์ปค"๋ก ์ค์ ํฉ๋๋ค. ์คํ์ ์ ์์ ์ธ๋ฑ์ค์ ๋งคํํฉ๋๋ค (์ : ์คํ์ ์ ์ด ์์ ์คํฌ๋กค ๊ฐ๋ฅ ํฌ๊ธฐ๋ก ๋๋๊ณ ์ปฌ๋ ์ ์ ํญ๋ชฉ ์๋ก ๊ณฑํฉ๋๋ค). ์ด ๋งคํ ๋ ์ธ๋ฑ์ค๋ฅผ "์ต์ปค ์ธ๋ฑ์ค"๋ก ์ ์ฅํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์๋ ์ด๋ฏธ์ง์ ์ค๋ช ๋ ๋ชฉ๋ก์ 250 ๊ฐ์ ํญ๋ชฉ์ด์๋ ๊ฒฝ์ฐ "์ต์ปค ์ธ๋ฑ์ค"๋ 132๊ฐ๋ฉ๋๋ค.
์์ ์ ๊ทผ ๋ฐฉ์์๋ ๋จ ํ๋์ ์ฃผ์ ๋จ์ ์ด ์์ต๋๋ค. ๋ชฉ๋ก ๊ฒฝ๊ณ์์ ํญ๋ชฉ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ ๋ ฌํ๋ ๊ฒ์ ๋๋ค. ํญ๋ชฉ ์ธ๋ฑ์ค๊ฐ ์ถ์ ๋๋ ๊ฒฝ์ฐ (์์์ ์ค๋ช ํ๋๋ก) ์คํฌ๋กค ๊ฐ๋ฅ ์์ญ์ ์์ ๋๋ ๋๊ณผ ์ ํํ ์ผ์นํ์ง ์์ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
์์ ์ ๊ทผ ๋ฐฉ์์ผ๋ก ์ฌ์ ํ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌ๋์ง ์๋ ํ ๊ฐ์ง ๊ฒฝ์ฐ๋ "์์ ์์ญ"์ธ๋ถ์ ์ค์ ๋ ์คํฌ๋กค ์ต์ปค์ด์ง๋ง ์์ ์์ญ ๋ด๋ถ์์๋ ํ์ฌ ์คํฌ๋กค์
๋๋ค (์๋ ์ฐธ์กฐ). ์ฌ์ฉ์๊ฐ ๋ชฉ๋ก์ ์์ ๋ถ๋ถ์ผ๋ก ์ฒ์ฒํ ๋ค๋ก ์คํฌ๋กคํ๋ฉด ์คํฌ๋กค ๋ฒ๋ฒ
๊ฑฐ๋ฆผ์์ด ์ฒซ ๋ฒ์งธ ์
์ 0์ ๋ง์ถ๊ธฐ๊ฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค.
์งํ์ค์ธ MVP๋ https://github.com/bvaughn/react-window/compare/master...issues/6 ์์
๋๋ mui-downshift ๋ด์์ ์ด๊ฒ์ ์ฌ์ฉํ๊ณ ํ์ฌ ์ฌ์ ํ UNSAFE_componentWillReceiveProps
ํ๊ณ ์์ง๋ง ๊ฐ๊น์ด ์ฅ๋์ (๋์ ์ฝํ
์ธ ๋์ด๋ฅผ ์ฌ์ฉํ ์์๊ฒ๋๋ฉด) react-window
๋ก ์ด์ ํ ๊ณํ์
๋๋ค.
์ด๊ฒ์ IOS์ UITableView์์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฉ์ปค๋์ฆ์ ๋๊น?
@luoboding ๊ทํ์ ์ง๋ฌธ์ ์ดํดํ์ง ๋ชปํฉ๋๋ค. ์์ธํ ์ค๋ช ํด ์ฃผ์๊ฒ ์ต๋๊น?
@bvaughn ์ฃ์กํฉ๋๋ค, ๋ด ์น๊ตฌ, ๋ด ์์ด๋๋ณ๋ก ์ข์ง ์์ต๋๋ค.
๋ด ํ๋ก์ ํธ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ ํ ์์์ ์์ฒ ๊ฐ์ ์ต์ ์ด ์์ต๋๋ค. ํ์ด์ง๋ฅผ ๋ค์๋ก๋ ํ ๋ ๋งค์ฐ ๋๋ฆฌ๊ณ ์ผ์ด ๋ฐ์ํฉ๋๋ค. ๋ ๋์ ๊ตฌ์ฑ ์์๋ฅผ ์์ฑํ๋ ค๊ณ ํ์ต๋๋ค. IOS ๊ฐ๋ฐ์์์ผ๋ฉฐ โโ๋ค์์์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฉ์ปค๋์ฆ์ ์๊ณ ์์ต๋๋ค. IOS์ UITableView, 500px ๋์ด ์ ํ ์์๊ฐ ํ์ํ ๊ฒฝ์ฐ ์ต์ ์์์ ๋์ด๋ฅผ 100px๋ก ๊ตฌ์ฑํ๋ฏ๋ก ์ต์ ์์ ์์ ๋๊ธฐ์ด ์ฉ๋ (ํ์ฌ ํ์๋ ๋ฐ์ดํฐ ์์ค ๋๊ธฐ์ด)์ ์์ฑ (Math.floor (500/100))ํ๋ฉด๋ฉ๋๋ค. ), ์ ํ ์์๋ฅผ ์๋ ์๋๋ก ์คํฌ๋กค ํ ๋ ํ์ ๋ฐ์ด ๋ฃ๊ฑฐ๋ ํํ์ฌ ๋ค์ ๋ ๋๋งํฉ๋๋ค.
๋ด ํ๋ก์ ํธ์์ ๋ฐ์ ์ฐฝ์ ๊ฐ์ ธ์ค๊ณ ์ถ์ต๋๋ค. ์ ๊ฐ ์ธ๊ธ ํ๋๋ก ์๋ํฉ๋๊น?
๋น์ ์ด ์ค๋ช
ํ๊ณ ์๋ ๊ฒ์ ๋ฐ์ ์๋์ฐ (๊ทธ๋ฆฌ๊ณ ์๋์ฐ, ๋๋ ์ค ํด๋ฃจ ์ ์ปฌ๋ง, ์ผ๋ฐ์ ์ผ๋ก)์ ์๋ ๋ฐฉ์์
๋๋ค. ํ์ง๋ง์ด ๋ฌธ์ ์๋ ๊ด๋ จ์ด ์์ต๋๋ค. ์ด๊ฒ์ ์๋์ฐ ์ฝํ
์ธ ๋ฅผ ์ ์์ ์ธก์ ํ๋ ๊ฒ์
๋๋ค. ๊ทํ์ ๊ฒฝ์ฐ ๊ฐ์ฒด์ ๋์ด๊ฐ ๊ณ ์ ๋์ด ์์ผ๋ฏ๋ก FixedSizeList
๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. https://react-window.now.sh/#/examples/list/fixed -size
๋ฐ์ ์ฐฝ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ํด๊ฒฐ ๋ ์ต์ปค๋ง์ ๋ณด๋ ๊ฒ์ด ์ข์ต๋๋ค.
๊ทธ๊ฑด ๊ทธ๋ ๊ณ , ๋ค์ด์ด๊ทธ๋จ์์ ๋๋ฌด ๋ง์ด ๋ฐ๋ฅผ ๊ฒฝ์ฐ ๋ฏธ์ํฉ๋๋ค ... ๐
@bvaughn ์ธ์ ์ด ๊ธฐ๋ฅ์ ์ถ์ ํ ์์
์ง๊ธ์ด ์์ ์ ์๋ฃ ํ ์๊ฐ (๋ฐ ์๋์ง)์ ์ฐพ๋ ๋ฐ ์ด๋ ค์์ด ์๊ธฐ ๋๋ฌธ์์ด ๊ธฐ๋ฅ์์ด 1.0.0์ ๊ฒ์ํ์ต๋๋ค. ์์ผ๋ก๋ ์ถ๊ฐ ํ ๊ณํ์ ๋๋ค. ์ธ์ ์ ๋ํ ๊ฒฌ์ ์ด ์์ต๋๋ค.
Polymer์ "์ฒ ๋ชฉ๋ก"์ด ์ฌ๊ธฐ์์ ์ ์ํ๋ ๊ฒ๊ณผ ์ ์ฌํ ๊ธฐ์ ์ ์ฌ์ฉํ๋ ๊ฒ ๊ฐ์ต๋๋ค : https://github.com/domenic/infinite-list-study-group/blob/master/studies/Polymer-iron-list.md #virtual -list-sizing
์ด๊ฒ์ ์ฐ๋ฆฌ์๊ฒ ์ ๋ง ์ ์ฉ ํ ๊ฒ์ ๋๋ค. ์ง๊ธ์ CSS๋ฅผ ๊ฐ์ ๋ชฉ๋ก์ ์ ๋ฌํ๊ธฐ ์ํด ๋์ด ๊ณ์ฐ์ ๋ณต์ ํ๋ ๊ตฌ์ฑ ์์ ๋ ผ๋ฆฌ์ ๋๊ธฐํํด์ผํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค.
@kevinder ๊ฐ ์ ์์ ์ธก์ ๋ ์ฝํ ์ธ ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๊ณต์ ํ ์ ์์ต๋๊น? ๋ฏธ๋ฆฌ ๊ฐ์ฌ๋๋ฆฝ๋๋ค
@carlosagsmendes ๊ฐ ์ด๊ฒ์ด ๋์์ด ๋ ์ง ํ์คํ์ง ์์ง๋ง ์ฑํ ๊ธฐ๋ก์ ํ์ํ๊ธฐ ์ํด ์ด๊ฒ์ ์ฌ์ฉํ ๋ ๋ด๊ฐํ๋ ์ผ์ ๋๋ค.
1.) ์์ฑ์์์ ๋ชฉ๋ก ๋ฐ ChatHistory
๊ตฌ์ฑ ์์์ ๋ํ ์ฐธ์กฐ๋ฅผ ๋ง๋ญ๋๋ค.
constructor(props) {
super(props);
this.listRef = createRef();
this.chatHistoryRef = createRef();
this.listHeight = 0;
}
๊ทธ๋ฐ ๋ค์ ๋ชฉ๋ก ๋ ๋๋ง์ ๋ด๋นํ๋ ChatHistory
refs๋ฅผ ์ ๋ฌํฉ๋๋ค.
2.) ๋ถ๋ชจ ๊ตฌ์ฑ ์์์ componentDidMount
์์ ChatHistory
ref๋ฅผ ์ฌ์ฉํ์ฌ ์์์ ๋์ด๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
componentDidMount() {
this.listHeight = this.chatHistoryRef.current.offsetHeight;
}
3.) ๋ถ๋ชจ ๊ตฌ์ฑ ์์์์ ๋๋ chathistory ์ธ๋ถ ์ฌํญ๊ณผ ํจ๊ป ๋ฐฐ์ด์ ์ํ๋ก ์ ์งํฉ๋๋ค. ํด๋น ๋ฐฐ์ด์ ์ ํญ๋ชฉ์ ์ถ๊ฐ ํ ๋ ๋ค์๊ณผ ๊ฐ์ดํฉ๋๋ค.
// find out how many pixels in height the text is going to use
const size = getSize({
text: displayText,
className: styles.message,
});
let { height } = size;
height += 20; // adds some spacing in pixels between messages
...rest of items needed for the chat history item..add them all to an array and update state
getSize
์ https://github.com/schickling/calculate-size๋ฅผ ๊ธฐ๋ฐ์ผ๋กํ์ง๋ง ํด๋์ค ์ด๋ฆ ์๋ฝ์ ์ง์ํ๋๋ก ์์ ํ์ต๋๋ค. ํด๋น ํด๋์ค๋ ๊ฐ๋ณ ๋ฉ์์ง๋ฅผ ํ์ํ๊ธฐ์ํ ์ปจํ
์ด๋๋ก ์ฌ์ฉ๋๋ ๊ฒ๊ณผ ๋์ผํฉ๋๋ค.
์ด๊ฒ์ ๋ฌ์ฑํ๋ ๋ ์ข์ ๋ฐฉ๋ฒ์ด ์๋ค๊ณ ํ์ ํ์ง๋ง ๊ฝค ๋น ๋ฅด๋ฉฐ ์์ง ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์์ต๋๋ค.
@osdlge : ์ฝ๋ ์๋ ๋ฐ์ค (๋๋ ์ด์ ์ ์ฌํ)์ ๊ฐ์ด ๋ด๊ฐ ํ์ธํ ์์๋ ๋ชจ๋ ๊ณณ์์์ด ๋ฐ๋ชจ๋ฅผ ๊ฐ์ง ๊ฐ๋ฅ์ฑ์ด ์์ต๋๊น?
@bvaughn ํ์คํ, ๋ด ์ฝ๋์ ๊ด๋ จ ๋ถ๋ถ์ https://codesandbox.io/s/5z282z7q1l๋ก ์ถ์ถํ์ต๋๋ค.
๊ณต์ ํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค! ๐
์งํ์ค์ธ ์ผ๋ถ ์์ ์ ๊ฒ์ผ๋ฅด๊ฒ ์ธก์ ๋ ์ฝํ ์ธ ์ ๋ํ ์ด๊ธฐ ์ ๊ทผ ๋ฐฉ์์ issue / 6์ด๋ผ๋ ๋ธ๋์น์ ํธ์ํ์ต๋๋ค.
๋ฐ๋ชจ๋ ๋ฐฐํฌํ์ต๋๋ค.
https://react-window-next.now.sh/#/examples/list/dynamic -size
์์ฃผ ๋ฉ์ง๋ค.
๋๋ ์ฌ์ ํ ์ด์ / 6 ๋ธ๋์น ์์ค์์ด ํ ๋ก ์ ์งํํ๋ฉด์ ๋ฌดํ ์คํฌ๋กค๋ง์ ์ผ๋ฐ์ ์ธ ๋ฌธ์ ๋ฅผ ์ดํดํ๋ ค๊ณ ๋ ธ๋ ฅํ๊ณ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ค์ ์ง๋ฌธ์ ์๋ฏธ๊ฐ ์์ ์ ์์ง๋ง ์ฌ๊ธฐ์ ๋ ์ดํดํ๊ณ ์ถ์ต๋๋ค.
์์ ์ธ๊ธ ์ด ๋งํฌ ๋ ๊ธฐ์ฌ ๋ CSS Scroll Anchoring ์ฌ์ ์์์ ๊ฐ์ ๊ธฐ์ ๋ก
๋ฏธ๋ฆฌ ๊ฐ์ฌ๋๋ฆฝ๋๋ค
์ฒซ ๋ฒ์งธ ๋งํฌ์๋ ์ ์ ์ ์ผ๋ก ๊ด๋ จ์ด ์์ง๋ง ๋ ๋ฒ์งธ ๋งํฌ์๋ ๊ด๋ จ์ด ์์ต๋๋ค. ๋ค๋ฅธ ์ฌ์์ด๋ ์ ์๊ณผ ๊ด๋ จ์ด ์์ด์๊ฐ ์๋๋ผ ๋์๊ฒ ์๋ฏธ๊ฐ ์๊ธฐ ๋๋ฌธ์์ด ๋ฌธ์ ์ ์ฌ์ฉํ๊ธฐ๋ก ์ ํํ ์ฉ์ด์ ๋๋ค.
๋ํ NPM์ ๋ํ ์ฌ์ ์ถ์ ๋ฒ์ ์ react-window๋ฅผ "next"(์ : yarn add react-window@next
)๋ก ๊ฒ์ํ์ต๋๋ค.
์ด ์ฝ๋ ์๋ ๋ฐ์ค๋ฅผ ํฌํฌํ์ฌ ๊ฐ์ง๊ณ ๋ ์ ์์ต๋๋ค.
https://codesandbox.io/s/5x8vlm0o7n
๋ฐฉ๊ธ ํ
์คํธํ์ต๋๋ค. ๋๋ 10000 ๊ฐ์ ๋จ๋ฝ์ ์๋ํ๊ณ ๋์ผ๋ก ์ ํํ๋ ค๊ณ ํ๋ค. ์กํฌ์๋ค.
๋ด๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ๋ค๋ฉด ๋์ผ๋ก ์ถ์ ๋๋ ํ๋ง ์ธก์ ํ์ด์ผ ํ์ผ๋ฏ๋ก ์ฆ์ ๋์ผ๋ก ์ ํํ์ ๊ฒ์
๋๋ค. ์ด ์ฌ๋ฐ๋ฅธ์ง?
2018 ๋ 10 ์ 12 ์ผ 12:53์ Brian Vaughn [email protected] ์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
๋ํ NPM์ ๋ํ ์ฌ์ ๋ฆด๋ฆฌ์ค ๋ฒ์ ์ react-window๋ฅผ "next"๋ก ๊ฒ์ํ์ต๋๋ค (์ : yarn add react-window @ next).
์ด ์ฝ๋ ์๋ ๋ฐ์ค๋ฅผ ํฌํฌํ์ฌ ๊ฐ์ง๊ณ ๋ ์ ์์ต๋๋ค.
https://codesandbox.io/s/5x8vlm0o7n https://codesandbox.io/s/5x8vlm0o7n
โ
์ด ์ค๋ ๋๋ฅผ ๊ตฌ๋ ํ๊ธฐ ๋๋ฌธ์์ด ๋ฉ์์ง๊ฐ ์ ์ก๋์์ต๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ GitHub https://github.com/bvaughn/react-window/issues/6#issuecomment-429271555 ์์ ๋ณด๊ฑฐ๋ https://github.com/notifications/unsubscribe-auth/ ์ค๋ ๋๋ฅผ ์์๊ฑฐํฉ๋๋ค.
์๋์, ์ ๊ฐ ํธ์ ํ ์ด๊ธฐ ๋ถ๊ธฐ๋ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ์ง ์์ต๋๋ค.
์ด ๋ฌธ์ ์ ์ค๋ช
๋์ด ์์ต๋๋ค. ๋ ์์งํ ์ ๊ทผ ๋ฐฉ์์ด ํ์ํฉ๋๋ค.
๋์ค์ ์ฝํ
์ธ ๋ฅผ ๋ ๋๋งํ๊ธฐ ์ ์ ์ด์ ์ฝํ
์ธ ๋ฅผ ์ธก์ ํฉ๋๋ค.
ํผ๋์ ๋๋ ค ์ฃ์กํฉ๋๋ค!
2018 ๋ 10 ์ 12 ์ผ ๊ธ์์ผ ์คํ 6:34 akraines [email protected] ์์ฑ :
๋ฐฉ๊ธ ํ ์คํธํ์ต๋๋ค. ๋๋ 10000 ๊ฐ์ ๋จ๋ฝ์ ์๋ํ๊ณ
์ข ๋ฃ. ์กํฌ์๋ค.
๋ด๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ๋ค๋ฉด ์ถ์ ๋ ํ๋ง ์ธก์ ํ์ ๊ฒ์ ๋๋ค.
๊ทธ๋์ ๊ทธ๊ฒ์ ์ฆ์์์
์ข ๋ฃ. ์ด ์ฌ๋ฐ๋ฅธ์ง?2018 ๋ 10 ์ 12 ์ผ 12:53์ Brian Vaughn [email protected] ์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
๋ํ NPM์ ๋ํ ๋ฐ์ ์ฐฝ ์ํํ ๋ฒ์ ์ ๋ค์๊ณผ ๊ฐ์ด ๊ฒ์ํ์ต๋๋ค.
"next"(์ : yarn add react-window @ next).์ด ์ฝ๋ ์๋ ๋ฐ์ค๋ฅผ ํฌํฌํ์ฌ ๊ฐ์ง๊ณ ๋ ์ ์์ต๋๋ค.
https://codesandbox.io/s/5x8vlm0o7n < https://codesandbox.io/s/5x8vlm0o7nโ
์ด ์ค๋ ๋๋ฅผ ๊ตฌ๋ ํ๊ธฐ ๋๋ฌธ์์ด ๋ฉ์์ง๊ฐ ์ ์ก๋์์ต๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ํ์ ํ๊ณ GitHub์์ ํ์ธํ์ญ์์ค. <
https://github.com/bvaughn/react-window/issues/6#issuecomment-429271555>,
๋๋ ์ค๋ ๋ ์์๊ฑฐ <
https://github.com/notifications/unsubscribe-auth/AOf2h7RmSEyGmyrEdMY6GgyZFjCKlDDFks5ukGafgaJpZM4UTb3P
.โ
๋น์ ์ด ์ธ๊ธ ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๊ณ ์์ต๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/bvaughn/react-window/issues/6#issuecomment-429282228 ,
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AABznR5R1N0ErukleIfvaLQORF_NECgRks5ukHBHgaJpZM4UTb3P
.
์ผ,
๊ณต์ ์ถ์์ ๋ํ ๊ฒฌ์ ์ด ์๋์ง ๋ฌผ์ด๋ณด๊ณ ์ถ์์ต๋๋ค.
์ฐ๋ฆฌ ํ์ ์ฐ๋ฆฌ๊ฐ ์์ํ ์ ํ๋ก์ ํธ์ react-virtualized
๋ฅผ ์ฌ์ฉํ์ง๋ง ์คํฌ๋กค ์
๋ฐ ํน์ ํ ์ธ๋ฑ์ค๋ก ์ ํํ๋ ๊ธฐ๋ฅ์ด ํ์ํฉ๋๋ค (ํ์ ์ด๋ฏธ์ง ๋ฐ ๊ธฐํ ๋ณ๊ฒฝ ๋ด์ฉ์ด ํฌํจ ๋ ๋์ ๋ด์ฉ์ด ์๋ค๊ณ ๊ฐ์ ํ ์ ์์ผ๋ฏ๋ก).
์ํ ๋ฆด๋ฆฌ์ค์์ react-window
๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์๋๋ฉด ๊ณต์ ์ถ์๋ฅผ ๊ธฐ๋ค๋ ค์ผํฉ๋๊น?
๋ํ์ด ๊ธฐ๋ฅ์ ์์ฑํ๋ ๋ฐ ๊ธฐ์ฌํ ์์๋ ๋ฐฉ๋ฒ์ด ์๋ค๋ฉด ๋์์ ๋๋ฆฌ๊ณ ์ถ์ต๋๋ค ๐
์ํ๊น๊ฒ๋ ์ง๊ธ์ ๋ง์ ํ ์คํธ๋ฅผ ์ํํ์ง ์์๊ธฐ ๋๋ฌธ์ ํ์ฌ ๋ฆด๋ฆฌ์ค ์ผ์ ์ ์ ํ ์ ์์ต๋๋ค. ๊ทธ๋ค).
๊ธฐ์ฌํ๊ณ ์ถ๋ค๋ฉด ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ํ ๋ฆด๋ฆฌ์ค๋ฅผ ํ ์คํธํ๊ณ ์ผ๋ง๋ ์ ์๋ํ๋์ง ์๋ ค์ฃผ๊ณ ๋ฒ๊ทธ๋ฅผ ๋ฐ๊ฒฌํ๋ฉด ์๋ ค์ฃผ๋ ๊ฒ์ ๋๋ค.
์กฐ๋ง๊ฐ ์ด๊ฒ์ ๋ ์ด์ ์ ๋ง์ถ ๊ฒ์ด์ง๋ง ์ผ๋ง๋ ๋นจ๋ฆฌ ๋งํ ์๋ ์์ต๋๋ค. ํนํ ๋ค์ ์ฃผ ๋๋ ์ดํ ๋์ ๋๋ React conf์ ์ฐ๋ง ํด์ ธ 16.6 ๋ฆด๋ฆฌ์ค๋ฅผ ์ค๋นํ์ต๋๋ค.
@bvaughn ํ๋ฅญํ ์์ ๐ ๋๋์ด ๋ ์๊ฐ์ด ์์ต๋๋ค. ๐น
display: none
๋ชฉ๋ก์ ์จ๊ธธ ๋ ์ฝ๊ฐ์ ์์ ์ด ํ์ํ ๊ฒ ๊ฐ์ต๋๋ค. .
๋ฌธ์ ๋ฅผ ์ ์ํ๋ ๊ฐ๋จํ ์ฝ๋ ์๋ ๋ฐ์ค :
https://codesandbox.io/s/p7vq18wmjq
๋์คํ๋ ์ด ์์์ ํธ๋ฆฌ๊ฑฐํ๋ฉด ๋ชจ๋ ํ์ ํญ๋ชฉ์ด offsetHeight === 0
๊ฐ์ง๊ธฐ ๋๋ฌธ์ ๋ฐ์ํฉ๋๋ค.
resize๋ kiks๋ฅผ ๊ด์ฐฐํ๊ณ ์๋ก์ด ๊ฐ์ ์
๋ฐ์ดํธํฉ๋๋ค. react-window
๋ ๋ฐ์ ์๊ฐ ์จ๊ธธ ๊ฒฝ์ฐ์ด ์ํฉ์ ์ ๊ฒฝ ์ฐ์ง ์์์ผํ๋ฉฐ, ๊ธฐ๋ณธ์ handleNewMeasurements
์ฐจ๋จํ์ฌ ์ฒ๋ฆฌํด์ผํฉ๋๋ค.
์ด ์ค์ด
https://github.com/bvaughn/react-window/blob/issues/6/src/DynamicSizeList.js#L443
๋ณ๊ฒฝ ๋ ๊ฒ์ด๋ค
handleNewMeasurements: instance._handleNewMeasurements
๊ทธ๋ฐ ๋ค์ ๊ธฐ๋ณธ ๋ก์ง์ ์ฌ์ ์ ํ ์ ์์ต๋๋ค.
let _handleNewMeasurements
<DynamicSizeList
ref={current => {
if (current) {
_handleNewMeasurements = current._handleNewMeasurements
current._handleNewMeasurements = (...args) => {
if (!isHidden) {
return _handleNewMeasurements(...args)
}
}
}
}}
{...otherProps}
์คํฌ๋กค์ด ์งํ๋๋ ๋์ ํฌ๊ธฐ๊ฐ ์กฐ์ ๋ ํญ๋ชฉ์ ์ค๋ช
ํ๊ธฐ ์ํด margin-top
๋ฅผ ์ฌ์ฉํ์ฌ Firefox ๋ถ๋๋ฌ์ด ์คํฌ๋กค ๋ฒ๊ทธ๋ฅผ ์์ ํ๋ ์
๋ฐ์ดํธ๋ฅผ์ด ๋ธ๋์น์ ํธ์ํ์ต๋๋ค (๊ทธ๋ฆฌ๊ณ NPM์ ์ @next
ํ๊ทธ๋ฅผ ๊ฒ์ํ์ต๋๋ค). ๋ด๊ฐ ์ํ๋ ๊ฒ๋ณด๋ค ๋ ๋ณต์กํ์ง๋ง ์ง๊ธ์ ์ด๊ฒ์ ์ฒ๋ฆฌํ๋ ๋ ์ข์ ๋ฐฉ๋ฒ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. (๊ทนํ์ ๊ฒฝ์ฐ์๋ ์ฌ์ ํ ๊ฑฐ์น ๊ฐ์ฅ์๋ฆฌ๊ฐ์์ ์ ์๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์์ด ์ ๊ทผ ๋ฐฉ์์ ๋ํด ๋ ๋ง์ ํ
์คํธ๋ฅผ ์ํํด์ผํฉ๋๋ค.)
์์ ํผ๋๋ฐฑ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค, @piecyk. ์์ง ํํค์น ์๊ฐ์ด ์์์ต๋๋ค. (์ด๊ฒ์ ํ์ฌ ์ ์๊ฒ ์ฌ์ ํ ์ผ์ข ์ ๋ถ์์ ์ธ ํ๋ก์ ํธ์ ๋๋ค.)
์ ์ด๋ Firefox์ ๋ํด scrollBy
์ฐฌ์ฑํ์ฌ ๋ง์ง ํดํน์ ์ ๊ฑฐ ํ ์์์ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋๋ IE์ Edge๋ฅผ ๋จผ์ ํ
์คํธํด์ผํฉ๋๋ค. ๊ทธ๋ค ์์ ์ ์ด๋ ค์์ด์์ ์ ์์ต๋๋ค.
๋ค @bvaughn ์์์, ๋ฉ์ง ์ํ ๐ ์๊ฐ์ ์ด๋ป๊ฒ ์ฐพ๋ ์ง ๋ชจ๋ฅด๊ฒ ์ด์! ๐ฅ ์ข์์!
๊ทธ๋ฌ๋ ๋ชฉ๋ก์ด ๋์คํ๋ ์ด ์์์ผ๋ก ์จ๊ฒจ์ง ์ผ๋ถ DOM ์์์์์ ๋ ๋ฌธ์ ๋ก ๋์๊ฐ ๋ณด๊ฒ ์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋ํผ์ ๋์ด, ๋๋น๊ฐ ์๋์ง ํ์ธํด์ผํฉ๋๋ค. ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ๋ ๋๋ง์ ์์ํ๊ณ ์ถ์ง ์์ต๋๋ค (ํ์ฌ ๋ ๋๋ง์ ์๋ํฉ๋๋ค. ์ ์ฒด ๋ชฉ๋ก) ๋ด์ผ ๊ทธ๊ฒ์ ๊ณ ์น๊ธฐ ์ํด ๋ ธ๋ ฅํ ๊ฒ์ ๋๋ค (๋ฌด์ธ๊ฐ ์จ๊ฒจ์ ธ ์์ต๋๋ค)
์. ์ค๋ช ํ์๋ ๋ฌธ์ ์ ํต์ฌ์ ์ดํดํฉ๋๋ค. ๊ทธ๋๋ ๋ ๋ง์ ์ธ์คํด์ค ๋ฉ์๋๋ฅผ ์ฌ์ ์ / ์์ญ์ด ํจ์นํ์ฌ ํดํนํ๋ ์๊ฐ์ด ์ซ๊ธฐ ๋๋ฌธ์ ๋จผ์ ์ข ๋ ์๊ฐํ๊ณ ์ถ์ต๋๋ค.
@next ํจํค์ง๊ฐ ์์๋ ๊ฒ ๊ฐ์ต๋๊น?
๊ทธ๊ฒ์ด ์ง๋ฌธ์ ๋จ๊ธฐ๊ธฐ์ ์ ์ ํ ์ฅ์์ธ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋ด๊ฐ ํ๋ ธ๋ค๋ฉด ์ค๋กํฉ๋๋ค. ๊ฐ๋จํ ๋งํด์ :
DynamicSizeList
๊ณผ ํจ๊ป AutoResizer
๋ฉ์ง๊ฒํ๊ณ ์๋ ์ผ๋ฐ์ ์
๋๋ค. ๋ช
์ฑ!JSON.parse (JSON.stringify (data)) ํดํน์ผ๋ก ๋ค๋ฅด์ง๋ง ๋์ผํ ๊ฐ์ฒด๋ฅผ ์ ๊ณตํ์ฌ itemData๋ฅผ ๋ค์๋ก๋ํ๋ ค๊ณ ํ์ต๋๋ค. ๋ถ์ด :-(
๋๋ ๋์ด์ ์ค์ฐ์ ์์ฌํ๋ค. ์ด ๋ฌธ์ ๋ฅผ ๊ทน๋ณต ํ ์์ด๋์ด๊ฐ ์์ต๋๊น?
codesandbox ์์ ๋ฅผ ๊ณต์ ํด ์ฃผ์๊ฒ ์ต๋๊น? ๋น์ทํ ์ผ์ํด์ผ ์ฐ๋ฆฌ๊ฐ ์๋ก ๋์ธ ์ ์์์ง๋ ๋ชฐ๋ผ
@vtripolitakis ๋ฐฉ๊ธ ํ์ฅ ๊ฐ๋ฅํ ํ์ด ์๋ ํ ๋ก ๋งํฌ์ ๋๋ค.
@carlosagsmendes ๊ฐ์ฌํฉ๋๋ค.ํ์ง๋ง DynamicSizeList
์ฌ์ฉํจ์ ๋ฐ๋ผ ์ ์ฌ๋ก ์ฐ๊ตฌ๋ ์ฝ๊ฐ ๋ค๋ฆ
๋๋ค. :-(
๊ทธ๋์ ๋ฌธ์ ์ ์์ธ์ ์ฐพ์์ต๋๋ค.
state.scrollOffset
์์ ์์ ๊ฐ์ ์ฌ์ฉํ์ต๋๋ค.
src/DynamicSizeList.js
์์ 299 ํ์ ๋ค์ ์ฝ๋๋ฅผ ์ถ๊ฐํด์ผํฉ๋๋ค.
if (sizeDeltaForStateUpdate < 0) {
sizeDeltaForStateUpdate = 0;
}
ํ .. ํ๋์ ์์ ์ด ์ณ์ ๊ฑฐ๋ผ๊ณ ๋ ์๊ฐํ์ง ๋ชปํ์ต๋๋ค. ํฌ๊ธฐ ๋ธํ๋ ํฉ๋ฒ์ ์ผ๋ก ์์ ์ผ ์ ์์ต๋๋ค.
state.scrollOffset
๊ฐ์ด ์
๋ฐ์ดํธ๋๋ ๊ณณ ์ฃผ๋ณ์ ๊ฒฝ๋น์ ( Math.max(0, prevState.scrollOffset + sizeDeltaForStateUpdate)
)์ด ์์ด์ผํ ๊น์?
์๋
ํ์ธ์, ์ ์ผ์ด์ค๋ฅผ ๋๋ฒ๊น
ํ์ ๋ sizeDeltaTotal
์ ์์ ๊ฐ์ ์ทจํ๊ณ ๊ทธ์ ๋ฐ๋ผ sizeDeltaForStateUpdate
์์๋ฅผ ๋ง๋ค์ด ์ํ ์
๋ฐ์ดํธ ํ ์์ state.scrollOffset
์ฐ์ถํ์ต๋๋ค.
์ด๊ฒ์ ํญ๋ชฉ์ ํ์ฅ ๋ฐ ์ถ์ ํ ๋ค์ scrollOffset
0 ๋ฐ ๋ฐฉํฅ backwards
์ ์ฌ์ฉํ์ฌ ๋งจ ์๋ก ์คํฌ๋กคํ์ ๋ ๋ฐ์ํ์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋ช ๋ฒ ํ์ฅ ๋ฐ ์ถ์ํ๋ฉด ๋ค๊ฑฐํฐ๋ธ๋ฅผ ์ป์์ต๋๋ค.
์, ๊ทํ์ ์ ์์ ๋๊ฐ์ด ์ข์ ๊ฒ์
๋๋ค. ~ ์ง๊ธ ํ
์คํธ ์ค์
๋๋ค. ~ ์ ๋๋ก ์๋ํฉ๋๋ค.
@marcneander ๋ฒ์ 1.4.0-alpha.1
์ฌ์ฉํด๋ณด๊ธฐ
๋ชฉ๋ก์ด ์จ๊ฒจ์ ธ์์ ๋ ํฌ๊ธฐ ์กฐ์ ์ด๋ฒคํธ๋ฅผ ๋ฌด์ํ๋ ๊ฒ๊ณผ ๊ด๋ จํ์ฌ https://github.com/piecyk/react-window/commit/acfd88822156611cfd38872acdafbbefd2d0f78f
@bvaughn ๋น์ ์ ์ด๋ป๊ฒ ์๊ฐํ์ญ๋๊น?
์ฑํ
์์ ์คํ์ผ ์ฑ์์ ์๋ ์คํฌ๋กค์ ์ถ๊ฐํ๋ ค๊ณ ํ๋๋ฐ DynamicSizeList does not support scrolling to items that have not yet measured. scrollToItem() was called with index 111 but the last measured item was 110.
๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
scrollToItem(items.length-1)
์์ componentDidUpdate
scrollToItem(items.length-1)
๋ก ์ ํํ๋ ค๊ณ ํฉ๋๋ค
์๋ ๋ ๋์์ ๋๊น?
์, ์๋ง๋ ๊ทธ๋ฐ ๊ฒ์ด @piecyk ์๋ ํ ์ ์์ต๋๋ค ๐
์๋ ๋ ๋์์ ๋๊น?
@xaviergmail ์ฒ๋ผ ๋ค๋ฆฌ์ง ์์ต๋๋ค. ๋ฒ๊ทธ ์ผ ์๋ ์์ต๋๋ค.
์๋ ํ์ธ์ @bvaughn ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ ๊ฒ์ ์๋์ง๋ง ์ฌ๊ธฐ์ ๋์์ด ๋ ์์๋ Flex 4 DataGrid ๋ด๋ถ์ ๊น๋ํ ํฌ์ ๋ฐฐ์ด ๊ตฌํ ์ด ์๋ค๊ณ ๋งํ๊ณ ์ถ์์ต๋๋ค. ๋๋ Flash๊ฐ : -1 :๋ผ๋ ๊ฒ์ ์๊ณ ์์ง๋ง, Flex์ ๋ง์ง๋ง ๋ฒ์ ์ ์ค์ ๋ก ๊ฝค ํ๋ฅญํ ๊ฐ์ํ ๋ ์ด์์ ์์ง์ ๊ฐ์ง๊ณ ์์์ต๋๋ค. ์๋ํ๋ฉด Flash :-)
LinearLayoutVector๋ ๋จ์ผ ์ฐจ์์์ ํญ๋ชฉ ์ธ๋ฑ์ค์ ํฝ์ ์์น ๊ฐ์ ๋งคํ์์ํ ํฌ์ ๋ฐฐ์ด์ ๋๋ค. ์ธ ๊ฐ์ง ๊ธฐ๋ณธ ์์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
interface LinearLayoutVector {
start: (index) => position;
end: (index) => position;
indexOf: (position) => index;
}
๋ด๋ถ์ ์ผ๋ก ํญ๋ชฉ ์์น๋ฅผ ์ ์ฅํ๊ธฐ ์ํด 2์ ๊ฑฐ๋ญ ์ ๊ณฑ์ผ๋ก ๋ฒํท์ ํ ๋นํฉ๋๋ค (ํน์ ํ์๋ ๋ ํฌ๊ฑฐ๋ ๋ ์์ ํญ๋ชฉ ํฌ๊ธฐ๋ฅผ ๋ ์ ์์ฉํ๋๋ก ์กฐ์ ํ ์ ์์). ์ด๋ฅผ ํตํด ์ผ์ ์๊ฐ O (1) index -> position
์กฐํ ๋ฐ position -> index
์กฐํ๋ฅผ์ํ ํจ์จ์ ์ธ ์ ํ ๋ธ๋ก ์ค์บ์ด ๊ฐ๋ฅํฉ๋๋ค. ํจ๋ฉ, ๊ฐ๊ฒฉ, ๊ธฐ๋ณธ ํฌ๊ธฐ ๋ฐ ์์ ์ก์ธ์ค ์ฝ์
, ์ ๊ฑฐ ๋ฐ ์
๋ฐ์ดํธ๋ฅผ ์ง์ํฉ๋๋ค.
์ฝ 6 ๋ ์ ๋ชจ๋ฐ์ผ ์ฉ ๊ฐ์ํ ๋ UI๋ฅผ ๋ง์ด ํ ๋ JS๋ก ํฌํ ํ์ต๋๋ค . ๊ฐ๋ ์ฑ์ ์ํด ES6 ์ ๋ฐ์ดํธ๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ์ ํ ๋ฐฐ์ด๋ก ์ ํํ์ฌ ๋ ๋ง์ ์๋๋ฅผ ์งค ์ ์์ง๋ง ๊ธฐ๋ณธ ๋ ผ๋ฆฌ๋ ๊ฑด์ ํฉ๋๋ค.
LLV๋ก CellSizeAndPositionManager
์ ๋ด๋ถ๋ฅผ ์ ํ ํ ๋ช ์ฃผ ์ ์ ๋ฐ์ ๊ฐ์ํ๋ฅผ ์ํ react-window
์ ์ ์ฌํ PR์ ์ ์ถํด ๋๋ฆฌ๊ฒ ์ต๋๋ค.
์๋ ํ์ธ์ @trxcllnt ๐
PR ๊ณต์ ์ ๊ด์ฌ์ด ์์ผ์๋ฉด ๊ธฐ๊บผ์ด ์ดํด ๋ณด๊ฒ ์ต๋๋ค. issues/6
๋ธ๋์น (WIP PR # 102)๋ฅผ ์๋๋ก ์ด๊ธธ ์ ์์ต๋๋ค.
ํ๋์ linear-layout-vector
์ (๋) ํ
์คํธ๊ฐ ์๊ฑฐ๋ ๋๋ฌด ๋ง์ด ์ฌ์ฉ๋๋ ๊ฒ ๊ฐ์ง ์๊ธฐ ๋๋ฌธ์ ์ด๊ธฐ์ ์ฝ๊ฐ์ ๊บผ๋ฆผ์ด ์์์ง๋ง ์ฌ์ ํ ์ดํด๋ณผ ์ํฅ์ด ์์ต๋๋ค. ๋ํ uglified + minified ํ ๋ฒ๋ค์ ์ถ๊ฐ๋๋ ๋ฌด๊ฒ๋ฅผ ํ์ธํ๊ณ ์ถ์ง๋ง ๋๋ฌด ๋ง์ด ์ถ๊ฐ ๋ ๊ฒ์ผ๋ก ์์ํ์ง ์์ต๋๋ค. ๐
@bvaughn ๋์ด
๋๊ธ์ ๋ฌ๊ณ ๋์ https://github.com/trxcllnt/virt-list์ ๋ํ ํฌํธ ์์ ์ ์ํ ํ ๋ฐ๋ชจ๋ฅผ ๊ธฐ์ตํ์ต๋๋ค
@bvaughn ์ง๋ 1 ๋
๋์ issues / 6 ๋ธ๋์น์์ ์งํ๋ ๋ชจ๋ ์์
์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
ํ์ฌ ^1.6.0-alpha.1
ํ
์คํธ ์ค์ด๋ฉฐ ํด๋น ๋ฒ์ ์ผ๋ก ํ๋ก๋์
์ผ๋ก ๋ฐฐ์ก ํ ๊ณํ์
๋๋ค.
์ด ๋ฌธ์ ๋ฅผ๋ณด๊ณ ์๋ ๋ค๋ฅธ ์ฌ๋์ ์ํด ์๋ก์ด DynamicSizeList
๋ก ์์
ํ๊ธฐ ์ํด ํ์ํ ์์
์ ๊ฒ์ํ๊ณ ์ง์ ์์ ์ต์ ๋ฒ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ผ๋ก ์๊ฐํ์ต๋๋ค.
์์ ๋งํฌ ๋ ๋ฌธ์์ issues / 6 ๋ธ๋์น ์์ ์์ฑ ๋ ๋ฌธ์๋ฅผ
Warning: Function components cannot be given refs. Attempts to access this ref will fail. Did you mean to use React.forwardRef()?
๊ทธ๋์ ์์ ์ ๋น์ ์ด ํ ์คํธ ์์ํ๋ ์ผ์ ๋ชจ๋ฐฉํ๊ณ ...
import { DynamicSizeList as List } from 'react-window';
import AutoSizer from 'react-virtualized-auto-sizer';
// in constructor(props) for handling scrolling
this.listRef = React.createRef();
// in render()
const allItems = [...];
const Renderer = ({ forwardedRef, style, index, ...rest }) => (
<div ref={forwardedRef} style={style}>
<MyCoolComponent index={index} otherProps={otherPropsBasedOnAllItems} />
</div>
);
const RefForwarder = React.forwardRef((props, ref) => (
<Renderer forwardedRef={ref} {...props} />
));
return <div style={{ display: 'flex', flexDirection: 'column', height: '100%' }}>
<div style={{ flexGrow: 0, flexShrink: 0, width: '100%', position: 'sticky', top: 0, zIndex: zIndexHideLayers }}>
<MyCoolComponentThatControlsScrolling listRef={this.listRef} />
</div>
<div style={{ flex: 1, width: '100%' }}>
<AutoSizer>
{({ height, width }) => (
<List ref={this.listRef} itemCount={allItems.length} width={width} height={height}>
{RefForwarder}
</List>
)}
</AutoSizer>
</div>
</div>;
๋ด ์์ ์๋ ํด๋น ๋ฌธ์ ํ์ด์ง์์ ์ํ๋ ๊ฒ๋ณด๋ค ๋ ๋ง์ ๊ฒ์ด ํฌํจ๋์ด ์์ง๋ง ๋ฌธ์ ์ ๋ฐ์ดํธ๊ฐ ๋ ์ฌ์์ง๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
ํ์ฌ ๋ฒ์ ์ ๋ธ๋์น์ ๋ํ ํผ๋๋ฐฑ?
๐ฏ ์ ์๋ํฉ๋๋ค
๐ ๋ชจ๋ ์์
์ ๋ค์ ํ ๋ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
ํธ์ง : DynamicSizeList
๋์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ง๊ธ ์ฌ์ฉํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
์ธ๋ถ ์ ๋ณด๋ฅผ ๊ณต์ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค! ์ด ๋ฌธ์ ๋ฅผ ๋ค์ ์ฐพ์ ์์๋ ๋์ญํญ์ด ํ๋ณด๋๋ฉด ์์ธํ ์ดํด ๋ณด๊ฒ ์ต๋๋ค.
์ด ์ ๊ทผ ๋ฐฉ์ ์ ์ด๋ฒ ํธ์ ์๋ ์ ์๊ณผ ํจ๊ป ์ฌ์ฉํ ์ ์๋ค๊ณ ์๊ฐ
ํญ๋ชฉ์ ์ด์ ํฌ๊ธฐ๋ฅผ ์ฌ์ฉํ๋ ๋์ ์์ ํฌ๊ธฐ๋ฅผ ์ฌ์ฉํ๊ณ ๋๊ตฐ๊ฐ๊ฐ ์คํฌ๋กค ํ ๋ ์ค์ ํฌ๊ธฐ๋ก ๋ค๋ฌ์ ์ ์์ต๋๋ค. (์ด์ ์ ์ธก์ ๋ ํฌ๊ธฐ๊ฐ ๋ ์ ํํ ๊ฐ๋ฅ์ฑ์ด ์๋ค๋ ์ฌ์ค์ ์ ์ธํ๊ณ ๋ "์ด์ ์ ์ธก์ ๋ ํฌ๊ธฐ"์ "์์ ํฌ๊ธฐ"์ฌ์ด์ ์ค์ํ ์ฐจ์ด๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋๋ ํ์ฉ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ํ์ฉ ๊ฐ๋ฅํ ์์ถฉ ๊ด๊ณ ์ผ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ด์ ์ ์จ ๊ฒ์ ๋ ๋๋งํ์ง ์๊ณ ๋ฐ์ดํฐ์ ์์์ ์์น๋ก ์ ํ ํ ์ ์์ผ๋ฉฐ _ ๊ทธ๋ฆฌ๊ณ _ ํญ๋ชฉ ํฌ๊ธฐ ์บ์๋ฅผ ์ ์งํ์ง ์์๋๋ฉ๋๋ค.)
์ด๊ฒ์ ์คํฌ๋กค ๊ณ ์ ๋ฌธ์ ๋ฅผ ์๋นํ ๋จ์ํ ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๊ธฐ ์ ํ (์ค๋ช ๋๋๋ก)๋ฅผ ์ํ ํ ๋ค์ "์ด์ "(์ ๋๋ ์ผ์ชฝ)์ด ๋ชจ๋ ์์ ํฌ๊ธฐ ์ธ ๊ฒ์ฒ๋ผ ๊ฐ์ฅ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ์คํฌ๋กคํ๋ฉด์ ๋ค๋ฌ์ต๋๋ค.
์๋ ํ ์ ์์๊น์?
@bvaughn ์ด๋ ๊ฒํ๋ฉด ์ฑํ ์ฒ๋ผ ์ฒ์์ "ํ๋จ"์ผ๋ก ์คํฌ๋กคํ์ฌ @xaviergmail ์ด ํด๊ฒฐ ํ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ฉ๋๊น? ์๋ํ์ง ์๋ ์์ ์ codesandbox๋ฅผ ๋ง๋ค์์ต๋๋ค. ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
์ด ๋ฌธ์ ์ ๋ํ ์๊ฒฌ์ ๋ฌธ์ ํด๊ฒฐ์ด ์๋ API ํ ๋ก ์ ์ค์ ์ ๋๋๋กํ๊ฒ ์ต๋๋ค.
์ง๋ฌธ์ ๋ํด Stack Overflow๋ฅผ ์ ์ํฉ๋๋ค.
์ด API์์ resetAfterIndex๋ฅผ ๋ ธ์ถ ํ ์ ์์ต๋๊น? DynamicSizeList์์ ์ถ๊ฐ, ํธ์ง ๋ฐ ์ ๊ฑฐํ๊ณ ์ต์ํ ์์ง ํ ์์๋ ํญ๋ชฉ์์ ๋์ด๋ฅผ ์์ ํ๊ธฐ ์ํด ํธ์ถํ๋ ๋ฉ์๋๊ฐ ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ ์ฃ ?
@bvaughn ์ ์ฃผ๋ง ๋์ ์ต์ปค ์ธ๋ฑ์ค๊ฐ์๋ ํญ๋ชฉ์ ๋ฐฐ์นํ๊ณ ๋ชฉ๋ก์ ์คํฌ๋กคํ์ฌ ์ฌ์ฉ์๊ฐ๋ณด๊ณ ์๋ ๋ด์ฉ์ ์ ๋ ฌํ๋ ์์ด๋์ด๋ฅผ ๊ฐ์ง๊ณ ๋์์ต๋๋ค. ์บ์๊ฐ ์๋ํ๋ ๋ฐฉ์์ ๋ณ๊ฒฝํด์ผํฉ๋๋ค (์ด wip์์๋ ํญ์ ์ง์์ง) ... ์ด๋ป๊ฒ ์๊ฐํ์ญ๋๊น?
poc ๊ตฌํ https://github.com/piecyk/react-window/pull/2/files
๋ค์์ ๋ธ๋์น ๋น๋๋ฅผ ์คํํ๋ ์ฝ๋ ์๋ ๋ฐ์ค์
๋๋ค.
https://codesandbox.io/s/4x1q1n6nn9
์ด-์ค ํ์ด์ด ํญ์ค๋ ํฌ๋กฌ์ฒ๋ผ ๋น ๋ฅธ ์คํฌ๋กค์ ํ ๋ ๋ ๋๋ง์ ๋ฐ๋ผ ์ก์ ์ ์์ต๋๋ค ๐คทโโ๏ธ
์ฑํ ์์ ์คํ์ผ ์ฑ์์ ์๋ ์คํฌ๋กค์ ์ถ๊ฐํ๋ ค๊ณ ํ๋๋ฐ
DynamicSizeList does not support scrolling to items that have not yet measured. scrollToItem() was called with index 111 but the last measured item was 110.
๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
scrollToItem(items.length-1)
์์componentDidUpdate
scrollToItem(items.length-1)
๋ก ์ ํํ๋ ค๊ณ ํฉ๋๋ค์๋ ๋ ๋์์ ๋๊น?
์กฐ๊ธ ๋ฆ์์ง๋ง ์ด ๋ฐ์ ํํฌ๋ก ๊ทธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๊ณ ํฉ๋๋ค.
์ต์ ์ ํด๊ฒฐ์ฑ ์ ์๋์ง๋ง ์ฌ์ ํ ์์ ์ค์ ๋๋ค. ์ข ๋ ์ผ๋ฐ์ ์ด๊ณ ๊ฐ๋จํ๊ฒ ๋ง๋ค๊ณ ํจํค์ง๋ฅผ ๋ง๋ค ์ ์์๊น์?
์ด๊ฒ์ด ์ง๊ธ ์ด๋ป๊ฒ ์๋ํ๋์ง ๋ณด์ฌ์ฃผ๋ GIF :
https://cl.ly/87ca5ac94deb
์ด ์ฑํ ๊ณผ ๊ฐ์ ํ๋์ ๋ํ ํด๊ฒฐ์ฑ ์ ๋ํด ์ด์ผ๊ธฐํ๊ธฐ ์ํด ์๋ก์ด ๋ฌธ์ ๋ฅผ ์ด โโ์ ์์ต๋๊น?
uh-oh firefox๋์ด ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ํฌ๋กฌ์ฒ๋ผ ๋น ๋ฅธ ์คํฌ๋กค๋ง์ ํ ๋ ๋ ๋๋ง์ ๋ฐ๋ผ๊ฐ ์ ์์ต๋๋ค.
Firefox Nightly ๋ฒ์ 68์์ ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
@bvaughn ํผ๋๋ฅผ ์์ฑํ๊ธฐ ์ํด InfiniteLoader ๋ฐ Autosizer ๊ตฌ์ฑ ์์์ ํจ๊ป DynamicSizeList๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๋๋ ๋ด๊ฐ ์ง๊ธ๊น์ง ๋ณธ ๊ฒ์ ์ข์ํ๋ค.
API ๋ฐ ๋์ ์ธก๋ฉด์์ :
FixedSizeList์์๋ ๋ฐฉ์์ผ๋ก itemKey ์ฝ๋ฐฑ์์ ๋ ๋ฒ์งธ ์ธ์๋ก ๋ฐ์ดํฐ ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๊น?
๋ฐ์ดํฐ ๊ฐ์ฒด๊ฐ ํํฐ๋ง / ์์ ๋ ๋ ๋ด๋ถ ์ปจํ ์ด๋ ๋์ด๋ฅผ ์ฌ์ค์ ํ ์ ์์ต๋๊น?
๋ด๊ฐ ์ฌ์ฉํ๊ณ DynamicSizeList
์์ 1.6.0-alpha.1
์ InfiniteLoader
์ ์ ๋์ ์ง๊ธ๊ณผ๋ ํฐ ์์
์ํ๊ณ ์๋ค. ๋ฉ์ง ๊ธฐ๋ฅ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
๊ทธ๋ฌ๋ ์ด์ scrollToItem()
๋ฅผ ์ฌ์ฉํด์ผํฉ๋๋ค. ์์ ์ฃผ์๊ณผ ์ ์ฌํ์ง๋ง ์์ง ์ธก์ ๋ ๊ฒ์ด ์ ํ ์๊ธฐ ๋๋ฌธ์ ๊ตฌ๋ณ๋ฉ๋๋ค.
DynamicSizeList does not support scrolling to items that yave not yet measured. scrollToItem() was called with index 9 but the last measured item was -1.
๊ธด setTimeout
ํ์ ์ ํ๋ฅผ ๊ฑธ์ด ๋ณด์ ๊ธฐ ๋๋ฌธ์ ํ์ด๋ฐ๊ณผ ๊ด๋ จ๋ ๊ฒ ๊ฐ์ง ์์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด ๊ฐ์ ๋ก ์ธก์ ํ ์ ์์ต๋๊น? ์๋๋ฉด ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
ํธ์ง : ์ ๊ฒฝ ์ฐ์ง ๋ง์ญ์์ค, initialScrollOffset
๋ด๊ฐ ํ์ํ ๊ฒ์ํ์ต๋๋ค.
findDOMNode๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
@next
๋ธ๋์น์ ๋ํ ์ ํ ์ ์๊ฐ ์์ต๋๊น?
@WillSquire ์๋, ๊ทธ๋ค์ํ์ง ์์ต๋๋ค. ๋ํ DefinitelyTyped์ @next
ํ๊ทธ์์ ๋ฆด๋ฆฌ์ค ํ ์ ์๋์ง ํ์คํ์ง ์์ต๋๋ค (์๋ชป๋์์ ์๋ ์์ต๋๋ค). ๋ํ API๊ฐ ์ฌ์ ํ ๋ณ๊ฒฝ ๋ ์ ์์ผ๋ฏ๋ก์ด ๋ถ๊ธฐ๊ฐ ๋ง์นจ๋ด ๋ณํฉ๋๊ณ ์ ๋ฒ์ ์ด ์ถ์ ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ด ๋ ๋์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
@bvaughn ๋๋์ด์์ ์ฌ์ฉ ๊ธฐ๊บผ์ด ํ devhub ,ํ์ง๋ง ๋ ํตํฉ์ ํฌ์ํ๊ธฐ ์ ์ ๋น์ ์ ์ข์ ๋ชจ์์ ์ด๋ฏธ ๋ ์ฌ์ ํ ์ฐจ๋จ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๊น?
@brunolemos 102
๊ณ์ ์๋ ค์ค!
~ ์ฌ์ฉํ๋ ค๊ณ ํ์ง๋ง ์ง๊ธ๊น์ง ์ฑ๊ณตํ์ง ๋ชปํ์ต๋๋ค. ~
์๋ํ์ง๋ง ์ฑ๋ฅ์ด ์ข์ง ์์ต๋๋ค. ๋ด ํญ๋ชฉ ๋ ๋๋ง์ด ๋น์ธ๊ฑฐ๋ ๋ค๋ฅธ ๊ฒ์ผ ์ ์์ต๋๋ค.
์ปจํ ์ด๋ ๋์ด๊ฐ 100 % ์ธ AutoSizer๋ฅผ ์ฌ์ฉํ ๋ ์ต์ ๋ฒ์ ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฒ ๊ฐ์ต๋๋ค.
ํธ์ง : 100vh ๋ฐ calc ()๋ฅผ ์ฌ์ฉํ์ฌ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฐพ์ ์์์์ต๋๋ค.
๋ญ๊ฐ๊ฐ ๊ณ ์ฅ ๋ฌ์ ์ ์์ต๋๋ค
์คํํ๊ธฐ์๋ ๋๋ฌด ๋ชจํธํฉ๋๋ค. ์์๋๋ ๋์๊ณผ ํจ๊ป ์ฌํ์ ๊ณต์ ํ์๊ฒ ์ต๋๊น?
1.6.0-alpha.1์ DynamicSizeList๋ฅผ ๋ค๋ฅธ ํํฐ์ ๋ณต์กํ ์นด๋๋ณด๊ธฐ์ ํจ๊ป ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ๋์ด์ ๋๋น๋ก ๊ฐ์ธ ์ผํฉ๋๋ค. ๋๋ฅผ ์ํด ์ ์๋ํฉ๋๋ค.
๊ฐ์ฌํฉ๋๋ค
์๋
ํ์ธ์, DynamicSizeList
์๋ํ๊ณ ์์ง๋ง ๋ชจ๋ ํญ๋ชฉ์ด ์๋ก ์์ ๋ ๋๋ง๋ฉ๋๋ค. ์คํ์ผ ์์ฑ์ ๋ ๋๋ง ๋ ํญ๋ชฉ์ ์ ๋ฌํ์ง๋ง style
๋ฅผ ๊ธฐ๋กํ๋ฉด height
๊ฐ ๊ฐ ํญ๋ชฉ์ ๋ํด ์ ์๋์ง ์์ ๊ฒ์ผ๋ก ํ์ธ๋ฉ๋๋ค. top
๋ฐ left
ํญ์ 0
์
๋๋ค.
๋ด๊ฐ ์ฌ๊ธฐ์ ๋ฌด์์ ๋์ณค์ต๋๊น :-)?
@ graphee-gabriel ๋น์ ์ ๋ณต์ ์๋ฅผ ๋์ณค์ต๋๋ค.
ํญ๋ชฉ์ด ์๋ ํฌ๊ธฐ๋ก ๋ ๋๋ง๋๋๋กํ๊ธฐ ์ํด ์ฒ์์๋ ๋์ด๋ฅผ ์๋์ ์ผ๋ก ์ง์ ํ์ง ์์์ต๋๋ค.
์ข์, ๋
ผ๋ฆฌ๋ฅผ ์ดํด ํ์ผ๋ ํญ๋ชฉ์ด ์๋ก ์์ ๋ ๋๋ง๋๋ ์ด์ ๊ฐ ์๋๋๋ค.
๊ฐ๋ฅํ ํ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณต ํ ๊ฒ์
๋๋ค. ์ผ๋ฐ์ ์ธ ์ค์๋ฅผํ๊ฑฐ๋์ด ๋ฌธ์ ๋ก ์ด์ด์ง๋ ๋ช
๋ฐฑํ ๋จ๊ณ (์ : ์คํ์ผ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ์ง ์์)๋ฅผ ๋์น ๊ฒ ๊ฐ์ต๋๋ค.
import React from 'react'
import { DynamicSizeList as List } from 'react-window'
import Layout from '../Layout'
import Text from '../Text'
import withScreenDimensions from '../withScreenDimensions'
class ListView extends React.Component {
state = {
availableHeight: 0
}
componentDidMount() {
const checkForHeightChange = () => {
if (this.containerDiv) {
const { offsetHeight } = this.containerDiv
if (this.offsetHeight !== offsetHeight) {
this.offsetHeight = offsetHeight
this.setState({ availableHeight: offsetHeight })
}
}
}
checkForHeightChange()
this.intervalId = setInterval(checkForHeightChange, 10)
}
componentWillUnmount() {
clearInterval(this.intervalId)
}
render() {
const {
data,
renderItem,
emptyText,
dimensions,
} = this.props
const { width } = dimensions
const { availableHeight } = this.state
return (
<Layout
centerVertical
style={{
height: '100%',
}}>
{data && data.length > 0 ? (
<div
style={{
display: 'flex',
flex: 1,
height: '100%',
backgroundColor: 'red',
alignItems: 'stretch',
justifyContent: 'stretch',
}}
ref={ref => this.containerDiv = ref}
>
<List
height={availableHeight}
itemCount={data.length}
width={width > 800 ? 800 : width}
>
{({ index, style }) => {
console.log('style', style)
return (
<div style={style}>
{renderItem({
item: data[index], index
})}
</div>
)
}}
</List>
</div>
) : (
<Text bold center padding accent>{emptyText}</Text>
)}
</Layout>
)
}
}
export default withScreenDimensions(ListView)
์ด๊ฒ์ ๋ณผ ์์๋ ์ฝ๋ ์๋ ๋ฐ์ค๋ฅผ ๊ณต์ ํ์๊ฒ ์ต๋๊น?
ํญ๋ชฉ ๋ ๋๋ฌ์ ์ธ๋ผ์ธ ํจ์๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋ถ๋ชจ๊ฐ ๋ ๋๋ง ๋ ๋๋ง๋ค ๋ณ๊ฒฝ๋๊ธฐ ๋๋ฌธ์ ๋ถํ์ํ ๋ค์ ๋ง์ดํธ๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. (์ด๊ฒ์ด ๋ชจ๋ ์์ ๊ฐ ์ธ๋ผ์ธ ํจ์๋ฅผ ํผํ๋ ์ด์ ์ ๋๋ค.)
@ graphee-gabriel ๋๋ ์ด๊ฒ๋ ๊ฐ์ง๊ณ ์์์ง๋ง ๋ฌธ์๋ ๊ทธ๊ฒ์ ์ธ๊ธํ์ง ์์์ง๋ง ref๋ฅผ๋ฐ๋ ํ ๊ตฌ์ฑ ์์๋ฅผ ์ง์ํด์ผํฉ๋๋ค.
Row = React.forwardRef(
(row, ref) => (
<div ref={ref} style={row.style}>
{renderItem({
item: data[row.index],
index: row.index,
})}
</div>
),
)
์๋ ํ์ธ์, ์ฌ๊ธฐ ์์ต๋๋ค.
https://codesandbox.io/s/sweet-sea-irxl8?fontsize=14
์, ์ค์ ๋ก ์ธ๋ผ์ธ ํจ์์ ๊ฒฝ์ฐ ๋ฐ์ ์ฐฝ์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ๋ ค๊ณ ์๋ํ ์ ๋ง ์ค๋๋ ์ฝ๋์ด๋ฉฐ ์ฌ๊ธฐ์๋ ๊ฐ์ ํ๋ ๋ฐ ์๊ฐ์ด ๊ฑธ๋ฆฌ์ง ์์์ต๋๋ค.
์๊ฒฌ์ ๋ณด๋ด ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค. ์ด ์๋ ๋ฐ์ค์์ ์ฐพ์ ๋ด์ฉ์ ์๋ ค์ฃผ์ธ์.
Annnnnd ์๋ ๋ฐ์ค๋ฅผํ๊ธฐ ์ ์ @brunolemos ๋ฉ์์ง๋ฅผ ํ์ธํด์ผํ์ต๋๋ค.
์ด๊ฒ์ ๋๋ฝ ๋ ๋จ๊ณ์ด๋ฉฐ ๋ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค!
๋ ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ฌ @bvaughn์ ์ฌํ ํ ์ ์๋๋ก ์๋ ๋ฐ์ค๋ฅผ ์
๋ฐ์ดํธํ์ต๋๋ค.
์ฌ๊ธฐ์์ ์ฐพ๊ธฐ : https://codesandbox.io/s/sweet-sea-irxl8
์ด์ ๋ชฉ๋ก์ ์ ์๋ํ์ง๋ง ์ด์ํ๊ฒ๋ ์ฝํ ์ธ ์ ํจ๊ป ๋์ด๋๊ณ ๋ค์ ์ค์ด๋ค์ง ์์ต๋๋ค.
์๋ฏธ:
๋ ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ฌ @bvaughn์ ์ฌํ ํ ์ ์๋๋ก ์๋ ๋ฐ์ค๋ฅผ ์ ๋ฐ์ดํธํ์ต๋๋ค.
์ฌ๊ธฐ์์ ์ฐพ๊ธฐ : https://codesandbox.io/s/sweet-sea-irxl8์ด์ ๋ชฉ๋ก์ ์ ์๋ํ์ง๋ง ์ด์ํ๊ฒ๋ ์ฝํ ์ธ ์ ํจ๊ป ๋์ด๋๊ณ ๋ค์ ์ค์ด๋ค์ง ์์ต๋๋ค.
์๋ฏธ:
- 6 ๊ฐ ํญ๋ชฉ์ ํ์ํ๋ฉด ๋๊น์ง ์คํฌ๋กคํ๋ฉด ๋ชจ๋ ๊ฒ์ด ์ ์์ ๋๋ค.
- ๋ด์ฉ์ ๋ณ๊ฒฝํ์ฌ 20 ๊ฐ ํญ๋ชฉ์ ํ์ํ๊ณ ๋๊น์ง ์คํฌ๋กคํ์ญ์์ค.
- ์ฝํ ์ธ ๋ฅผ 6 ๊ฐ ํญ๋ชฉ์ผ๋ก ๋ค์ ๋ณ๊ฒฝํ๊ณ ๋ง์ง๋ง ํญ๋ชฉ๊น์ง ์คํฌ๋กคํ์ง๋ง ์ด์ ์ฝํ ์ธ (20 ๊ฐ ํญ๋ชฉ ๋ฐ์ดํฐ ์งํฉ)์์ ๋จ์์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ๊ณต๋ฐฑ์์ ๊ณ์ ์คํฌ๋กค ํ ์ ์์ต๋๋ค.
๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค
์ด๊ฒ์ด ๋ฐ๋ก ๋ด๊ฐ ํ์ํ ๊ฒ์
๋๋ค.
1.6.0-alpha.1์ DynamicSizeList๋ฅผ react-virtualized-auto-sizer ๋ฐ react-window-infinite-loader์ ํจ๊ป ์ฌ์ฉํ์ฌ ๋งค์ฐ ์ข์ ๊ฒฐ๊ณผ๋ฅผ ์ป์์ต๋๋ค.
์ด ์์
์ ์งํํ๊ธฐ ์ํด ์ ๊ฐ ๋์ธ ์์๋ ๊ฒ์ด ์์ต๋๊น?
์๋ ํ์ธ์ @bvaughn , https://github.com/bvaughn/react-window/issues/6#issuecomment -509213284์์ codesandbox๋ฅผ ํ์ธํ ์๊ฐ์ด ์์์ต๋๊น?
์๋
ํ์ธ์, ์ฑํ
์ฑ์ DynamicSizeList๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
๋ฉ์ง ๊ธฐ๋ฅ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
๊ทธ๋ฌ๋ ์ฑ๋ฅ์ด ๋จ์ด์ง๊ณ ์คํฌ๋ฆฝํธ ์ฒ๋ฆฌ๊ฐ ๋ง์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
์คํฌ๋กค ํ ๋ CPU๋ ํญ์ ์์นํ๊ณ ์ข
์ข
100 %์ ๋๋ฌํฉ๋๋ค.
์๋ฃจ์
์ ๋ํ ์์ด๋์ด๊ฐ ์์ต๋๊น?
import { useChatList } from '../../../hooks/chat/useChatList';
import LoadingSpinner from '../../../utils/LoadingSpinner';
import dynamic from 'next/dynamic';
import * as React from 'react';
import AutoSizer from 'react-virtualized-auto-sizer';
// @ts-ignore
import { DynamicSizeList as List } from 'react-window';
import { Message } from 'src/app/typings';
const { useRef, useCallback } = React;
const RowItem = React.memo(
({ forwardedRef, style, index, data }: any) => {
const item = data[index] as Message;
if (item) {
return (
<div id={item.messageId} ref={forwardedRef} style={style}>
{item.text && item.text.plainText}
</div>
);
}
return null;
},
(prevProps, newProps) => {
const { index, data } = prevProps;
const { index: newIndex, data: newData } = newProps;
let isMemo = true;
isMemo = isMemo && index === newIndex;
isMemo = isMemo && data.length === newData.length;
return isMemo;
}
);
function ChatList() {
const listRef = useRef<HTMLInputElement>();
const { formatMessages: messages, isLoadingMessages } = useChatList();
const keyCreator = useCallback((index: number) => `ChatList/RowItem/${messages[index].messageId}`, [messages]);
if (isLoadingMessages && (!messages || messages.length <= 0)) {
return <LoadingSpinner />;
}
return (
<div style={{ flex: 1, height: '100%', width: '100%' }}>
<AutoSizer>
{({ height, width }) => (
<List
ref={(lref: HTMLInputElement) => {
if (lref !== null) {
listRef.current = lref;
}
}}
itemCount={messages.length}
itemData={messages}
itemKey={keyCreator}
height={height}
width={width}
overscanCount={10}
>
{React.forwardRef((props, ref) => (
<RowItem forwardedRef={ref} {...props} />
))}
</List>
)}
</AutoSizer>
</div>
);
}
export default ChatList;
์๋
ํ์ธ์ @bvaughn , ์
์์
์ฅ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ ๋ ํญ๋ชฉ ๋์ด๋ฅผ ๋ค์ ๊ณ์ฐํ๋ ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ ๋ฌด์์
๋๊น? ์์ ์๊ฒฌ์ ํตํด ๋ช ๊ฐ์ง ๋ฐ๋ชจ๋ฅผ ๋ง๋ค๊ฒ ์ต๋๋ค. https://codesandbox.io/s/angry-hill-tcy2m
๋ง์ฐ์ค๋ก ์์
์ฅ์ ๋๋น๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๋ชจ๋ ํญ๋ชฉ ๋์ด๋ฅผ ๋ค์ ๊ณ์ฐํด์ผํฉ๋๋ค (VariableSizeList ๊ตฌ์ฑ ์์์ ๋ด๋ถ ๋์ด ์บ์๋ฅผ ์ง์ธ ์ ์์) ...
๋์ ๋ชฉ๋ก์ ๋ํ ํด๊ฒฐ์ฑ
์ด ์์ต๋๊น? ๋ฐฉ๊ธ 4 ์๊ฐ์ ๋ณด๋์ต๋๋ค.
๋ชจ๋ ๋๊ธ์ ์ฝ์ ํ ๐
๋น์ ์ด ์๋ํ๋ ํด๊ฒฐ์ฑ
์ด ์๋ค๋ฉด ์ ์๊ฒ ์ ๊ณตํ์ญ์์ค
์ด ํ๋ก์ ํธ์๋ "๋น์ ๋ค"์ด ์์ต๋๋ค. ํ ์ฌ๋์ด ๊ด๋ฆฌํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฐ์ ์ผ์ ๋ํด ๋ถํํ๋ฉด์ ๊ฐ์ ๋ ์ฌ๋ฌ ๋ฌธ์ ์ ๋ํ ์๊ฒฌ์ ๋จ๊ธฐ๋ ๊ฒ์ ์ผ์ข ์ ๊ณ ๋ คํ์ง ์์ต๋๋ค. ๊ผญ react-virtualized๋ฅผ ์ฌ์ฉํ์ธ์.
์ด ๋ธ๋ผ์ด์ธ ๊ฐ์ ๋๊ธ์ ๋จ๊ฒจ ์ฃผ์ ์ ์ ๋ง ์ฃ์กํฉ๋๋ค ๋์ค์์ด ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌ ํ ๋ค์ ๋ชจ๋ ๋๊ธ์ ์ฝ์์ผ๋ฉฐ ๋ค๋ฅธ ์ฌ๋๋ค์ด ์ต์ํ ๋น์ ์ ๋๊ณ ์๋ค๊ณ ์๊ฐํ์ต๋๋ค.
@ShivamJoker ๊ฑฐ์ ์๋ํ๊ฒ๋์์ต๋๋ค. ์๋ฒฝํ๊ฒ ์๋ํ๋ ๋ฐ ๋จ์ ์ ์ผํ ๊ฒ์ ์ฝํ ์ธ ๋ฅผ ๋ ์ ์ ํญ๋ชฉ์ผ๋ก ๋ณ๊ฒฝ ํ ํ์๋ ๊ณ์
@bvaughn https://github.com/bvaughn/react-window/issues/6#issuecomment -509213284์ ์๋ ๋ฐ์ค์์ ์์ ๋ฅผ ํ์ธํ ์๊ฐ์ด ์์ต๋๊น?
=> https://codesandbox.io/s/sweet-sea-irxl8
๋ ์งง์ ๋ชฉ๋ก์ผ๋ก ์์ํ๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Show Long List
ํด๋ฆญํ์ญ์์ค.Show Short List
๊ฐ์ฌํฉ๋๋ค!
@ShivamJoker ๊ฑฐ์ ์๋ํ๊ฒ๋์์ต๋๋ค. ์๋ฒฝํ๊ฒ ์๋ํ๋ ๋ฐ ๋จ์ ์ ์ผํ ๊ฒ์ ์ฝํ ์ธ ๋ฅผ ๋ ์ ์ ํญ๋ชฉ์ผ๋ก ๋ณ๊ฒฝ ํ ํ์๋ ๊ณ์
@bvaughn # 6 (์ฝ๋ฉํธ) ์ ์๋ ๋ฐ์ค์์ ์์ ๋ฅผ ํ์ธํ ์๊ฐ์ด ์์ต๋๊น?
=> https://codesandbox.io/s/sweet-sea-irxl8
๋ ์งง์ ๋ชฉ๋ก์ผ๋ก ์์ํ๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๋ชฉ๋ก ๋๊น์ง ์๋๋ก ์คํฌ๋กค
- ์๋ก ์คํฌ๋กคํ์ฌ
Show Long List
ํด๋ฆญํ์ญ์์ค.- ๋๊น์ง ์๋๋ก ์คํฌ๋กค
- ์๋ก ์คํฌ๋กคํ์ฌ
Show Short List
- ๋ง์ง๋ง์ผ๋ก ๋ง์ง๋ง์ผ๋ก ํ ๋ฒ ์๋๋ก ์คํฌ๋กคํ์ฌ ์งง์ ๋ชฉ๋ก ๋ค์ ๋ง์ ๊ณต๋ฐฑ์ด ์๋์ง ํ์ธํฉ๋๋ค.
๊ฐ์ฌํฉ๋๋ค!
์, ๊ธฐ๋ณธ์ ์ผ๋ก ๋ด๋ถ ์ปจํ ์ด๋๋ ๋ฐ์ดํฐ ํํฐ๋ง / ๋ณ๊ฒฝ์ ๋์ด๋ฅผ ์ฌ์ค์ ํด์ผํฉ๋๋ค.
@ShivamJoker ๊ฑฐ์ ์๋ํ๊ฒ๋์์ต๋๋ค. ์๋ฒฝํ๊ฒ ์๋ํ๋ ๋ฐ ๋จ์ ์ ์ผํ ๊ฒ์ ์ฝํ ์ธ ๋ฅผ ๋ ์ ์ ํญ๋ชฉ์ผ๋ก ๋ณ๊ฒฝ ํ ํ์๋ ๊ณ์
@bvaughn # 6 (์ฝ๋ฉํธ) ์ ์๋ ๋ฐ์ค์์ ์์ ๋ฅผ ํ์ธํ ์๊ฐ์ด ์์ต๋๊น?
=> https://codesandbox.io/s/sweet-sea-irxl8
๋ ์งง์ ๋ชฉ๋ก์ผ๋ก ์์ํ๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๋ชฉ๋ก ๋๊น์ง ์๋๋ก ์คํฌ๋กค
- ์๋ก ์คํฌ๋กคํ์ฌ
Show Long List
ํด๋ฆญํ์ญ์์ค.- ๋๊น์ง ์๋๋ก ์คํฌ๋กค
- ์๋ก ์คํฌ๋กคํ์ฌ
Show Short List
- ๋ง์ง๋ง์ผ๋ก ๋ง์ง๋ง์ผ๋ก ํ ๋ฒ ์๋๋ก ์คํฌ๋กคํ์ฌ ์งง์ ๋ชฉ๋ก ๋ค์ ๋ง์ ๊ณต๋ฐฑ์ด ์๋์ง ํ์ธํฉ๋๋ค.
๊ฐ์ฌํฉ๋๋ค!
๊ฐ์ฌํฉ๋๋ค ๋ค๋ฅธ ์ฌ์ฉ์์๊ฒ๋ ์ ์๋ํ๊ธฐ๋ฅผ ๋ฐ๋ผ๋ ๋์ผํ ๊ตฌํ
์, ์คํฌ๋กค์ ๋์ด ๋ฌธ์ ๋ ๋ณด์์ต๋๋ค.
@ graphee-gabrielํ์ง๋ง ๋ด ์ฑ ๋ฐ๊ฐ ์๋๋ก ์คํฌ๋กค ํ ๋ ์จ๊ธฐ๋ ๋ฐ ์ฌ์ฉ๋๋ ๋ฌธ์ ๊ฐ ํ๋ ๋ ์์ต๋๋ค. ์ง๊ธ ๋ฐ์ํ์ง ์๋ ์๋ฃจ์
์ ๋ฌด์์
๋๊น?
์ข์ ๋ . ๋ฐ๋ชจ ํ๋ก์ ํธ์์ DinamycSizeList๋ฅผ ์ฌ์ฉํ์ต๋๋ค. ๋ชจ๋ ๊ฒ์ด ๊ด์ฐฎ ์์ง๋ง ์ ์ ํ ๋ชฉ๋ก ๊ตฌ์ฑ ์์๊ฐ ์๋ชป ์๋ํ๊ธฐ ์์ํ์ต๋๋ค. ์ฒ์์๋ ๋ฐ์ ์ฐฝ์ด ์์กดํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ผ๊ณ ์๊ฐํ์ต๋๋ค. ํ์ง๋ง ๋ฐ๋ชจ๋ฅผ ๋ณด๋ฉด
https://react-window-next.now.sh/#/examples/list/dynamic -size
๊ณผ๊ฑฐ์๋ ์๋ฒฝํ๊ฒ ์๋ํ์ง๋ง ๊ฑฐ์ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๊ฒฌํ์ต๋๋ค. ์ด๋ฌํ ๋ฒ๊ทธ์ ์์ธ์ ์ ์ ํด ์ฃผ์๊ฒ ์ต๋๊น?
๋ฟก๋ฟก
์, ๊ธฐ๋ณธ์ ์ผ๋ก ๋ด๋ถ ์ปจํ ์ด๋๋ ๋ฐ์ดํฐ ํํฐ๋ง / ๋ณ๊ฒฝ์ ๋์ด๋ฅผ ์ฌ์ค์ ํด์ผํฉ๋๋ค.
์ด๋ป๊ฒํด์ผํ๋์ ์ํ ๋์ด๋ฅผ ์
๋ ฅ ํด ๋ณด์์ง๋ง ์๋ํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค
์ด๋ค ํด๊ฒฐ์ฑ
?
๋ฟก๋ฟก
์, ๊ธฐ๋ณธ์ ์ผ๋ก ๋ด๋ถ ์ปจํ ์ด๋๋ ๋ฐ์ดํฐ ํํฐ๋ง / ๋ณ๊ฒฝ์ ๋์ด๋ฅผ ์ฌ์ค์ ํด์ผํฉ๋๋ค.
์ด๋ป๊ฒํด์ผํ๋์ ์ํ ๋์ด๋ฅผ ์ ๋ ฅ ํด ๋ณด์์ง๋ง ์๋ํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค
์ด๋ค ํด๊ฒฐ์ฑ ?
๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๋ด๋ถ์ ์ผ๋ก ๊ตฌํํด์ผํฉ๋๋ค.
@ShivamJoker ๊ฑฐ์ ์๋ํ๊ฒ๋์์ต๋๋ค. ์๋ฒฝํ๊ฒ ์๋ํ๋ ๋ฐ ๋จ์ ์ ์ผํ ๊ฒ์ ์ฝํ ์ธ ๋ฅผ ๋ ์ ์ ํญ๋ชฉ์ผ๋ก ๋ณ๊ฒฝ ํ ํ์๋ ๊ณ์
@bvaughn # 6 (์ฝ๋ฉํธ) ์ ์๋ ๋ฐ์ค์์ ์์ ๋ฅผ ํ์ธํ ์๊ฐ์ด ์์ต๋๊น?
=> https://codesandbox.io/s/sweet-sea-irxl8
๋ ์งง์ ๋ชฉ๋ก์ผ๋ก ์์ํ๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๋ชฉ๋ก ๋๊น์ง ์๋๋ก ์คํฌ๋กค
- ์๋ก ์คํฌ๋กคํ์ฌ
Show Long List
ํด๋ฆญํ์ญ์์ค.- ๋๊น์ง ์๋๋ก ์คํฌ๋กค
- ์๋ก ์คํฌ๋กคํ์ฌ
Show Short List
- ๋ง์ง๋ง์ผ๋ก ๋ง์ง๋ง์ผ๋ก ํ ๋ฒ ์๋๋ก ์คํฌ๋กคํ์ฌ ์งง์ ๋ชฉ๋ก ๋ค์ ๋ง์ ๊ณต๋ฐฑ์ด ์๋์ง ํ์ธํฉ๋๋ค.
๊ฐ์ฌํฉ๋๋ค!
๊ณต๋ฐฑ์ ๋ฐฉ์งํ๊ธฐ ์ํด ํค๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค.
https://codesandbox.io/s/blissful-voice-mzjsc
์๋ ํ์ธ์ @bvaughn ์ด ๋ฉ์ง ํ๋ก์ ํธ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
ํ์๋ ์ ํ์์ด ์ด๋์์๋ ์คํฌ๋กคํ๋ ๋ฐฉ๋ฒ๊ณผ ์ธก์ ๋ ํญ๋ชฉ์ด ์๋ ํญ๋ชฉ์ผ๋ก ์คํฌ๋กคํ๋ ๋ฐฉ๋ฒ์ ์์ ๋ด๋ ค๊ณ DynamicLists ์ฝ๋์์ ๊ฝค ๋ง์ ์๊ฐ์ ๋ณด๋์ต๋๋ค.
๋๋ lastMeasuredIndex
ํ๊ณ ๋์ itemIsMeasured
ํญ๋ชฉ ๋น ํ์ธํจ์ผ๋ก์จ https://github.com/bvaughn/react-window/compare/issues/6...Sauco82 : issues / 6์์ ๊ทธ๋ ๊ฒ ํ ์์์์ต๋๋ค. itemIsMeasured
, ๋ถ๋ช
ํ ๋ค๋ฅธ ๋ง์ ๋ณ๊ฒฝ ์ฌํญ์ด ํ์ํฉ๋๋ค.
์ ๋ ์คํ ์์ค ํ๋ก์ ํธ์ ์ฐธ์ฌํ์ง ์์๊ณ Flow๋ฅผ ์ฌ์ฉํ ์ ์ด ์์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ด ์ ์ฉํ๊ฑฐ๋ ํฌํจ ํ ๊ฐ์น๊ฐ ์๋์ง, PR์ ์ง์ ์๋ํ๊ฑฐ๋ ์ฌ๊ธฐ์ ๋ ผ์ํด์ผํ ์ง ํ์คํ์ง ์์ต๋๋ค.
๊ธฐ๊บผ์ด ๋์ ๋๋ฆฌ๊ฒ ์ต๋๋ค. ํ์ํ ๊ฒ์ด ์์ผ๋ฉด ์๋ ค์ฃผ์ธ์.
์ฌ๊ธฐ ํจ์ฌ ๋ ๊ฐ๋จํ ์๋ฃจ์
์ด ์์ต๋๋ค (ํฌ๊ธฐ๋ฅผ ๊ณ์ฐํ๊ธฐ ์ํด DOM์ ๊ณ ์คํธ ์์๋ฅผ ์ถ๊ฐ ํ ํ์๊ฐ ์์).
์ฝ๋ ์๋ ๋ฐ์ค
์ฌ๊ธฐ ํจ์ฌ ๋ ๊ฐ๋จํ ์๋ฃจ์ ์ด ์์ต๋๋ค (ํฌ๊ธฐ๋ฅผ ๊ณ์ฐํ๊ธฐ ์ํด DOM์ ๊ณ ์คํธ ์์๋ฅผ ์ถ๊ฐ ํ ํ์๊ฐ ์์).
์ฝ๋ ์๋ ๋ฐ์ค
๋๋ฐ! ๊ทธ๊ฒ์ ๋๋ฅผ ์ํด ์๋ํฉ๋๋ค. ์ข์ ์์ .
@Kashkovsky ๋ ์
๋ฐ์ดํธ ๋ ๊ฒฝ์ฐ ํฌ๊ธฐ๋ฅผ ๊ณ์ฐํ์ต๋๋ค.
๋ฐ itemSize ํ ๋ฒ ํธ์ถ
@ userbq201 @Kashkovsky ํ๋ฅญํ ํด๊ฒฐ ๋ฐฉ๋ฒ! ์ด๋ป๊ฒ ๋ ๋ด ๊ฒฝ์ฐ์๋ ์์์์ ์๋ํ์ง ์์์ผ๋ฏ๋ก ChatHistory.js
์ฝ๋๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์์ ํด์ผํ์ต๋๋ค.
const listRef = useRef(); // added
const sizeMap = useRef({});
const setSize = useCallback((index, size) => {
sizeMap.current = {...sizeMap.current, [index]: size};
listRef.current.resetAfterIndex(index); // added
}, []);
const getSize = useCallback(index => sizeMap.current[index] || 60, []);
// ...
<List ref={listRef}
๊ทธ๋ ์ง ์์ผ๋ฉด ๋ชจ๋ ํญ๋ชฉ์ด ๋์ผํ ๊ธฐ๋ณธ ๋์ด๋ก ๋ ๋๋ง๋ฉ๋๋ค. ๊ทํ์ ๊ฒฝ์ฐ์๋ ๊ทธ๋๋ก ์๋ํฉ๋๋ค. ์ ์ฐจ์ด์ ์ด ์๋์ง ์ค๋ช ํ ์ ์์ต๋๋ค ... ์๋ง๋ @bvaughn์ด ํ ์ ์์ต๋๋ค.
@bvaughn SSR์ ๋ํด ์ ์ฌํ ๋์์ ํ์ฑํํด์ผํ๋ค๋ฉด ์ด๋จ๊น์? ๊ทธ์ชฝ์ ๋ํ ํํธ๊ฐ ์์ต๋๊น?
@bvaughn ์ ์ ๋๊น ์๋๋ฉด ๋ฐ๋ชจ ๊ฐ ์๋ํ์ง ์์ต๋๊น?
@Kashkovsky @ kirill-konshin ๋ฐ @ userbq201 ๋ฉ์ง ๊ตฌํ!
์ด ์๋ฃจ์ ์ผ๋ก ๋ฉ๋ชจ ํ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ ๋๊น?
memo
์์ areEqual
ChatMessage๋ฅผ ๋ํํ๋ ค๊ณ ์๋ํ์ง๋ง React๋ ๋ฉ์์ง๊ฐ ๋ชฉ๋ก์ ์ถ๊ฐ ๋ ๋๋ง๋ค ๊ฐ ๊ฐ์ฒด๋ฅผ ๋ค์ ๋ ๋๋งํฉ๋๋ค.
๋ด ๋ค๋ฅธ FixedSizedLists์์๋ ๋ฉ๋ชจ๊ฐ ํด๋น memo / areEqual ๋ํผ๋ก ์ ์๋ํ์ง๋ง ref={root}
๊ฐ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๊น?
React๊ฐ ์ปดํฌ๋ํธ๋ฅผ ๋ค์ ๋ ๋๋งํ๋์ง ์ฝ๊ฒ ์ ์ ์์ต๋๋ค. ํ ์คํธ ๋์ ์.
๋๋ ์ฌ๊ธฐ์ ์์ ๋ฅผ ํฌํฌํ๋ค : https://codesandbox.io/s/dynamic-size-of-react-window-list-items-nb038
ํธ์ง : ๋ฉ๋ชจ๋ฅผ ์์ ํ์ต๋๋ค-์ด๊ธฐ ๊ธฐ๋ฅ ๊ตฌ์ฑ ์์๋ฅผ ๋ฉ๋ชจ๋ก ๊ฐ์ธ๋ ๊ฒ์
๋๋ค.
ํธ์ง 2 : ํ์ ์ด๊ธฐ ๋ ๋๋ง์ ์์ ํ ๊ด์ฐฎ์ง ๋ง resetAfterIndex
ํธ์ถํ๋ ๊ฒ์ ๊ด๋ฆฌํ๊ธฐ๊ฐ ๋งค์ฐ ์ด๋ ต์ต๋๋ค. ๋ด ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ฉ๋๋ค (์ : ์ฌ์ฉ์๊ฐ ๋ค๋ฅธ ๋ํ๋ฅผ ์ ํํ๋ ๊ฒฝ์ฐ). ๊ทธ๋ฌ๋ ์ง์ง ๋ฌธ์ ๋ resetAfterIndex
๊ฐ ์ setSize
๊ฐ ์๋ฃ๋๊ธฐ ์ ์ ์คํ๋๋ ๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค๋ ๊ฒ์
๋๋ค. ๋ฐ๋ผ์ ์บ์ ๋ ์คํ์ผ์ ์ฑ๊ณต์ ์ผ๋ก ์ง์ฐ์ง ๋ง ๋ธ๋ผ์ฐ์ ๊ฐ ์ฝํ
์ธ ํฌ๊ธฐ ์กฐ์ ์ ์๋ฃํ์ง ์์๊ธฐ ๋๋ฌธ์ ์ด์ ์คํ์ผ์ ์ ์บ์๋ฅผ ๋ค์ ์์ฑํฉ๋๋ค.
๊ทธ๊ฒ์ด ๊ธ๋ก ์๋ฏธ๊ฐ ์๋์ง ํ์คํ์ง ์์ง๋ง ์ง๊ธ์ ์ฌ๊ธฐ์ ํ์ ๋ฃ์ด์ผํฉ๋๋ค. ๋๊ตฐ๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์ฝํ ์ธ ๋ฅผ ๋์ ์ผ๋ก ๋ณ๊ฒฝํ๊ณ ์ ๋ฐ์ดํธ ๋ ๋์ด ์คํ์ผ์ ์ ์งํ๊ณ ์๋์ง ์๋ ค์ฃผ์ธ์.
๋ค๋ฅธ ๋ง์ ๋ฐ์ ์ฐฝ ๊ตฌํ์ด ์์ผ๋ฏ๋ก์ด ์ฌ์ฉ ์ฌ๋ก์ ๋ํด ๋ฐ์ ๊ฐ์ํ๋ฅผ ์ฌ์ฉํ๋ ๋์ ์ฌ๊ธฐ์์ ์ข์ ์๋ฃจ์ ์ ์ฐพ๋ ๊ฒ์ด ์ข์ต๋๋ค.
ํธ์ง 3 : ๋ง์นจ๋ด ๋ฐ ์ฐ์ํ ์๋ฃจ์ ์ ์๊ฐํด ๋๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ์ต์ข ํธ์ง์ด ๋ ๊ฒ์ ๋๋ค.
1.) itemData๋ฅผ ๋ณ๊ฒฝํด์ผํ๋ ๊ฒฝ์ฐ (์ : ๋ํ๊ฐ ๋ณ๊ฒฝ ๋ ๋) ์ ์ฒด๋ฅผ ๋ง์ดํธ ํด์ ํฉ๋๋ค.
2.) ChatMessage
๋ฅผ ํตํด ChatContext
{sizeMap, setSize, listRef}
์ ChatMessage
์ ๋ฌํ์ต๋๋ค. ๊ทธ๋ฐ ์์ผ๋ก ํฌ๊ธฐ๋ฅผ ๋งน๋ชฉ์ ์ผ๋ก ์ค์ ํ๋ ๋์ ChatMessage์ ํฌ๊ธฐ๋ฅผ ์ค์ ํ๊ณ ์ด์ ํฌ๊ธฐ์ ๋น๊ตํ๋๋ก ์ง์ ํ ์ ์์ต๋๋ค. ์ด์ ํฌ๊ธฐ๊ฐ ์๋ก์ด ํฌ๊ธฐ์ ๋ค๋ฅธ ๊ฒฝ์ฐ, ๋ค์ ์ ํ resetAfterIndex
์์ index
ํ ์
๋ฐ์ดํธ์ ์ถฉ์ค ์ ๋ฌํฉ๋๋ค.
๊ทธ๋์ ๋ด ์ ChatMessage๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
const ChatMessage = ({ message, index }) => {
const { setSize, sizeMap, listRef } = useContext(ChatContext);
const root = React.useRef();
useEffect(() => {
let oldSize = sizeMap[index];
let newSize = root.current.getBoundingClientRect().height;
setSize(index, newSize);
if(newSize !== oldSize){
listRef.current.resetAfterIndex(index,true);
}
}, [sizeMap, setSize, listRef]);
return (
<div ref={root}
{message.body}
</div>
);
};
export default ChatMessage;
3.) ๊ธฐ๋ณธ์ ์ผ๋ก ์ฒญ์ทจ์ ์ธ ๊ฒ์ ๋ ๋๋ง๋ฉ๋๋ค. ๋ ๋๋ง๋๋ฉด ์๋์ชฝ์ผ๋ก ์คํฌ๋กค๋ฉ๋๋ค. ์ด๋ ๊ฒํ๋ฉด ํด๋น ๋ฉ์๋๊ฐ ํธ์ถ๋๊ธฐ ์ ์ ๋ ๋๋ง๋์ง ์์๊ธฐ ๋๋ฌธ์ scrollTo ํจ์๋ฅผ componentDidMount์ ์ง์ ๋ฃ์ ๋ ๋ฐ์ํ๋ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ฉ๋๋ค. ๊ทธ๋์
class Chat extends Component {
constructor(props) {
super(props);
this.listRef = createRef();
this.state = {
initialScrollComplete: false,
interval: null
};
}
componentDidMount(){
// Create interval to check if list is ready. Once ready, scroll to bottom of list.
this.setState({interval: setInterval(()=>{
if(this.listRef.current && !this.state.initialScrollComplete){
this.listRef.current.scrollToItem(this.props.chatHistory.length - 1, "end");
this.setState({initialScrollComplete: true});
}
},25)});
}
componentDidUpdate(prevProps, prevState) {
// Clear interval if scroll has been completed
if(!prevState.initialScrollComplete && this.state.initialScrollComplete){
clearInterval(this.state.interval);
this.setState({interval: null});
}
// If new message is transmitted, scroll to bottom
if(prevProps.chatHistory && this.props.chatHistory && prevProps.chatHistory.length !== this.props.chatHistory.length){
this.listRef.current.scrollToItem(this.props.chatHistory.length - 1, "end");
}
}
render() {
return <ChatHistory listRef={this.listRef} chatHistory={this.props.chatHistory}/>;
}
}
์ฌํ๋ฆฌ์์ ์ ๋ง ์ด์ํ ํ๋์ด์๋ ๊ฒ ๊ฐ์ต๋๋ค.
DynamicSizedList div์ ๋์ด์ ํ์ ๋์ด ๋๋ ์ฌ๋ฐฑ ์๋จ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ์ง ์์ต๋๋ค. ์ฝํ ์ธ ๊ฐ ๊ฒน์น๊ธฐ ์์ํฉ๋๋ค.
์ฐฝ ๋๋น / ํ์ ๋ด์ฉ์ด ๋ณ๊ฒฝ ๋ ๋ ์ ๋์ด๊ฐ ๋ค์ ๊ณ์ฐ๋๊ฑฐ๋ ๋ด์ฉ์ ์ ๋์ด์ ํจ๊ป ์๋ํ๋๋ก ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์ผ๋ก ๋ณด์ด๋ ๊ฒ์ ์ฝํ ์ธ ๋ฅผ ์คํฌ๋กค ํ ์์๋ ๊ฒฝ์ฐ ํ์ด ๋ ์ด์ ํ์๋์ง ์๋ ์ง์ ๊น์ง ์คํฌ๋กคํ๊ณ ์๋ก ์คํฌ๋กคํ๋ฉด ์ฌ๋ฐ๋ฅด๊ฒ ๋ ๋๋ง๋๋ ๊ฒ์ ๋๋ค.
์ฝํ ์ธ ๊ฐ ์ฒซ ํ์ด์ง๋ก๋์ ์ฌ๋ฐ๋ฅด๊ฒ ๋ ๋๋ง๋์ง ์์ผ๋ฏ๋ก ์๋ก ๊ณ ์นจํด๋ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
ํฌ๋กฌ๊ณผ ํ์ด์ด ํญ์ค๋ฅผ ํฌํจํ ๋ค๋ฅธ ๋ธ๋ผ์ฐ์ ์์๋ ์๋ฒฝํ๊ฒ ์๋ํฉ๋๋ค. Safari๋ ๋์ฐํ์ง๋ง ์ํ๊น๊ฒ๋ ์ฑ์ ์ฌ์ฉํ๋ ์ฌ๋๋ค์ ์ํด ์ฌ์ ํ ์๋ํด์ผํฉ๋๋ค.
์ ๋ง ๋์์ด ํ์ ํด์!
@tastyqbit Safari์ Internet Explorer์์๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ์์ ์ธ๊ธํ๋ฏ์ด ํ์ฅ ๋ ํ์์ง๋ ์คํฌ๋กค ํ ๋ค์ ๋ค๋ก ์คํฌ๋กคํ๋ฉด ์ฌ๋ฐ๋ฅด๊ฒ ๋ ๋๋ง๋์ง๋ง ์ค์ ๋ก ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์ง๋ ์์ต๋๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฐพ์ผ๋ฉด ์๋ ค์ฃผ์ญ์์ค!
@afreix @tastyqbit Safari ๋ฐ Internet Explorer์์ ๋ฐ์ํ ๋ฌธ์ ๋ ํด๋น ๋ธ๋ผ์ฐ์ ์์ ResizeObserver์ ๋ํ ์ง์์ด ๋ถ์กฑํ๊ธฐ ๋๋ฌธ์ด๋ผ๊ณ ํ์ ํฉ๋๋ค. ๋๋ ์ ํํ ๋น์ ์ ๋ฌธ์ ๋ฅผ ๊ฐ์ง๊ณ ์์๊ณ (๋ค๋ก ์คํฌ๋กคํ์ฌ ์์ ํ์ต๋๋ค) polyfill์ ์ถ๊ฐํ๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ต๋๋ค. ํธํ์ฑ ํ๋ MDN ์ ์ฐธ์กฐํ์ญ์์ค.
ResizeObserver๊ฐ ์์ผ๋ฉด ์ฝ์์ ๊ฒฝ๊ณ ๊ฐ ์์ฑ๋์ด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
https://codesandbox.io/s/agitated-jennings-o9nn6 ๊ณผ ๊ฐ์ ๊ฒ์ ์ด๋ป์ต๋๊น?
# 102์ VariableSizeList + ItemMeasurer๋ฅผ ์ฌ์ฉํ๋ ๊ธฐ๋ณธ ์ ๋ ์ด๊ฒ์ด ๋งค์ฐ ์์งํ ์ ๊ทผ ๋ฐฉ์์ด๋ผ๋ ๊ฒ์ ์๊ณ ์์ง๋ง ์์ ์๋ฃจ์ ์ผ๋ก ์๋ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค (๊ทธ๋ ๊ฒ ๋์์ง ์์ต๋๋ค ๐) ๐ค
์ฐ๋ฆฌ ํ์์๋ ๋ฌด์์ ํฌ๊ธฐ์ ํ
์คํธ ๋ฐ์ดํฐ๋ฅผ ๋๋์ผ๋ก ๋ ๋๋งํด์ผ ํ ํ์์ฑ์ ๋ฐ๊ฒฌํ์ต๋๋ค.
์ฐ๋ฆฌ์๊ฒ๋ ํญ๋ชฉ ์ฌ์ด๋ฅผ ์ ํํ๊ฒ ์ ํํ๊ณ ์ง์ฐ์์ด ์คํฌ๋กค ํ ์์๋ ๊ธฐ๋ฅ์ด ํ์์์ต๋๋ค.
๊ฝค ๋ง์ ์จ๋ผ์ธ ๊ฒ์ ํ์ ๋๋ ํฌ๊ธฐ ํ๊ณ ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ผ์ต๋๋ค.
์ฌ๋ฌ๋ถ ์ค ์ผ๋ถ๋ฅผ์ํ ์์ ํด๊ฒฐ์ฑ
์ผ๋ก ๋์์ด๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. : smile_cat :
์ผ,
๋ช ๊ฐ์ง ์์
ํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฐ ๊ด์ฐฎ์ ์ํ๊ฐ๋์๊ณ ํญ๋ชฉ์ด ์ฒ์ ๋ ๋๋ง ๋ ํ ํฌ๊ธฐ๊ฐ ๋ณ๊ฒฝ๋์ง ์์ผ๋ฉด ์ข์ ์๋ฃจ์
์ด ๋ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
@ gnir-work ์ฐฝ์ ํฌ๊ธฐ๊ฐ ์กฐ์ ๋๊ณ ์ปจํ ์ด๋ ํฌ๊ธฐ๊ฐ ๋ณ๊ฒฝ๋์ด ๋ชฉ๋ก ํฌ๊ธฐ๊ฐ ์กฐ์ ๋๋ฉด ์ด๋ป๊ฒ๋ฉ๋๊น?
์ด ์ค๋ ๋๋ฅผ ์ฝ์ผ๋ฉด ๋๋น๊ฐ ๋ณ๊ฒฝ ๋ ์์๋ ํญ๋ชฉ์ ์ฒ๋ฆฌํ๋ ๋ ์ข์ ๋ฐฉ๋ฒ์ด์์ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ฌ๊ธฐ์ '๋ณ์'์ ์ ์๋ ์ ์ฒด ์ธํธ์ ๊ฑธ์ณ ๊ฐ๋ณ์ ์ ๋๋ค. ์ค์ ํญ๋ชฉ ํฌ๊ธฐ๋ ๋์ ์ด ์๋๋ผ ์ ์ ์ ๋๋ค. ํ ์คํธ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ํฌ๊ธฐ๊ฐ ๋ณ๊ฒฝ๋๊ฑฐ๋ ๋ณํ๋๋ ๋์ ํฌ๊ธฐ๊ฐ ๋ณ๊ฒฝ ๋ ์ ์์ผ๋ฏ๋ก ๋์ ์ด ๋ ๋์ ์ฉ์ด ์ผ ์ ์์ต๋๋ค.
์ด๊ฒ์ด ์๋ํ๋ ๋ฐฉ๋ฒ์ ๋ถ๋ชจ์ ์คํฌ๋กค์ ๋ฃ๋ ๊ฒ์ ๋๋ค.
์๊ณ ๋ฆฌ์ฆ์ ๋ค์๊ณผ ๊ฐ์ด ์๋ํฉ๋๋ค.
๊ฐ ํญ๋ชฉ์ ์์ ํฌ๊ธฐ๋ฅผ ๊ณ์ฐํฉ๋๋ค. ์ด๊ฒ์ ๋งค์ฐ ํจ์จ์ ์ด์ด์ผํฉ๋๋ค. ์๋ฒฝ ํ ํ์๋ ์์ต๋๋ค. +-20 %๋ ๊ด์ฐฎ์ต๋๋ค.
๋ณด์ด๋ ์์ดํ ๋ง ๋ ๋๋ง + 20 % ๋ ๋งํด์ ์ฌ์ฉ์๊ฐ ์คํฌ๋กคํด๋ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ณด์ด์ง ์๋๋กํฉ๋๋ค.
'๋์ด'๊ฐ ์์ ๋์ด๋ก ์ค์ ๋ ๋ค๋ฅธ ๋ชจ๋ ํญ๋ชฉ์ ๋ํด '์ ๋ น'์ด ์์ต๋๋ค. ๋จ์ง ๋น div์ ๋๋ค. ์ด๋ ๊ฒํ๋ฉด ์คํฌ๋กค ๋ง๋๊ฐ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ณด์ ๋๋ค.
ํญ๋ชฉ์ ๋ทฐํฌํธ์์์ ๋๋ง ํ์๋ฉ๋๋ค. ๊ทธ ์ธ์ ์ ๋ น ์์ดํ ์ด ํ์๋ฉ๋๋ค.
์ ์ผํ ๋จ์ ์ ์คํฌ๋กค๋ฐ ๋์ด๊ฐ ์ฝ๊ฐ ๋ณ๊ฒฝ๋๋ค๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ด ์ฌ์ฉ์์์ฃผ์๋ฅผ ์ฐ๋งํ๊ฒํ ์ง ํ์คํ์ง ์์ต๋๋ค. ์คํฌ๋กค ๋ชฉ๋ก์ด ํฐ ๊ฒฝ์ฐ ์ผ ์ ์์ต๋๋ค. ์์ ํฌ๊ธฐ๊ฐ ์คํฌ๋กค ๋ง๋ ๊ธธ์ด์ ์ํฅ์์ฃผ์ง ์๋๋ก ๋ฒํผ๋ฅผ ๋๋ฆฌ๊ฑฐ๋ ์ค์์ผ๋ก์จ์ด๋ฅผ ์์ผ ์ ์์ต๋๋ค.
@ gnir-work ์ฐฝ์ ํฌ๊ธฐ๊ฐ ์กฐ์ ๋๊ณ ์ปจํ ์ด๋ ํฌ๊ธฐ๊ฐ ๋ณ๊ฒฝ๋์ด ๋ชฉ๋ก ํฌ๊ธฐ๊ฐ ์กฐ์ ๋๋ฉด ์ด๋ป๊ฒ๋ฉ๋๊น?
์ต์ ๋ฒ์ ( 2.2.0
)๋ถํฐ ๊ตฌ์ฑ ์์๋ ์ ์ฒด ๋ชฉ๋ก์ ํฌ๊ธฐ (๋์ด ๋ฐ ๋๋น) ๋ณ๊ฒฝ์ ์ง์ํฉ๋๋ค.
์ด ์ค๋ ๋๋ฅผ ์ฝ์ผ๋ฉด ๋๋น๊ฐ ๋ณ๊ฒฝ ๋ ์์๋ ํญ๋ชฉ์ ์ฒ๋ฆฌํ๋ ๋ ์ข์ ๋ฐฉ๋ฒ์ด์์ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ฌ๊ธฐ์ '๋ณ์'์ ์ ์๋ ์ ์ฒด ์ธํธ์ ๊ฑธ์ณ ๊ฐ๋ณ์ ์ ๋๋ค. ์ค์ ํญ๋ชฉ ํฌ๊ธฐ๋ ๋์ ์ด ์๋๋ผ ์ ์ ์ ๋๋ค. ํ ์คํธ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ํฌ๊ธฐ๊ฐ ๋ณ๊ฒฝ๋๊ฑฐ๋ ๋ณํ๋๋ ๋์ ํฌ๊ธฐ๊ฐ ๋ณ๊ฒฝ ๋ ์ ์์ผ๋ฏ๋ก ๋์ ์ด ๋ ๋์ ์ฉ์ด ์ผ ์ ์์ต๋๋ค.
์ด๊ฒ์ด ์๋ํ๋ ๋ฐฉ๋ฒ์ ๋ถ๋ชจ์ ์คํฌ๋กค์ ๋ฃ๋ ๊ฒ์ ๋๋ค.
์๊ณ ๋ฆฌ์ฆ์ ๋ค์๊ณผ ๊ฐ์ด ์๋ํฉ๋๋ค.
- ๊ฐ ํญ๋ชฉ์ ์์ ํฌ๊ธฐ๋ฅผ ๊ณ์ฐํฉ๋๋ค. ์ด๊ฒ์ ๋งค์ฐ ํจ์จ์ ์ด์ด์ผํฉ๋๋ค. ์๋ฒฝ ํ ํ์๋ ์์ต๋๋ค. +-20 %๋ ๊ด์ฐฎ์ต๋๋ค.
- ๋ณด์ด๋ ์์ดํ ๋ง ๋ ๋๋ง + 20 % ๋ ๋งํด์ ์ฌ์ฉ์๊ฐ ์คํฌ๋กคํด๋ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ณด์ด์ง ์๋๋กํฉ๋๋ค.
- '๋์ด'๊ฐ ์์ ๋์ด๋ก ์ค์ ๋ ๋ค๋ฅธ ๋ชจ๋ ํญ๋ชฉ์ ๋ํด '์ ๋ น'์ด ์์ต๋๋ค. ๋จ์ง ๋น div์ ๋๋ค. ์ด๋ ๊ฒํ๋ฉด ์คํฌ๋กค ๋ง๋๊ฐ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ณด์ ๋๋ค.
- ํญ๋ชฉ์ ๋ทฐํฌํธ์์์ ๋๋ง ํ์๋ฉ๋๋ค. ๊ทธ ์ธ์ ์ ๋ น ์์ดํ ์ด ํ์๋ฉ๋๋ค.
์ ์ผํ ๋จ์ ์ ์คํฌ๋กค๋ฐ ๋์ด๊ฐ ์ฝ๊ฐ ๋ณ๊ฒฝ๋๋ค๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ด ์ฌ์ฉ์์์ฃผ์๋ฅผ ์ฐ๋งํ๊ฒํ ์ง ํ์คํ์ง ์์ต๋๋ค. ์คํฌ๋กค ๋ชฉ๋ก์ด ํฐ ๊ฒฝ์ฐ ์ผ ์ ์์ต๋๋ค. ์์ ํฌ๊ธฐ๊ฐ ์คํฌ๋กค ๋ง๋ ๊ธธ์ด์ ์ํฅ์์ฃผ์ง ์๋๋ก ๋ฒํผ๋ฅผ ๋๋ฆฌ๊ฑฐ๋ ์ค์์ผ๋ก์จ์ด๋ฅผ ์์ผ ์ ์์ต๋๋ค.
์ด๊ฒ์ ์ด๋ฏธ react-virtualized
์์ @bvaughn ์ ์ํด ๊ตฌํ๋์์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์ฃผ์ ๋จ์ ์ ํน์ ํ์ผ๋ก ์ ํํ๋ ๊ฒ์ด ์ ๋๋ก ์๋ํ์ง ์๊ณ ์๋ก ์คํฌ๋กค ํ ๋ ์๊ฐ์ ๋ฒ๊ทธ๋ฅผ ์์ฑํ๋ค๋ ๊ฒ์
๋๋ค.
@ gnir-work ah .. ok ... ์๋ง๋ ๋ด ์์ ์ ์ค๋จํ๊ณ react-virtualized๋ฅผ ์ดํด๋ณผ ๊ฒ์ ๋๋ค.
๋๋ ๋น์ ์ด ์คํฌ๋กค ์ ๋ฌธ์ ์ ๋ง๋ค๊ณ ์๊ฐํ์ง๋ง '์์ ํฌ๊ธฐ'๋ฅผ ๊ฐ์ง๊ณ ์ด๊ฒ์ ๊ณ ์น ์ ์๋ค๊ณ ์๊ฐํ๊ณ ๊ตฌ์ฑ ์์๊ฐ ๋ง์ดํธ๋๋ฉด ์ค์ ํฌ๊ธฐ๋ก ๋ณํ ํ ์ ์์ต๋๋ค.
... ๋ฌผ๋ก ๋ ๋ค๋ฅธ ๋ฌธ์ ๋ ๋์ ์ฝํ ์ธ ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋๋ค. ๋ฌด์ธ๊ฐ๊ฐ ์ ๋ฐ์ดํธ๋๋ฉด ๊ตฌ์ฑ ์์ ๋์ด๊ฐ ๋ณ๊ฒฝ๋ฉ๋๋ค.
์์ ํฌ๊ธฐ๊ฐ ์๋ ํ ์์๋ ๊ฒ๋ณด๋ค ์ ํํ๋ฉด ์๋ฅผ ๋ค์ด ์ผ๋ง ์ ์ react-virtualized๋ก ๋์ ๋์ด๊ฐ์๋ ๊ฐ์ํ ๋ ๋ชฉ๋ก์ ๊ตฌํํ์ผ๋ฉฐ ์์ ํฌ๊ธฐ๊ฐ ์ ํํ๋ฉด ์ ์๋ํ์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์คํฌ๋กค ๊ธฐ๋ฅ์ด ๋ด ์ฑ์ ์์์ํฌ ์ ์์ต๋๋ค. โน
Windows 10 ์ฉ ๋ฉ์ผ์์ ๋ณด๋
๋ณด๋ธ ์ฌ๋ : Kevin Burton
๋ณด๋ธ ๋ ์ง : ํ์์ผ, 2020 ๋
4 ์ 14 ์ผ 23:07
๋ฐ๋ ์ฌ๋ : bvaughn / react-window
Cc : Nir Geller; ์ธ๊ธํ๋ค
์ ๋ชฉ : Re : [bvaughn / react-window] Just-In-Time ์ธก์ ์ฝํ
์ธ ์ง์ (# 6)
@ gnir-work ah .. ok ... ์๋ง๋ ๋ด ์์
์ ์ค๋จํ๊ณ react-virtualized๋ฅผ ์ดํด๋ณผ ๊ฒ์
๋๋ค.
๋๋ ๋น์ ์ด ์คํฌ๋กค ์
๋ฌธ์ ์ ๋ง๋ค๊ณ ์๊ฐํ์ง๋ง '์์ ํฌ๊ธฐ'๋ฅผ ๊ฐ์ง๊ณ ์ด๊ฒ์ ๊ณ ์น ์ ์๋ค๊ณ ์๊ฐํ๊ณ ๊ตฌ์ฑ ์์๊ฐ ๋ง์ดํธ๋๋ฉด ์ค์ ํฌ๊ธฐ๋ก ๋ณํ ํ ์ ์์ต๋๋ค.
... ๋ฌผ๋ก ๋ ๋ค๋ฅธ ๋ฌธ์ ๋ ๋์ ์ฝํ
์ธ ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์
๋๋ค. ๋ฌด์ธ๊ฐ๊ฐ ์
๋ฐ์ดํธ๋๋ฉด ๊ตฌ์ฑ ์์ ๋์ด๊ฐ ๋ณ๊ฒฝ๋ฉ๋๋ค.
โ
๋น์ ์ด ์ธ๊ธ ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๊ณ ์์ต๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ GitHub์์ ํ์ธํ๊ฑฐ๋ ๊ตฌ๋
์ ์ทจ์ํ์ธ์.
-
์ด ์ด๋ฉ์ผ์ Avast ๋ฐ์ด๋ฌ์ค ๋ฐฑ์ ์ํํธ์จ์ด์ ์ํด ๋ฐ์ด๋ฌ์ค ๊ฒ์ฌ๋ฅผ ๋ฐ์์ต๋๋ค.
https://www.avast.com/antivirus
@ gnir-work ์ ... ๋ด๊ฐ ์๊ฐํ๊ธฐ์ '์คํฌ๋กค ํฌ ๋ก์ฐ'๊ธฐ๋ฅ์ด ํ์ํ์ง ์์ต๋๋ค.
์ด๊ฒ์ด ๋น์ ์ ํ์์ ์ถฉ๋ถํ ๊ฒ์ ๋๋ค ๐
Windows 10 ์ฉ ๋ฉ์ผ์์ ๋ณด๋
๋ณด๋ธ ์ฌ๋ : Kevin Burton
๋ณด๋ธ ๋ ์ง : ํ์์ผ, 2020 ๋
4 ์ 14 ์ผ 23:13
๋ฐ๋ ์ฌ๋ : bvaughn / react-window
Cc : Nir Geller; ์ธ๊ธํ๋ค
์ ๋ชฉ : Re : [bvaughn / react-window] Just-In-Time ์ธก์ ์ฝํ
์ธ ์ง์ (# 6)
@ gnir-work ์ ... ๋ด๊ฐ ์๊ฐํ๊ธฐ์ '์คํฌ๋กค ํฌ ๋ก์ฐ'๊ธฐ๋ฅ์ด ํ์ํ์ง ์์ต๋๋ค.
โ
๋น์ ์ด ์ธ๊ธ ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๊ณ ์์ต๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ GitHub์์ ํ์ธํ๊ฑฐ๋ ๊ตฌ๋
์ ์ทจ์ํ์ธ์.
-
์ด ์ด๋ฉ์ผ์ Avast ๋ฐ์ด๋ฌ์ค ๋ฐฑ์ ์ํํธ์จ์ด์ ์ํด ๋ฐ์ด๋ฌ์ค ๊ฒ์ฌ๋ฅผ ๋ฐ์์ต๋๋ค.
https://www.avast.com/antivirus
ํด๊ฒฐ ๋ฐฉ๋ฒ :
์ ์ฒด ๊ตฌ์ฑ ์์๋ฅผ ๋ ๋๋งํ๋ ๋์ CanvasRenderingContext2D.measureText ()๋ฅผ ์ฌ์ฉํ์ฌ ํ ๋์ด๋ฅผ ๊ณ์ฐํ ์ ์์ต๋๋ค.
@bvaughn npm์ ์ ์ํ ๋ฒ์ ์ ๊ฒ์ ํ ๊ณํ์ด ์์ต๋๊น? 1.6.0-alpha.1
์ดํ ์
๋ฐ์ดํธ๊ฐ ์์ต๋๋ค ๐
@bvaughn ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น? ์ต์ ๋ฒ์ ์์ ์์ ๋ฉ๋๊น?
DynamicSizeList
์ ํจ๊ป Typescript๋ฅผ ์ฌ์ฉํ๋ ค๋ ์ฌ๋๋ค์ ์ํด-๋ชจ๋ ํ์ฅ์ DefinitelyTyped ์ ์์์ ์๋ํ๋ DynamicSizeList
ํ์ํ ์ ํ์ ์ ๊ณต ํ ์ ์์ต๋๋ค (์๋
์์ด ์ค๋ ๋์ ๊ฒ์ ๋ ๋ด ์ฟผ๋ฆฌ์ ๋ํ ํด๊ฒฐ ๋ฐฉ๋ฒ).
ํ๋ก์ ํธ์ ๋ค์์ ์ถ๊ฐํ์ญ์์ค.
import React, { Component } from 'react'
declare module 'react-window' {
export type DynamicSizeListProps = Omit<FixedSizeListProps, 'itemSize' | 'scrollToItem'>
export class DynamicSizeList extends Component<DynamicSizeListProps> {}
}
๊ทธ๋ฐ ๋ค์ ํ์์ ๊ฐ์ด ๊ฐ์ ธ์ต๋๋ค.
import {
DynamicSizeList,
DynamicSizeListProps,
} from 'react-window'
// use as normal...
@types/react-window
FixedSizeListProps
์ ์๋ฅผ ์ํด @types/react-window
๋จผ์ ์ค์นํด์ผํฉ๋๋ค.
typedefs์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ์ง๊ธ ์ถ๊ฐํ๊ฒ ์ต๋๋ค! ์ ๋ 1 ๋
๋๊ฒ ์ ํ์์ DynamicSizeList๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ํ์ฌ์ด ํฌํฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋กํฉ๋๋ค : "@john-osullivan/react-window-dynamic-fork": "^1.9.0-alpha.1"
(์์ง ์ต์ ์ํ์
๋๊น?). ์ด๊ฒ์ด ์ค์ ๋ก ์ถ์ ๋ ์ง ์ฌ๋ถ์ ๋ํ ๋ถํ์ค์ฑ ๋๋ฌธ์ react-virtuoso
๋ก ์ ํํ๋ ค๊ณ ํ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฑ๋ฅ์ด ๋จ์ด์ง๊ณ ์ด๊ฒ์ ๋ถ์ด ์์ต๋๋ค.
@bvaughn ์์ง cowpath๋ฅผ ํฌ์ฅํ๊ณ npm์ ๋ฆด๋ฆฌ์ค ํ ์๊ฐ์
๋๊น? ์์ง ์ค๋น๋์ง ์์ ๊ฒ์ด ๊ฑฑ์ ๋๋ค๋ฉด ExperimentalDynamicSizeList
๋ก ์ด๋ฆ์ ๋ณ๊ฒฝํ์ ์๋ ์์ต๋๋ค.
์๋ ํ์ธ์ ์ฌ๋ฌ๋ถ! ๊ทํ์ ๋ ธ๋ ฅ๊ณผ์ด ํ๋ฅญํ ๋์๊ด์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ์ด ๊ธฐ๋ฅ์ด ์ ๋ง ๊ธฐ๋๋ฉ๋๋ค! ๊ทธ๋ฌ๋์ด ๋ฌธ์ ์ ๊ดํ ์ ๋ณด๋ฅผ README ๋ฐ ๋ฌธ์ / ์์ ์ ์ถ๊ฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋์ ์ฝํ ์ธ ๊ฐ ์ค์ ๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ง์๋์ง ์๊ณ ๊ณ ์ / ์๋ ค์ง ํฌ๊ธฐ์ ํญ๋ชฉ์๋ง ์ ์ฉํ๋ค๋ ์ฌ์ค์ ํ์ ํ๋ ๋ฐ ๊ฝค ์๊ฐ์ด ๊ฑธ๋ ธ์ต๋๋ค. README์ ์ถ๊ฐ โโํ ์์๋ ๋ฉ์ง FAQ ์น์ ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
ํ
์ด๋ธ / ๊ทธ๋ฆฌ๋ / ํธ๋ฆฌ๋ฅผ ์ฐพ๊ณ ์๋ค๋ฉด VariableSizeGrid
์ ๊ตฌ์ถ ๋ https://autodesk.github.io/react-base-table/examples/dynamic-row-heights ์ข์ ์์์ด ๋ ๊ฒ์
๋๋ค.
@ tony-scio InfiniteLoader์ ํจ๊ป 1.6.0-alpha.1์ DynamicSizeList๋ฅผ ์ฌ์ฉํ๊ธฐ์ํ ์์ ์ฝ๋ ๋ฐ ์์๋ฅผ ๊ณต์ ํด ์ฃผ์๊ฒ ์ต๋๊น? ๊ฐ์ฌํฉ๋๋ค. ์ ๋ง ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
๋๊ตฌ๋ ์ง react-beautiful-dnd์ ํจ๊ป ์ผํ๊ธฐ ์ํด ์ด๊ฒ์ ์ป์์ต๋๊น? ๋๋๊ทธํ๋ฉด ํญ๋ชฉ์ด ์๋ก ์๋ก ์ ํํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค.
๋๊ตฌ๋ ์ง react-beautiful-dnd์ ํจ๊ป ์ผํ๊ธฐ ์ํด ์ด๊ฒ์ ์ป์์ต๋๊น? ๋๋๊ทธํ๋ฉด ํญ๋ชฉ์ด ์๋ก ์๋ก ์ ํํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค.
๋๋ ๋ํ์ด ๋๋ต์ ๊ธฐ๋ค๋ฆด ๊ฒ์ ๋๋ค : D
[๋์]
์ด ๋งํฌ์๋ ํ์ ํ ์ฝ๋๊ฐ ์์ต๋๋ค.
๋์ ํฌ๊ธฐ ๋ชฉ๋ก ์์ง
์ด ๋ฅ๋ ฅ์ด ํ์ํฉ๋๋ค.
๊ฐ์ฌ
[๋์]
์ด ๋งํฌ์๋ ํ์ ํ ์ฝ๋๊ฐ ์์ต๋๋ค.
๋์ ํฌ๊ธฐ ๋ชฉ๋ก ์์ง
์ด ๋ฅ๋ ฅ์ด ํ์ํฉ๋๋ค.
๊ฐ์ฌ
https://react-window-next.now.sh/#/examples/list/dynamic -size
์ด๊ฒ์ ๋ํ ์
๋ฐ์ดํธ๊ฐ ์์ต๋๊น? ์ฐ๋ฆฌ๊ฐ ํ ์์๋ ๊ฒ๊ณผ ๋น์ทํ ๊ฒ์ด ํ์ํฉ๋๋ค (์ผ๋ฐ์ ์ผ๋ก ๋งค์ฐ ์ ์ง ๋ง ๊ฒฝ์ฐ์ ๋ฐ๋ผ ๋ง์ ์ ์์). ๋ํ ์๋ต ๊ทธ๋ฆฌ๋ ํญ๋ชฉ ๋ชฉ๋ก์ ๋ ๋๋งํฉ๋๋ค (๋์ด๋ ๋์ ์ด๋ฉฐ ๋ค์ํ ํ
์คํธ ๋ฉ ๋ฑ์ผ๋ก ๋ชจ๋ฐ์ผ์์ ๋ณ๊ฒฝ๋จ). ์ด ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ฒ๋ฆฌ ํ ์ โโ์๋ค๋ฉด react-window
๊ฐ ๊ฒ์ ์ฒด์ธ์ ๊ฐ ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ์ ๋ขฐํ ์์๋ ๋์์ด ์์ต๋๊น?
์ด๊ฒ์ ๋ํ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น? ์ฐ๋ฆฌ๊ฐ ํ ์์๋ ๊ฒ๊ณผ ๋น์ทํ ๊ฒ์ด ํ์ํฉ๋๋ค (์ผ๋ฐ์ ์ผ๋ก ๋งค์ฐ ์ ์ง ๋ง ๊ฒฝ์ฐ์ ๋ฐ๋ผ ๋ง์ ์ ์์). ๋ํ ์๋ต ๊ทธ๋ฆฌ๋ ํญ๋ชฉ ๋ชฉ๋ก์ ๋ ๋๋งํฉ๋๋ค (๋์ด๋ ๋์ ์ด๋ฉฐ ๋ค์ํ ํ ์คํธ ๋ฉ ๋ฑ์ผ๋ก ๋ชจ๋ฐ์ผ์์ ๋ณ๊ฒฝ๋จ). ์ด ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ฒ๋ฆฌ ํ ์ โโ์๋ค๋ฉด
react-window
๊ฐ ๊ฒ์ ์ฒด์ธ์ ๊ฐ ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ์ ๋ขฐํ ์์๋ ๋์์ด ์์ต๋๊น?
@JavaJamie๋ ํน๋ณํ ๋์์ ์์ฒญ -react -virtuoso ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ ๋์ ์ฝํ ์ธ ์ธก์ ์์ํ ๋ด์ฅ ์ง์์ ์ ๊ณตํฉ๋๋ค. ๋ฉด์ฑ ์กฐํญ : ๋๋ ๊ทธ๊ฒ์ ์ ์์ ๋๋ค.
@JavaJamie๋ ํน๋ณํ ๋์์ ์์ฒญ -react -virtuoso ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ ๋์ ์ฝํ ์ธ ์ธก์ ์์ํ ๋ด์ฅ ์ง์์ ์ ๊ณตํฉ๋๋ค. ๋ฉด์ฑ ์กฐํญ : ๋๋ ๊ทธ๊ฒ์ ์ ์์ ๋๋ค.
react-virtuoso๋ ๋ฐ์ ์ฐฝ์ ํฌ๊ธฐ๋ ๋ ๋ฐฐ์ ๋๋ค. ํญ์ ์ข ์์ฑ ํฌ๊ธฐ๋ฅผ ์ผ๋์ ๋์ด์ผํฉ๋๋ค.
https://bundlephobia.com/[email protected]
https://bundlephobia.com/[email protected]
๋๋์ด ๋
ธ๋ ฅ์ ๋ง์น ์๊ฐ์ด๋ ์๋์ง๊ฐ ์๋ค๋ ์ฌ์ค์ ๋ฐ์ ๋ค์๋ค. ๋๊ตฌ๋ ์ง ๋ด๊ฐ ์์ํ ์ง์ ์ ๋ค์ด๊ฐ์ ๋๋ด๊ณ ์ถ๋ค๋ฉด ๋น์ ์ ๋์์ ํ์ํฉ๋๋ค. (์๋ก์ด List
๋ฐ Grid
๊ตฌ์ฑ ์์๋ก์ ๋ฒ์ 2 ๋ฆด๋ฆฌ์ค์ ์ด๋ป๊ฒ ์ ์ฉ๋๋์ง์ ๋ํด์๋ ๋ฌธ์ # 302๋ฅผ ์ฐธ์กฐํ์ญ์์ค.)
์ฐ๋ฆฌ๋ ์ค์ ๋ก ์ ์๋ํ๋ ๊ฐ์์ฑ ์ผ์๋ฅผ ์ฌ์ฉํ๋๋ก ์ฒ์๋ถํฐ ๋ฌด์ธ๊ฐ๋ฅผ ๊ตฌํํ์ต๋๋ค.
๋๋ ๊ทธ๊ฒ์ OSS ๋๋ ๋น์ ์ด ๊ทธ๊ฒ์ ๋ฏ์ด ๋ด๊ณ ์ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค๊ฑฐ๋ ์ฌ๊ธฐ๋ก ์ฎ๊ธฐ๊ณ ์ถ๋ค๋ฉด ๋น์ ๋ค์๊ฒ ์ฌ๋ฐ๋ฅธ ์์น๋ฅผ ๊ฐ๋ฆฌํฌ ์ ์์ต๋๋ค.
ํ ๊ฐ์ง ํธ๋ฆญ์ '๋ธ๋ก'์ ์ฌ์ฉํ์ฌ ์ฑ๋ฅ์ ๋์ผ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ ํ์ ๊ฐ์ ธ ์์ ์ค์ ๋ก 25 ๊ฐ ํญ๋ชฉ์ ์์ ๋ธ๋ก์ ๋ฃ์ ๋ค์ ํ์ํ ๋ ๊ต์ฒดํฉ๋๋ค.
@burtonator ์ ๋ง ๋์์ด ๋ ๊ฒ์ ๋๋ค
๋๊ตฌ๋ DynamicSizeList๋ฅผ ์ฌ์ฉํ์ฌ ๋ฒ๊ทธ์๋ react-select ๊ตฌํ์ ์ ๊ณต ํ ์ ์์ต๋๊น?
ํจ๊ป ์ ์๋ํ์ง ์์ต๋๋ค.
ํ์ฌ ๋ ๊ฐ์ง ๋ฌธ์ ์ ์ง๋ฉด ํด ์์ต๋๋ค (์คํฌ๋ฆฐ ์ท์ด ์์ด์ ์ฃ์กํฉ๋๋ค).
style={position: absolute, left: 0, top: 0}
๊ฐ ์์ต๋๋ค. ๋ชจ๋ ์ต์
์ด ์๋ก ์์ ์๊ธฐ ๋๋ฌธ์์ด ์คํ์ผ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.๋ ๊ฐ์ง์ ์๋ ์๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.
Chrome์์ 1.9.0 ํฌํฌ๋ฅผ ์ฌ์ฉํ๋ค๋ ์ ์ ์ ์ํ๊ฒ ์ต๋๋ค.
ํธ์งํ๋ค. ์์ ์จ๊ฒจ์ง ๋๊ธ ์น์ ์์ ๋ต์ ์ฐพ์์ต๋๋ค. https://github.com/bvaughn/react-window/issues/6#issuecomment -509016422
์คํฌ๋กค ๋ฌธ์ ์ ๋ํ ํ ๊ฐ์ง ๋จ์ํ๋ ์คํฌ๋กค์ด ๋ทฐํฌํธ ๋์ด๊ฐ ๋๋ต ํ ๊ฐ ์ด์ ๋จ์ด์ ธ์๋ ๊ฒฝ์ฐ ์คํฌ๋กค ๋ง๋๋ฅผ ์ฌ์ฉํ์ฌ ํฝ์ ์์น ๋์ ๋ชฉ๋ก์์๋ ํญ๋ชฉ์ ์ธ๋ฑ์ค๋ฅผ ๋ํ๋ด๋ ๊ฒ์ ๋๋ค. ๊ตฌ์ฑ ์์๋ X ํฝ์ ์ "์๋๋ก ์คํฌ๋กค"ํ๋ ๋์ ์ํ๋ ์ธ๋ฑ์ค ์ฃผ๋ณ์ ํญ๋ชฉ์ ๋ ๋๋งํฉ๋๋ค. ์ค๊ฐ ์๋๋ก ํญ๋ชฉ์ ์ธ๋ฑ์ค N / 2์ ๋ ๋๋งํ๊ณ ๋งจ ์๋์ ํญ๋ชฉ์ ์ธ๋ฑ์ค N-1์ ๋ ๋๋งํฉ๋๋ค.
๊ทธ๋ฌ๋ฉด ๊ตฌ์ฑ ์์๊ฐ ํฌ๊ธฐ๋ฅผ ๋ ๋๋งํ๊ณ ๊ณ์ฐํ๋ ๋์ ์คํฌ๋กค ์ธ์ ์ง์ฐ์์ด ๋ชฉ๋ก์ ์ค๊ฐ ๋๋ ๋์ผ๋ก ์ง์ ์ธ ์คํฌ๋กค์ด ๊ฐ๋ฅํฉ๋๋ค. ์ง๊ธ์ ๋งค์ฐ ๊ธด VariableSizeList ๊ตฌ์ฑ ์์์ ๊ฒฝ์ฐ ์คํฌ๋กค ์ธ์ด ์์ง์ด๋ ๊ฒ๋ณด๋ค ์ปค์๊ฐ ๋ ๋นจ๋ฆฌ ๋๋๊ทธ๋๋ฏ๋ก ์๋์ชฝ์ผ๋ก ์คํฌ๋กคํ๋ ๊ฒ์ด ๊ฑฐ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ด ํ๋ก์ ํธ์๋ "๋น์ ๋ค"์ด ์์ต๋๋ค. ํ ์ฌ๋์ด ๊ด๋ฆฌํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฐ์ ์ผ์ ๋ํด ๋ถํํ๋ฉด์ ๊ฐ์ ๋ ์ฌ๋ฌ ๋ฌธ์ ์ ๋ํ ์๊ฒฌ์ ๋จ๊ธฐ๋ ๊ฒ์ ์ผ์ข ์ ๊ณ ๋ คํ์ง ์์ต๋๋ค. ๊ผญ react-virtualized๋ฅผ ์ฌ์ฉํ์ธ์.