์๋
ํ์ธ์,
๋ถ๋ถ์ ์ผ๋ก ๋ก์ปฌ ๋ฐ ๋ถ๋ถ์ ์ผ๋ก ์๊ฒฉ ๋ฐ์ดํฐ๋ฅผ ํ์ํ๋ ๋ชฉ๋ก ๋ณด๊ธฐ๊ฐ ์์ต๋๋ค. ๋ก์ปฌ ๋ฐ์ดํฐ๋ ListView.DataSource์ ์ด๊ธฐ๊ฐ์
๋๋ค. ์ด ๋ฐ์ดํฐ ์์ค๋ ListView๋ฅผ ๋ํํ๊ณ ListView์ ๋ ๋๋ง ๋ฉ์๋๋ฅผ ์ ๋ฌํ๋ ์ฌ์ฉ์ ์ง์ ๊ตฌ์ฑ ์์์ ์ํ๋ก ์ค์ ๋ฉ๋๋ค. ์๊ฒฉ ๋ฐ์ดํฐ๊ฐ ์์ ๋๋ฉด ์ ๋ฐ์ดํฐ ์์ค๊ฐ cloneWithRowsAndSections ๋ฉ์๋์ ์ํด ๋ณต์ ๋๊ณ ์ฌ์ฉ์ ๊ตฌ์ฑ ์์์ ์ํ๋ก ์ค์ ๋ฉ๋๋ค. ๋ฌธ์ ๋ ์ด๋ฏธ ํ์๋ ํ๋ง ๋ค์ ๋ ๋๋ง๋๊ณ ์คํฌ๋กค ํ์ ์ ํ์ด ๋ ๋๋ง๋๋ค๋ ๊ฒ์
๋๋ค.
๋ฒ๊ทธ์ ๋๊น ์๋๋ฉด ListView๋ฅผ ๊ฐ์ ๋ก ๋ ๋๋งํด์ผ ํฉ๋๊น? react-native 0.5์์๋ ์๋ํ์ง๋ง 0.6์ผ๋ก ์ ๊ทธ๋ ์ด๋ํ ํ์๋ ์์์ ์ค๋ช ํ ๋๋ก ์๋ํฉ๋๋ค.
+1
์ ํํ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. 0.5์์๋ ์๋ํ์ง๋ง 0.6์์๋ ์ค๋จ๋์์ต๋๋ค.
์ด๊ฒ์ 0.7์์ ์์ ๋์ด์ผ ํฉ๋๋ค.
๋๋ ๋๊ฐ์ ๋ฌธ์ ๋ฅผ ๊ฒฝํํ์ต๋๋ค.
cloneWithRows๋ ์ ์๋ํฉ๋๋ค. ๊ทธ๋ฌ๋ cloneWithRowsandSections๋ ๊ทธ๋ ์ง ์์ต๋๋ค.
cloneWithRowsandSections๊ฐ 0.7์์ ์๋ํ์ง ์๋ ๊ฒ์ด ๋ณด์ ๋๊น?
๋ํ initialListSize๋ฅผ ๋ ํฐ ์ซ์๋ก ์ค์ ํ๋ ค๊ณ ํ ์๋ ์์ต๋๋ค. ์ด๋ 0.7์์ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์ง ์์ ๊ฒฝ์ฐ ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก ๋์์ด ๋ ์ ์์ต๋๋ค.
๋ ํฐ initialListSize๋ ๋์์ด ๋์ง ์์ผ๋ฉฐ 0.7 ๋ฒค๋ ์ข ์์ฑ ๋๋ฌธ์ ์์ง ์๋ํ์ง ์์์ต๋๋ค. ๋๊ตฐ๊ฐ๊ฐ ๋ ๋น ๋ฅด์ง ์์ ๊ฒฝ์ฐ ๊ฐ๋ฅํ ํ 0.7์ ๋ํด ์๋ ค ๋๋ฆฌ๊ฒ ์ต๋๋ค. :)
๋ฒ์ 0.6์ cloneWithRows์ ๋์ผํ ๋ฌธ์ ๊ฐ 0.5์์ ์๋ํ์ต๋๋ค.
0.7์์๋ ์๋ํ์ง ์์์ต๋๋ค. ์๋ํด ๋ณผ ๊ฒ์ ๋๋ค. ๋๋ ๋ํ ์ด์ ์ initialListSize๋ฅผ ๋ ๋์ ์ซ์๋ก ์ค์ ํ๋ ค๊ณ ์๋ํ์ง๋ง ๋์์ด ๋์ง ์์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
0.7์์ ์๋
0.7.1์์๋ ์๋ํ์ง ์์
๋ฒ์ 0.7.1์ cloneWithRows์ ๋์ผํ ๋ฌธ์ ๊ฐ ์์
๋๋ฅผ ์ํด ๊ทธ๊ฒ์ 0.7.1์์ ์ ์๋ํฉ๋๋ค.
0.8.0์์๋ ์๋ํ์ง ์์ต๋๋ค.
์์ง ์ฌ์ฉ cloneWithRows
๋์ cloneWithRowsAndSections
cloneWithRows
์ด(๊ฐ) yamill์ ์ ํฉํฉ๋๊น? 0.8.0์์๋ ๊ทธ๋ ์ง ์์ต๋๋ค.
@coderdave๋ ์ค์ ๋ก cloneWithRows
๋ ์๋ํ์ง ์์ต๋๋ค. ๋ด ์ค์.
@sahrens @ide @michalraska ๋ด scrollY
์ํ์ด ์
๋ฐ์ดํธ๋์ง ์์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ด ์คํฌ๋กค ์คํ์
์ ๊ตฌ์ฑ ์์์ ์ ๋ฌํ๋ ค๊ณ ํ์ต๋๋ค.
renderRow: function (rowData, sectionID, rowID) {
return (
<Row
key={rowData.id} data={rowData} scrollY={this.state.contentOffset}
/>
)
});
๊ทธ๋ฌ๋ ์ด ์ค์ ์์ ํ๋ฉด ๋ด ๊ตฌ์ฑ ์์์ ๋ํ scrollY
์ํ์ ์ฑ๊ณต์ ์ผ๋ก ๋ฐ์ ์ ์์ต๋๋ค. ์ด ๋ณ๊ฒฝ์ผ๋ก ๋ค๋ฅธ ๋ชจ๋ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๋์ง ๊ถ๊ธํฉ๋๋ค.
๋๋ ๊ทธ๊ฒ์ ๋ค์์์ ๋ณ๊ฒฝํ์ต๋๋ค.
var shouldUpdateRow = rowCount >= this.state.prevRenderedRowsCount && dataSource.rowShouldUpdate(sectionIdx, rowIdx);
์๊ฒ
var shouldUpdateRow = true;
0.11.0-rc์์๋ ์ด๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค.
๋ค์์ ๋ฌธ์ ๋ฅผ ์ฌํํ ์ ์๋ ๋ ๊ฐ์ง ์์ ๋๋ค.
ํ: https://rnplay.org/apps/d3DM6A
ํ + ์น์
: https://rnplay.org/apps/xnyaYw
๋ด๊ฐ ์๊ฐํด๋ธ ์์ ํด๊ฒฐ์ฑ ์ ListView 1pt๊ฐ ๋ง์ดํธ๋ ๋ ์คํฌ๋กคํ๋ ๊ฒ์ ๋๋ค.
let listViewScrollView = this.refs.listView.getScrollResponder();
listViewScrollView.scrollTo(1);
ํ ์คํธ๋ฅผ ์ํด rnplay.org์ ์์ ๋ด์์ ์ด ์น์ ์ ์ฃผ์์ ์ ๊ฑฐํ ์ ์์ต๋๋ค.
์ด๋ฆฌ์์ ์ง๋ฌธ. ์ด๊ฒ์ NavigatorIOS๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๊ด๋ จ์ด ์์ต๋๊น? ๋ชฉ๋ก ๋ณด๊ธฐ๊ฐ NavigatorIOS์ ์์์ผ๋ก ๋ ๋๋ง๋ ๋ ๋ ๋๋ง, ํจ๋ฉ ๋ฑ์ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค.
@jaygarcia ์์ ์์๋ NavigatorIOS๋ฅผ ์ฌ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ ๊ทธ๋ ๊ฒ ์๊ฐํ์ง ์์ต๋๋ค. ๋ํ ๋ด ํ๋ก์ ํธ์์ NavigatorIOS ๋์ Navigator๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
+1, ํ์ฌ Navigator๋ฅผ ์ฌ์ฉํ ๋ ์ด ๋์์ด ๋ฐ์ํ๊ณ ์์ต๋๋ค. ์ ๋ 0.11์ด๊ณ cloneWithRows๋ฅผ ์ฌ์ฉํฉ๋๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก @christopherdro ์ ์๋ฃจ์ ์ ์ฌ์ฉํด์ผ ํ์ง๋ง ํญ๋ชฉ์ ๋ ๋๋งํ๋ ค๋ฉด ์ถฉ๋ถํ ์คํฌ๋กคํด์ผ ํฉ๋๋ค(ํฌ๊ธฐ๊ฐ ํผ).
ํฅ๋ฏธ๋กญ๊ฒ๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ด ๋ฒ๊ทธ์ ๋ํ ํด๊ฒฐ ๋ฐฉ๋ฒ๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค. https://github.com/facebook/react-native/issues/1878 ๋ฐ๋ผ์ ์ต์ข ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
listViewScrollView.scrollWithoutAnimationTo(80);
listViewScrollView.scrollWithoutAnimationTo(-80);
์ข์, ์์์ ์ธ๊ธํ ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ ์ค์ฒฉ๋ ScrollViews์ ๋ช ๊ฐ์ง ๊ธฐ์ดํ ๋ฒ๊ทธ๊ฐ ์์ต๋๋ค. ๋ง์ดํธ ํ ํด๋น ๋ณด๊ธฐ์์ ์ด๊ธฐ ์คํฌ๋กค ์คํ์ ์ ์์น๋ฅผ โโ๋ณ๊ฒฝํ๋ onScroll ์ด๋ฒคํธ๊ฐ ํธ๋ฆฌ๊ฑฐ๋์์ต๋๋ค.
์ฌ์ ํ 0.12.0์ ๋ฒ๊ทธ์ ๋๋ค. ๋ค์์ ๋ณด๊ธฐ ๊ณ์ธต ๊ตฌ์กฐ์ ๋๋ค.
0.11.0์ @Sidnicious ์ ๋์ผํ ๋ฌธ์ ์
๋๋ค. ๋ด ์ฑ์๋ ์ด๊ธฐ ๋ฒ์ ์ react-native๋ถํฐ ์ด ๋ฌธ์ ๊ฐ ์์์ต๋๋ค. Navigator
๊ณ์ธต ๊ตฌ์กฐ์์ ListView
์ด๋ํ๋ฉด ๋ชจ๋ ๊ฒ์ด ์์๋๋ก ์๋ํฉ๋๋ค.
0.13.0-rc
์ฌ์ฉํ์ฌ ๋์ผํ ๋ฌธ์ ๋ฅผ ๊ฒช๊ณ ์์ต๋๋ค.
0.13.1
๊ณผ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
constructor(props) {
super(props);
var ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});
this.state = {dataSource: ds.cloneWithRows(Array.apply(null, {length: 100}).map(Number.call, Number))};
}
render() {
return (
<ListView
style={{paddingTop: 20, flex: 1}}
dataSource={this.state.dataSource}
renderRow={(rowData) => <Text>{rowData}</Text>}
/>
)
์ ์๊ฒ ์ด ๋ฌธ์ ๋ 0.14.2
์์ 0.16.0-rc
์
๊ทธ๋ ์ด๋ํ ๋ ๋ํ๋ฌ์ต๋๋ค. ์ ์๊ฒ ํจ๊ณผ๊ฐ ์์๋ ์์ ์ฌํญ์ ListView์ pageSize
์ํ์ 3์ผ๋ก ์ค์ ํ๋ ๊ฒ์ด์์ต๋๋ค. 2๋ ์ ์๊ฒ ํจ๊ณผ๊ฐ ์์์ง๋ง 3์ ์ ์๋ํ์ต๋๋ค.
ยฏ_(ใ)_/ยฏ
์ฌ๊ธฐ์ 0.15.0๊ณผ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋ชจ๋ ํธ๋ฆญ์ ์๋ํ์ง๋ง ์ด์ด ์์์ต๋๋ค. iOS 9.1 ์์ดํฐ 6
@nicklockwood - ์ฌ๊ธฐ์ ๋์์ฃผ์ค ์ ์๋์? ์์ง ๋ฒ๊ทธ๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
0.14, ๋์ผํ ๋ฌธ์
์ ์ฌํ LisView ๋ฌธ์ ์ฐ๊ฒฐ: https://github.com/facebook/react-native/issues/4728
๋ค๋ฅธ ์ ์ฌํ ๋ฌธ์ ์ฐ๊ฒฐ: https://github.com/facebook/react-native/issues/4179
๋๋ ์ด๊ฒ์ 0.16.0์์ ๋ณด๊ณ ์๋ค. Product Pains์ ๋ ์ด๋์ ์ด๊ฒ์ ๋ฐฐ์นํ ์ฌ๋์ด ์์ต๋๊น? ์ด๊ฒ์ ์๋นํ ๊ณ ํต์ค๋ฌ์์ง๊ณ ์์ต๋๋ค. :/
๋๋ ์ด๊ฒ์ Product Pains ์ ๊ฒ์ํ์ต๋๋ค. ๊ทธ๊ฒ์ด ์ฌ์ ํ ์ํฅ์ ๋ฏธ์น๊ณ ์๋ค๋ฉด ๊ฑฐ๊ธฐ์ ์์ ๋กญ๊ฒ ํฌํํ์ญ์์ค.
0.16, ๋์ผํ ๋ฌธ์
dataSource์์ cloneWithRows๋ฅผ ์ฌ์ฉํ๋ 0.17์์๋ ๋ฌธ์ ๊ฐ ๊ณ์ ๋ฐ์ํฉ๋๋ค. ๋ชฉ๋ก์ ์คํฌ๋กค๋ ๋๋ง ํญ๋ชฉ์ ๋ ๋๋งํฉ๋๋ค.
0.17์์ ์ด์ ๋์ผํ ๋ฌธ์ ๋ฅผ ๋ณด์์ง๋ง removeClippedSubviews
๋นํ์ฑํํ๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ ๊ฒ ๊ฐ์ต๋๋ค.
+1
0.17์์ ์ด์ ๋์ผํ ๋ฌธ์ ๋ฅผ ๋ณด๊ณ ์์์ง๋ง removeClippedSubviews๋ฅผ ๋นํ์ฑํํ๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋์๊ฒ ๊ทธ๊ฒ์ removeClippedSubviews
์ ๋ฌด์ ๊ด๊ณ์์ด 0.17์์ ์ฌ์ ํ ๋ฐ์ํฉ๋๋ค. ๋ด๊ฐ ์์์ฐจ๋ฆฐ ๊ฒ์ ๋ด ๋ฌธ์ ๊ฐ ์๋์ผ๋ก ์ค์ ๋ contentOffset ๋ฐ initialListSize
์ ๊ด๋ จ๋ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ์คํ์
์ด initialListSize
๋ํด ๋ ๋๋ง๋ ์์์ ๋์ด๋ฅผ ์ด๊ณผํ๋ฉด ์ฌ์ฉ์๊ฐ ์คํฌ๋กคํ ๋๊น์ง ํ์ํ ์์๋ฅผ ๋ ๋๋งํ์ง ์์ต๋๋ค.
flexDirection: 'row'
์ค์ ๋ ๋ชฉ๋ก์๋ ๋ฌธ์ ๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ด ์์ฑ์ ์ ๊ฑฐํ๋ฉด ๋ชจ๋ ํญ๋ชฉ์ด ๋ ๋๋ง๋ฉ๋๋ค. ์ค์ ๋ ๊ฒฝ์ฐ ๋ชฉ๋ก์ ์ฒ์์ ๋ ํญ๋ชฉ๋ง ๋ ๋๋งํฉ๋๋ค.
Navigator๋ฅผ ์ฌ์ฉํ ๋ removeClippedSubviews ๋ฌธ์ ์ ๊ฒฝ์ฐ.
๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๋ https://github.com/machard/react-native-advanced-navigation ์ ํ์ธํ ์ ์์ต๋๋ค(๋ณด๊ธฐ๊ฐ ์ค์ ๋ก ํ๋ฉด์ ํ์๋ ํ ๋ ๋๋ง์ด ์ง์ฐ๋๊ธฐ ๋๋ฌธ์ผ ์ ์์).
contentContainerStyle
์์ฑ์ ์ค์ ๋ flexDirection: 'row'
๋ฐ flexWrap: 'wrap'
์๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ ์๊ฒ ํจ๊ณผ์ ์ธ ํด๊ฒฐ ๋ฐฉ๋ฒ์ pageSize
์
๋๋ค.
๋ฐ์ ๋ค์ดํฐ๋ธ ๋ฒ์ : 0.19.0
@jittuu ๊ฐ pageSize ์ํ์ ์ค์
pageSize๋ฅผ ๋ฌด์์ผ๋ก ์ค์ ํฉ๋๊น?
@gre ๋ ์ด์์์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. ๋ณด๊ธฐ๊ฐ ํ์ผ๋ก ์ ๋ ฌ๋ ๊ฒฝ์ฐ pageSize๋ ํ๋น ํญ๋ชฉ์ ๋ฐฐ์์ฌ์ผ ํฉ๋๋ค. ์ ํํ ๊ฐ์ผ๋ก ์คํํ์ฌ ์ฑ๋ฅ์ ๋ฏธ์น๋ ์ํฅ์ ํ์ธํ ์ ์์ต๋๋ค.
๋ํ ์ ์ฒด ํ๋ฉด์ ์ฑ์ธ ๋งํผ ์ถฉ๋ถํ ํฌ๊ฒ initialListSize๋ฅผ ์ค์ ํด์ผ ํฉ๋๋ค.
์ด ์ปค๋ฐ์ ์ค๋ช ์ด ์ ์ฉํ ์ ์์ต๋๋ค. https://github.com/facebook/react-native/commit/e7005f7f5429422b6f2e9c2aa29c9d57bda7b77a
@jittuu ์ด๊ฒ์ ๋๋ฅผ ์ํด ์ผํ์ต๋๋ค. flexWrap
์ฌ์ฉํ ๋๋ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ์ต๋๋ค.
@jittuu ๋ pageSize๋ฅผ ๊ฐ 2๋ก ์ค์ ํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
๋ชฉ๋ก ๋ณด๊ธฐ์์ ์คํฌ๋กค์ ์ํํ๊ณ ์ฑ์ ํ์ํ๊ณ ๋์๊ฐ ๋ ์ฌ์ ํ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
pageSize๊ฐ ๋์์ด ๋์ง ์์์ต๋๋ค(1์์ 60๊น์ง ๋ค๋ฅธ ๊ฐ์ ์๋ํ์ต๋๋ค).
@gre ๋น์ ์ initialListSize๋ฅผ ์ถฉ๋ถํ ํฌ๊ฒ ์ค์ ํ๊ณ ์์ต๋๊น? ๋ณผ ์ ์๋ repo๊ฐ โโ์์ต๋๊น?
@jaygarcia @nicklockwood ์ด ๋ฒ๊ทธ๋ฅผ ์ฌํํ๋ ๋ฐ๋ชจ๊ฐ ์์ต๋๋ค. URL: ListNotRender
๋จ๊ณ:
๋๋ ์ด ๋ฒ๊ทธ๊ฐ ListView์ removeClippedSubviews ์์ฑ๊ณผ ๊ด๋ จ์ด ์๋ค๊ณ ํ์ ํ๋ฉฐ ๋ฒ๊ทธ๋ true๋ก ์ค์ ๋์์ ๋๋ง ๋ฐ์ํฉ๋๋ค.
์ด๊ฒ์ RN 0.26.0์์ ์ฌ์ ํ ๋ฐ์ํ๊ณ ์์ต๋๋ค. ๊ฐ์ ์ํฉ:
removeClippedSubviews={true}
cc @javache
๋๋ ์ด๊ฒ์ด https://github.com/facebook/react-native/commit/1fcd73f3841d5afbabfa3adecfb7d4036d91a60e์ ์ํด ์์ ๋์๋ค๊ณ ๋ฏฟ์ต๋๋ค.
@javache ์๋์ผ๋ก ํด๋น ์ค์ ๋ก์ปฌ์ ์ถ๊ฐํ์ง๋ง ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์ง ์์์ต๋๋ค.
๋๋ ๋ํ ์ด๊ฒ์ https://github.com/facebook/react-native/commit/1048e5d3445094393298d4e818ff04c41f4e56a7 ์์ ์ ์ฉํ์ง๋ง ์ฑ๊ณตํ์ง ๋ชปํ์ต๋๋ค. ;)
RN 0.28 ์์ ์๋ ๋จ์ผ https://github.com/facebook/react-native/commit/1fcd73f3841d5afbabfa3adecfb7d4036d91a60e ์ปค๋ฐ์ ์ฌ์ ํ โโ๋ฒ๊ทธ๋ฅผ ์์ฑํฉ๋๋ค.
์ด๊ฒ์ ๋ํด ์กฐ๊ธ ์กฐ์ฌ ํ๋ฉด ListView๊ฐ ๋ ์ด์ ํ์๋์ง ์๋ ๊ฒฝ์ฐ์๋ ๋ฐฑ๊ทธ๋ผ์ด๋์์(์: ์คํฌ๋กค ์ ๋ฐ์ดํธ ์ค) ์ฌ์ ํ ์ ๋ฐ์ดํธ๋๊ณ ์๋์ง ๊ถ๊ธํฉ๋๋ค
์ฌ์ค ๋ทฐ์์ ์คํฌ๋กคํ๋ฉด ๋ฒ๊ทธ๋ฅผ ์ฝ๊ฒ ์ฌํํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฌ์ ํ 'gravity'๋ก ์คํฌ๋กค๋๊ณ ์์ ๋ ํ์์ ์ํํ๊ณ ์กฐ๊ธ ๊ธฐ๋ค๋ ธ๋ค๊ฐ ๋ค๋ก๋ฅผ ํด๋ฆญํฉ๋๋ค. ๋ค์ ์คํฌ๋กค ํ ๋๊น์ง ์ ์ฒด ํ๋ฉด์ ํฐ์์
๋๋ค.
๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ด ๋ฒ๊ทธ๊ฐ ๋์๊ฒ ๋ฐ์ํ๋ ์ ์ผํ ์๋๋ฆฌ์ค์
๋๋ค. ์ด๊ฒ์ ~ ๋ชจ๋์๊ฒ ๋์ผํ ์ฌํ ์๋๋ฆฌ์ค์
๋๊น, ์๋๋ฉด ๋ฒ๊ทธ๊ฐ ์ด๋ณด๋ค ๋ ๋์ต๋๊น?
๊ทธ ์๋๋ฆฌ์ค๋ @janmonschke https://github.com/facebook/react-native/issues/1831#issuecomment -22799032 ์์ ๊ทธ๋ฆฌ ๋ฉ์ง ์์ต๋๋ค.
์ด ๋ฒ๊ทธ์ ์์ธ์ ํ์ ํ๊ธฐ๋ ์ด๋ ต์ง๋ง ์ฌ๊ธฐ์ ์ 2์ผํธ๊ฐ ์์ต๋๋ค.
๋ฐฑ๊ทธ๋ผ์ด๋์์ ํ์ด _white_ ๋ ๋๋ง๋๋ ๊ฒ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค. scrollview๋ฅผ ๋ค์ ๋ณด์ด๊ฒ ํ ๋ _(์: ๋ค๋ก ์ด๋)_ ์ฌ์ ํ ํฐ์์ด๊ณ ์๋ก์ด ์คํฌ๋กค์ด ๋ฐ์ํ ๋๊น์ง ์ ๋ฐ์ดํธ๋์ง ์์ต๋๋ค _(์ ๋ฐ์ดํธํ ์ด์ ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์บ์๋จ)_.
ScrollView๊ฐ ์ฌ์ ํ ๋ณด์ด๋ ๊ฒฝ์ฐ์๋ง ์์( updateClippedSubviews
?)์ ๋ ๋๋งํ๋ฉด ๋ฒ๊ทธ๊ฐ ์์ ๋ฉ๋๊น? (๋ฐฑ๊ทธ๋ผ์ด๋์์ ํ์ด ๋ ๋๋ง๋์ง ์์ผ๋ฉด ๋ค์ ํฐ์์ผ๋ก ํ์๋์ง ์์ต๋๋ค)
@javache 1fcd73f๋ ์ฑ์ฐ์ง ์์ ํ๋ ๋๋ ๋ ๊ฐ์ ํ์ผ๋ก ListView์ ๊ฒฝ์ฐ๋ฅผ ์์ ํ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ListView๋ฅผ ์คํฌ๋กคํด๋ ๋ชฉ๋ก ํ์ ๋ค์ ํ์ํ ์ ์์ต๋๋ค.
๋ฒ๊ทธ๋ฅผ ์ฌํํ๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ์ฐพ์์ต๋๋ค.
ListView๋ ๋น์ด ์๊ณ ํ๋ฉด๋ณด๋ค ๋ง์ ํ์ด ์๊ณ ListView๋ฅผ ์คํฌ๋กคํ๋ฉด ํ๋ฉด๋ณด๋ค ์์ ํ์ด ๋ค์ ํ์๋๋ฉฐ ์คํฌ๋กค ListView๋ ์๋ฌด ๊ฒ๋ ๋ค์ ํ์ํ ์ ์์ต๋๋ค. 1fcd73f ์คํฌ๋กค ListView๋ก ๋ค์ ํ์ํ ์ ์์ต๋๋ค :)
์ฐ๋ฆฌ๊ฐ ์ ํํ ์๋ฃจ์ ์ scrollTo 1px ์๋ค๋ก ์ด๋์ ์ํํ๋ ๊ฒ์ด์์ต๋๋ค. ํด๊ฒฐ ๋ฐฉ๋ฒ์ด์ง๋ง ๋ ๊ฒฝ์ฐ ๋ชจ๋์์ ์๋ํ์ต๋๋ค.
requestAnimationFrame(() => {
this.listview.scrollTo({y: 1});
});
@JBerendes ์ ์ด ํดํน์ด ์๋ํฉ๋๋ค.
๋ค์์ ์ฌ์ฉ์์ ์คํฌ๋กค์ ์์์ํค์ง ์๋ ๋ณด๋ค ์ ๊ตํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋๋ค.
class ...YourListAbstraction {
_scrollY = 0;
_lastTimeScrolled = 0;
scrollHackToWorkaroundWhiteBug (amount) { // call at appropriated time, with -1 or 1. if possible alternate so you don't change the actual scroll over calls xD
const { list } = this.refs;
if (!list) return;
if (Date.now() - this._lastTimeScrolled < 500) return; // don't mess with user scroll
list.getScrollResponder().scrollTo({
y: this._scrollY + amount,
});
}
onScroll = ({ nativeEvent }) => { // give onScroll={this.onScroll} to ListView
this._scrollY = nativeEvent.contentOffset.y;
this._lastTimeScrolled = Date.now();
};
}
ListView ์ถ์ํ์ ๋ฃ์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ ์ ํ ์๊ฐ์ scrollHackToWorkaroundWhiteBug
๋ฅผ ํธ์ถํด์ผ ํฉ๋๋ค. ์ ์๊ฒ๋ ํ๋ฉด์ ๋ณ๊ฒฝํ ๋๋ง๋ค(์ ํ ์ ํ)์
๋๋ค.
๋๋ ์ด๊ฒ์ด ListView์ scrollRenderAheadDistance
(ํฐ์น๋ ํ ๋ ๋๋ง๋์ง ์์ ํ์ ๋ ๋๋งํ๊ธฐ ๋๋ฌธ์)์ ๊ด๋ จ์ด ์๋ค๊ณ ์๊ฐํ๊ณ scrollRenderAheadDistance
๋ฅผ 1800๋ณด๋ค ํฐ ๊ฐ์ผ๋ก ์ค์ ํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค. scrollRenderAheadDistance
์ ๋ ๋๋ง๋๋ ํ ์ ์ฌ์ด์๋ ํ์คํ ์๊ด ๊ด๊ณ๊ฐ ์์ง๋ง ์ผ๊ด์ฑ์ด ์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ์ผ๋ฐ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ด ๋ ๋๋ง๋๋ค๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค(๋๋ก๋ ๋ชจ๋ ํ์ ๋ ๋๋งํ์ง๋ง).
| scrollRenderAheadDistance | ๋ ๋๋ง๋ ํ ์ |
| --- | --- |
| 1000 | 2 |
| 1200 | 2-5 |
| 1400 | 5 |
| 1600 | 6 |
| 1800 | 7+ |
80pt ๋์ด์ ํ์ผ๋ก ListView๋ฅผ ๋ ๋๋งํ๊ณ ์์ต๋๋ค. ListView์ ๋ํด ์ ํํ scrollRenderAheadDistance
๋ฅผ ์ค์ ํ๋ ๋ฐ ๋์์ด ๋๋ ๊ณต์์ ๋์ถํ์ต๋๋ค.
scrollRenderAheadDistance = 680 + (ROW_HEIGHT_IN_PIXELS * INITIAL_PAGE_SIZE_IN_PIXELS)
๊ทธ๋ฌ๋ 680
(๋๋ 340 * 2
)์ ์ค์์ฑ์ ์ดํดํ์ง ๋ชปํฉ๋๋ค.
ํธ์ง: ์ด ์๋ฃจ์ ์ ๋๋ฒ๊ทธ์์ ์๋ํ์ง๋ง ๋ฆด๋ฆฌ์ค ์ฒด๊ณ(iOS์ฉ)์์๋ ์๋ํ์ง ์์ต๋๋ค...
์ข์, removeClippedSubviews
๋ฅผ false๋ก ์ค์ ํ๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ฉ๋๋ค.
0.26์์ 0.29๋ก ์ ๊ทธ๋ ์ด๋ํ ๋๊น์ง ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์์ผ๋ฏ๋ก 0.27, 0.28 ๋๋ 0.29์ ๋์ ๋์์ต๋๋ค(์์ง 0.27 ๋๋ 0.28์ ๋ํด ํ ์คํธํ์ง ์์์ง๋ง ๋์์ด ๋๋ค๋ฉด ํ ์ ์์ต๋๋ค).
@gnestor 0.29์์ ๊นจ์ก์ต๋๋ค. #8607 ๋ฐ https://github.com/facebook/react-native/commit/1048e5d3445094393298d4e818ff04c41f4e56a7์ ํ์ธ
@gnestor @nihgwu ๋ฒ๊ทธ๊ฐ ์ต๊ทผ ํดํ์ด ์๋๋ผ๊ณ ํ์ ํฉ๋๋ค. ์ด ๋ฌธ์ ๋ 1๋
์ ์ ์์ฑ๋์์ผ๋ฉฐ RN 0.13๋ถํฐ ๊ฐ์ธ์ ์ผ๋ก ๊ฒฝํํ์ผ๋ฉฐ ํญ์ ListView๋ก "์์กด"ํ๊ธฐ ์ํด ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ต๋๋ค. removeClippedSubviews
์ฌ์ฉํ์ง ์์ผ๋ฉด ํฐ ๋ชฉ๋ก์ด ์ง์ฐ๋ฉ๋๋ค.
๋ฒ๊ทธ๋ฅผ ์์ ํ๊ฑฐ๋ ์ต์ํ ๋ฒ๊ทธ๊ฐ ๋ํ๋๋ ๊ฒฝ์ฐ๋ฅผ ์ค์ด๋ ค๋ ์๋๊ฐ ์์์ ์ ์์ง๋ง ์ด๋ ์ด ์ด๊ธฐ ๋ฌธ์ ๋ฉ์์ง์์ ๋ณด๊ณ ๋ ๊ฒ๊ณผ ๊ฑฐ์ ์ ์ฌํฉ๋๋ค.
@gre ํ์ง๋ง ์ฌ์ ํ #8607์ด 0.29์ ๋์
๋์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋น ๋ณด๊ธฐ๋ก ๊ฐ๋ ๊ฒ์ ์ ๋ง ๋ฒ๊ฑฐ๋ก์ด ์ผ์
๋๋ค. https://github.com/facebook/react-native/commit/1048e5d3445094393298d4e818ff04c41f4e56a7 ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋๋๋ฆฌ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. removeClippedSubviews
๋์ง ์๊ณ ์ ์
initialListSize
๋ฅผ ์ ์ ํ ๊ฐ์ผ๋ก ์ค์ ํ๊ณ removeClippedSubviews
๋ฅผ false๋ก ์ค์ ํ์ฌ ๋ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ญ์์ค.
0.28์์ 0.29๋ก ์
๊ทธ๋ ์ด๋ํ ํ ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
removeClippedSubviews={false}
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
๋ํ ์ ๊ฒฝ์ฐ์๋ componentDidUpdate()
์์ ListView
height ๋ฅผ ์
๋ฐ์ดํธํ๊ณ ์์ต๋๋ค.
componentDidUpdate()
์ ๋์ด ์
๋ฐ์ดํธ ์ฝ๋๋ฅผ setTimeout
์ ํจ๊ป ์ฌ์ฉ์ ์ง์ ์๊ฐ ์ ํ์ผ๋ก ๋ํํ๋ ๊ฒ๋ ๋์์ด ๋ฉ๋๋ค.
๋๋ ๋ํ ์ด๊ฒ์ ๊ฒฝํํ์ง๋ง ๋ก์ปฌ ๋ฐ์ดํฐ๋ก ์ฑ์์ง ํ๋์ ListView์์์์ต๋๋ค. ๋๋ ๋ํ iOS์์๋ง ์ด๊ฒ์ ๋ณด์๊ณ 0.29๋ก ์
๊ทธ๋ ์ด๋ ํ ํ์ ๋ง โโ๋ณด์์ต๋๋ค. ๋ฌธ์ ์ ListView๋ this.state.dataSource.cloneWithRowsAndSections
ํ๊ณ componentDidMount
๋ ๋ก๋ํ ๋์
๋๋ค.
๊ทธ๋์ removeClippedSubviews={false}
๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
ListView
๊ตฌ์ฑ ์์์ removeClippedSubviews
๋ฅผ ์ค์ ํ๋ ๊ฒ๋ ํจ๊ณผ์ ์ด์์ต๋๋ค. ๊ธฐ๋ณธ Navigator
๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ ๋ 0.29
์ Release
์ฒด๊ณ์์๋ง ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
๋์ผํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. flexDirection: 'row' ๋ฐ flexWrap: 'wrap'์ ์ค์ ํ์ต๋๋ค. ์ ๋ RN 0.29.2๋ฅผ ์ฌ์ฉ ์ค์ ๋๋ค. ๋ค๋ฅธ ๋ชฉ๋ก ๋ณด๊ธฐ(flexDirection: 'row'๋ฅผ ์ค์ ํ์ง ์์ ๊ณณ)์์๋ ๊ทธ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
๋ค๋ฅธ ํฌ์คํฐ๊ฐ ๋งํ ๊ฒ์ฒ๋ผ ๋น ๋ฅธ ์์ ์ ์ ์ ํ initialListSize ๋ฐ pageSize๋ฅผ ์ค์ ํ๋ ๊ฒ์ด์ง๋ง, ์๋ฅผ ๋ค์ด ๋ชฉ๋ก ๋ณด๊ธฐ ์์ ์๋ ํญ๋ชฉ ๋ชฉ๋ก์ ์ผ๋ถ๋ง ํ์ํ๋ ํํฐ๊ฐ ์๋ ๊ฒฝ์ฐ ์ฑ์ ์๋ต์ฑ์ด ๋จ์ด์ง ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. , ๋ชฉ๋ก ๋ณด๊ธฐ๊ฐ ์ ์ฒด ํ์ ์์ญ์ ๋ค์ ๋ ๋๋งํ๋ ค๊ณ ํ๊ธฐ ๋๋ฌธ์ ํํฐ ์ฌ์ด๋ฅผ ํญํ๋ฉด ์๋๊ฐ ๋๋ ค์ง๋๋ค.
๋ค๋ฅธ ๋ชฉ๋ก ๋ณด๊ธฐ์์๋ initialListSize=0 pageSize=1์ ์ค์ ํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๋ฆฌ๋ ๋ชฉ๋ก ๋ณด๊ธฐ์์๋ ํ ์ ์์ต๋๋ค(flexDirection: 'row' ๋ฐ flexWrap: 'wrap').
RN v0.31.0-rc.0์์ ์ด๊ฒ์ ์น๊ณ ์์ต๋๋ค.
removeClippedSubviews={false}๋ฅผ ์ถ๊ฐํ๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ ๊ฒ ๊ฐ์ต๋๋ค.
"removeClippedSubviews={false}"๋ ์ข์ ์๋ฃจ์ ์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ชจ๋ ํ์ ๋ ๋๋งํ๊ณ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. "listView. scrollTo" ๋ฐ "removeClippedSubviews"๋ฅผ ์ ์ธํ ๋ ๋์ ์๋ฃจ์ ์ด ์์ต๋๊น?
์ด ๋ฌธ์ ๋ RN 0.31์ด ์๋ ios 10 ๋ฒ ํ์์ ํจ์ฌ ๋ ์ฌ๊ฐํฉ๋๋ค :-(
removeClippedSubviews
๋ Android์์ ๋์์ด ๋์ง ์์๊ณ ๋์ ListView
์์ ScrollView
๋ก ์ฎ๊ฒจ์ผ ํ์ต๋๋ค.
์ ๋ง ์์ฒญ๋ ๋ฒ๊ทธ์ ๋๋ค. ๋๋ ๋ง๋ฌ๋ค.
๋ชจ๋๊ฐ Product Pains์ ๋ํด ์ฐฌ์ฑํ๋์ง ํ์ธํ์ญ์์ค. ๊ทธ๊ฒ์ ์ด๋ฏธ ๊ฝค ๋์ง๋ง ์์ง ๋๊ตฐ๊ฐ์ ๋ฐ์ ํธ์งํจ์ ์ฐฉ๋ฅํ ๋งํผ ์ถฉ๋ถํ ๋์ง๋ ์์ต๋๋ค :-( ์ฌ๊ธฐ ๋งํฌ๊ฐ ์์ต๋๋ค.
์ด ์์ ์์ ๋๋ ์ด๊ฒ์ด ์๋ง๋ #8607๊ณผ ๊ฐ์ ๋ฌธ์ ๋ผ๊ณ ๋งํ๊ณ ์ถ์ต๋๋ค. ์ด๋ป๊ฒ ๋์ฒํด์ผ ํ๋์ง ๋ด ๊ณํ์ ํ์ธํ์ญ์์ค.
0.33.0
์ ๊ณ์ ์กด์ฌ
์ฌ์ ํ 0.32์ ์กด์ฌ
์ด์ ์ด ๋ฒ๊ทธ๋ฅผ ๋ง๋ฌ๊ณ removeClippedSubviews = {false}
์๋ํ์ต๋๋ค.
0.33์ +1
์, ์ ๋ ๊ฐ์ ๋ฌธ์ ์
๋๋ค! +1
0.33,
ํธ์งํ๋ค:
removeClippedSubviews = {false}, ๋์๊ฒ๋ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ต๋๋ค.
+1
https://gist.github.com/majak/b0ee1fb6ca725d2cf810d2f0ab394f2e (from #8607) ์ด ํจ์น๋ฅผ ์ฌ์ฉํด ๋ณด๊ณ ์ด ๋ฌธ์ ์ ๋์์ด ๋๋์ง ์๋ ค์ฃผ์๊ฒ ์ต๋๊น?
@majak ์ด ํจ์น๋ฅผ ๊ณต์ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ์ ์ฉํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ์ด์ ์ด ๋ฌธ์ ๋ ์ฌ๋ผ์ก์ต๋๋ค(RN 0.34).
@majak ์ด๊ฒ์ ๋์๊ฒ๋ ํด๊ฒฐ๋๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ํ์ต๋๋ค!
์ด๊ฒ์ removeClippedSubviews={true}
์ผ ๋ RN34์์ ๋ฐ์ํฉ๋๋ค.
React Native 0.34์์ ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
๋ฌธ์ ๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์๋ง ๋ฐ์ํ์ต๋๋ค.
flexDirection: 'row',
flexWrap: 'wrap',
justifyContent: 'center',
๋ชฉ๋ก๋ณด๊ธฐ ์คํ์ผ์.
initialListSize={100}
๋๋ฅผ ์ํด ๊ทธ๊ฒ์ ๊ณ ์ณค๋ค
@majak ํด๋น ํจ์น๋ก ํ๋ณดํ ๊ณํ์ด์ ๊ฐ์?
@janmonschke ๋ต ! ์ ๋ฐ์ดํธ๋ฅผ ์ํด ์ฐ๊ฒฐ๋ ๋ฌธ์ ๋ฅผ ๋ฐ๋ฅด์ญ์์ค.
React Native 0.36์์ ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
๋๋ ์ด๊ฒ์ด 0.36์์ ์ผ์ด๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค
๋๋ฒ๊ทธ ๋ชจ๋์์๋ง ์๋ฎฌ๋ ์ดํฐ์์ ์๋ฒฝํ๊ฒ ์๋ํ์ง๋ง ์ฅ์น์์๋ ์๋ํ์ง ์์ต๋๋ค. ๋ชฉ๋ก์ ์ฅ์น์์ ์๋ํ์ง ์์ผ๋ฉฐ ์์์ ๊ถ์ฅํ๋ ๋ชจ๋ ๊ฒ์ ์๋ํ์ผ๋ฉฐ ListView
์ ScrollView
๋ก ๋ฐ๊พธ์์ต๋๋ค. ๋ด Android ์ฅ์น์์ ๋ณผ ์ ์๋ ๊ฒ์ ๋ด๋น๊ฒ์ดํฐ๋ฟ์
๋๋ค. (๋ด๋น๊ฒ์ดํฐ ์ธ๋ถ์ ๋ชฉ๋ก์ ๋ฃ์ผ๋ ค๊ณ ์๋ํ ๊ฒฝ์ฐ์๋)
0.37
0.36์์ ์ฌ์ ํ ๋ฌธ์ ๋ฅผ ์ฐพ์ ์ ์์ง๋ง ํด๊ฒฐํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
๋๋ ์์ง๋ ๊ทธ๊ฒ์ 0.36.1์์ ๋ณด๊ณ ์๋ค
๋๋ ์์ง๋ ๊ทธ๊ฒ์ 0.36.1์์ ๋ณด๊ณ ์๋ค
0.31์ ์กด์ฌ
initialListSize={1}
ํด๊ฒฐ
React Native 0.38์์ ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
renderScrollComponent={(props) => <ScrollView style={flex: 1} /> }
์ด๊ฒ์ ๋ฒ์ 0.38์ ๋ฌธ์ ๋ฅผ ์์ ํฉ๋๋ค. ์ด์ ๋ฒ์ ์์๋ ์๋ํ๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์ด ์์นด์ด๋ธ ๋ฒ์ 0.38์ ๋ฌธ์ , ์ด๊ธฐ ๋ฒ์ ์์ ์๋ํ๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์ด ๋ฌธ์ ๋ 0.36์ ์กด์ฌํฉ๋๋ค.
removeClippedSubviews = {false} ๋ฐ initialListSize={8}์์ ์๋ํ๋๋ก ํ ์ ์์ต๋๋ค.
1๋ ์ด ๋์๋๋ฐ ์์ง๋ ์ด ์ด์๊ฐ ์ด๋ ค์๋์??
0.39์ ์ฌ์ ํ ์กด์ฌํฉ๋๋ค. removeClippedSubviews = {false}
์๋ํฉ๋๋ค.
"removeClippedSubviews={false}"๋ ์ข์ ์๋ฃจ์
์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์๋ก์ด ์๋ฃจ์
์ด ์๊ณ ์ ์๊ฒ ํจ๊ณผ์ ์
๋๋ค. ํ๋ซํผ iOS. RCTView.m ํ์ผ
PR์ ์์ฑํด์ผ ํฉ๋๊น?
RN0.40์์ ํ ์คํธํ ์ฌ๋์ด ์์ต๋๊น? RN0.40์ผ๋ก ์ ๊ทธ๋ ์ด๋ํ ํ ๋ ์ด์ ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค.
์ด ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
1, removeClippedSubViews = true๋ก ListView๋ฅผ ํ์ํฉ๋๋ค.
2, ํ์ ํฐ์นํ์ฌ ๋ค์ ํ์ด์ง๋ฅผ ์
๋ ฅํ์ญ์์ค.
3, ํ๋ฉด ๋ฐฉํฅ 90 ํ์ ;
4, ListView ํ๋ฉด์ผ๋ก ๋์๊ฐ๊ธฐ;
ListView๋ ๋น์ด ์๊ณ ํ์ด ํ๋ฉด๋ณด๋ค ๋ง์ผ๋ฉด ListView๊ฐ ๋ค์ ํ์๋ฉ๋๋ค.
@endpress RN0.41RC0 ์ ์ฌ์ฉํ์ฌ ๊ทํ์ ๋จ๊ณ๋ฅผ ๋ฐ๋์ง๋ง ์ฌ์ ํ ์ฌํํ ์ ์์ต๋๋ค.
0.38์์ ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
๋ด ํด๊ฒฐ ๋ฐฉ๋ฒ์ ListView์ paddingTop์ 0๊ณผ 1 ์ฌ์ด์์ ๋ณ๊ฒฝํ๋ ๊ฒ์ด๋ฏ๋ก ListView๊ฐ ๋งค๋ฒ ์๋ก ๊ณ ์ณ์ง๋๋ค.
backgroundColor, ํ ๋๋ฆฌ ๋ฑ์ ๋ณ๊ฒฝํ๋ ค๊ณ ํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ์์ฑ์ด ์๋ํ๋ ๊ฒฝ์ฐ ์๋ ค์ฃผ์ญ์์ค.
@nihgwu๋ ์ฌ์ ํ
์ด๊ฒ์ด ๋ฌธ์ ๋ค
@endpress ๋ณ๊ฒฝ ์ฌํญ(https://github.com/facebook/react-native/issues/1831#issuecomment-270552011)์ด ์ ๊ฒฝ์ฐ์ ์ ์ฉ๋๋ฉฐ facebook/react-native#8607์๋ ๋์์ด ๋ ์ ์์ต๋๋ค.
ํจ์น๊ฐ ์์ง ์๋ฒฝํ์ง ์์ ์ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง ์ฌ์ ํ PR์ ์์ฑํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋๋ฅผ ์ํด initialListSize={0}๋ฅผ ์ค์ ํด๋ 0.40.0์ผ๋ก ์์ ๋ฉ๋๋ค.
@majak ์ด ์น๋ช ์ ์ธ ๋ฌธ์ ์ ์ข์ ์์์ด ์์ต๋๊น?
FlatList๋ ์์ง ์คํ์ ์ด๊ธฐ ๋๋ฌธ์ ๋ฒ๊ทธ๊ฐ ๋ ์ ๊ฑฐ๋ ์ด์ ๋ฒ์ ๊ณผ ํธํ๋์ง ์๋ ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝ๋๋ค๋ ๋ณด์ฅ์ ์์ง๋ง ์ํ์ ๊ฐ์ํ๊ณ ์๋ํด ๋ณผ ์๋ ์์ต๋๋ค.
@sahrens @gre ์ด์ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๊ฐ ๋์ผํ๊ฒ ์ ์ง๋๋๋ก ์ด์ ListView์ ๋์ผํ API๋ฅผ ์ ๊ณตํ๋ FlatList ์์ ์ถ์ ๋ ์ด์ด๋ฅผ ๊ตฌ์ถํ ์ ์์ต๋๊น?
@sahrens FlatList๋ UITableView๋ก ๊ตฌํ๋ฉ๋๊น?
FlatList๊ฐ ์์ ํ๋๊ณ ๋ ์ด์ ์คํ์ ์ด์ง ์์ผ๋ฉด ListView์ ๋์ผํ API๋ก ์ด๋ํฐ๋ฅผ ๋ง๋ค๊ฑฐ๋ ๋ด๋ถ์์ ListView ๊ตฌํ์ ๊ต์ฒดํ ์ ์์ต๋๋ค.
UITableView๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์ค์ ๋ก ์๋ก์ด ๋ค์ดํฐ๋ธ ์ฝ๋๋ฅผ ์ ํ ์ฌ์ฉํ์ง ์์ต๋๋ค. ๋ชจ๋ ๊ธฐ์กด ๋ค์ดํฐ๋ธ/ํ๋ ์์ํฌ ํ๋ฆฌ๋ฏธํฐ๋ธ๊ฐ ์๋ JS์ ๋๋ค. ์ฌ๊ธฐ์์ ๊ตฌํ์ ๋ณผ ์ ์์ต๋๋ค. https://github.com/facebook/react-native/commit/a3457486e39dc752799b1103ebe606224a8e8d32
@sahrens ๊ฐ์ฌํฉ๋๋ค. ๊ฝค ๋ฉ์ง๊ณ ์ ์ฉํฉ๋๋ค.
@savanthongvanh ์ด๊ธฐ ํฌ๊ธฐ๋ฅผ 0์ผ๋ก ์ค์ ํ๋ฉด ์ด๊ธฐ ๋ก๋ ์ ListView์ ๋ชจ๋ ํญ๋ชฉ์ ๋ ๋๋งํ๋ ํจ๊ณผ๊ฐ ์์ต๋๋ค. ์์ดํ ์ด ๋ง์ผ๋ฉด ์ฃผ์ํ์ธ์.
๋ํ ์ด rn 0.41.2๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. ๋๊ตฐ๊ฐ๊ฐ ๋ด๊ฐ ๋ณต์ฌํ ์ ์๋ FlatList์ ๊ฐ๋จํ ๊ตฌํ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ๊ณง ์๋ฃจ์
์ ๊ธฐ๋ํ๊ณ ์์ต๋๋ค.
๊ฐ์ฌ ํด์,
๋ก
FlatList(andVirtualizedList)๋ ํจ๊ป ํ๋ ์ดํ๋ ค๋ ๊ฒฝ์ฐ ๋ง์คํฐ์ ์์ต๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ๋ค๋ฃจ๋ ๋ชจ๋ ์ฌ๋์ ์ํด FlatList๋ฅผ ์์ํ๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. https://hackernoon.com/react-native-new-flatlist-component-30db558c7a5b#.xnp03gd2u
initialListSize๋ฅผ ์ ์ ํ ๊ฐ์ผ๋ก ์ค์ ํ๊ณ removeClippedSubviews๋ฅผ false๋ก ์ค์ ํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค.
๊ฐ์ฌํฉ๋๋ค @hoperce , removeClippedSubviews
๋ ์ ์๊ฒ ํจ๊ณผ์ ์ด๋ฉฐ initialListSize
๋ ๊ณ ๋ฅด์ง ๋ชปํ ์คํฌ๋กค์ ์ ๋ฐํฉ๋๋ค.
RN .42๊ฐ ์๊ณ ์ฌ๊ธฐ์ FlatList์ ๋ํ ์คํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํ์๋์ง ์์ผ๋ฏ๋ก ์ด ๋ฌธ์ ๋ก (์ ์๊ฐ ์๋๋ผ) ์ ๊ทธ๋ ์ด๋ํ ์ ์์ ๋๊น์ง ๋ฉ์ถฅ๋๋ค.
์ต์ ๋ฒ์ ์ RN์ ์ฌ์ฉํ์ง ์๋๋ผ๋ ํญ์ FlatList ์ฝ๋๋ฅผ ์ฑ์ ๋ณต์ฌํ ์ ์์ต๋๋ค.
FlatList๋ฅผ ์ฌ์ฉํ์ฌ "๋์๊ฐ ๋ ์ ์ฒด ๋ณด๊ธฐ๊ฐ ํฐ์์ด ๋จ" ๋ฒ๊ทธ๋ฅผ ์ฌ์ ํ ์ฌํํ ์ ์์ต๋๋ค. ScrollView์ ๋ ๊ด๋ จ์ด ์๋์ง ๊ถ๊ธํฉ๋๋ค.
์ ์ ํฐ์์ด ๋๋ ๋ฌธ์ ๋ FlatList์ ์์ ํ ๋ค๋ฅด๋ฉฐ ๊ณ ์ ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ด๋ฅผ ์ํํ๊ธฐ ์ํด ๋ ธ๋ ฅํ๊ณ ์์ง๋ง ๋น๋๊ธฐ ์ฐฝ ๋ ๋๋ง์ ๊น๋ค๋ก์ด ๊ฒฐ๊ณผ์ ๋๋ค. ์ด ๋ฌธ์ ๊ฐ ์ธ๊ธํ๋ ๋ฒ๊ทธ๋ ์ฌ์ฉ์๊ฐ ์คํฌ๋กคํ ๋๊น์ง ์ด๊ธฐ ๋ ๋๋ง์์ ์ฝํ ์ธ ๊ฐ ํ์๋์ง ์๋ ๊ฒฝ์ฐ์ด๋ฉฐ FlatList๋ก ์์ ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
ListView(๋ฐ FlatList)์์๋ ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
๋ทฐ ์์ฑ์์์ ๋ด ๋ฐ์ดํฐ ์์ค๋ฅผ []๋ก ์ฌ์ค์ ํ ๋ค์ setTimeout()์ ํญ๋ชฉ ๋ชฉ๋ก์ผ๋ก ์ฌ์ค์ ํ์ฌ ๋ชฉ๋ก์ ์ฌ๋ฐ๋ฅด๊ฒ ๋ ๋๋งํ ์ ์๋ค๋ ๊ฒ์ ๋ฐฉ๊ธ ๋ฐ๊ฒฌํ์ต๋๋ค.
์ฐธ๊ณ ๋ก ๋ด ๋ชฉ๋ก ๋ณด๊ธฐ๋ TabNavigator์ ReactNavigation StackNavigator์ ํฌํจ๋์ด ์์ต๋๋ค.
๋ํ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก 1px ์คํฌ๋กค์ ํธ๋ฆฌ๊ฑฐํ๋ ํดํน์ ์ฌ์ ํ โโListView/FlatList์์ ๋ชจ๋ ์๋ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฌ๋ฐ๋ฅธ ์๋ช ์ฃผ๊ธฐ(์ผ๋ฐ์ ์ผ๋ก ํ๋ฉด์ผ๋ก ๋์์ฌ ๋)์ ํธ์ถํด์ผ ํฉ๋๋ค.
@gre :
@gre , ์ด์ ๋ํ ์์ ์ฝ๋๊ฐ ์์ต๋๊น? ๊ทธ๋ฆฌ๊ณ ListView๋ฅผ ํฌํจํ๋ ํด๋น ๊ตฌ์ฑ ์์์ ๋ํ componentWillMount๋ฅผ ์๋ฏธํฉ๋๊น?
@ericvicenti - RN์ ๋ค๋ฅธ ์ฝ๋ ์กฐ๊ฐ์ด ๋ง์ด ํ์ํ ๊ฒ ๊ฐ์ต๋๋ค. ํน์๋ผ๋ ๋ค๋ฅธ ๊ณณ์์ ๋น๋ฆฌ์ง ์์๊น ํ๋ ๊ฑฑ์ ์ด ๋ค์์ต๋๋ค. ๋ฝ์ ์๋ ์์ต๋๋ค. ๋ค๋ฅธ ์ฌ๋๋ค์ด ์ฌ์ฉํ ์ ์๋๋ก ์ ์ฅ์์ ๋์ง ์๋ ์์ต๋๋ค. ํ์ฉ๋ฉ๋๊น?
@sahrens ๋ฏธ์ํ์ง๋ง ๋ด ํ์ฌ ์ฑ์ ์์ง๋ง ์ฌํํ๊ธฐ ์ํด ๋น ์์ ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค!
@natdm ์์ ๋๊ธ: https://github.com/facebook/react-native/issues/1831#issuecomment -231069668 โ ์ด๊ฒ์ด ๊ธฐ๋ณธ ์์ด๋์ด์ ๋๋ค. ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์คํฌ๋กค์ด ์๊ฐ์ ์ผ๋ก ๋์ ๋์ง ์๋๋ก -1px์ 1px๋ฅผ ๋ฒ๊ฐ์ ์ฌ์ฉํฉ๋๋ค. XD ๊ฑฐ๋ํ ํดํน
SectionList์ ์ด ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์คํฌ๋กคํ ๋๊น์ง ์ด๊ธฐ ๋ ๋๋ง ์ ๋น์ด ์์ต๋๋ค. @sahrens ๋์ ๋ณด์ด๋ ์์ ์ฌํญ์ด ์์ต๋๊น?
@smkhalsa ๋ช ํํ ์ฌํ์ด ์์ต๋๊น? removeClippedSubviews={false}๋ก ์ค์ ํฉ๋๊น?
@sahrens removeClippedSubviews={false}๋ฅผ ์ค์ ํ๋ฉด ์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ด๊ฒ์ด ์์ผ๋ฉด ์ด ํน์ ๋ณด๊ธฐ๋ก ์ด๋ํ ๋๋ง๋ค ๋น ํ๋ฉด์ด ๋ํ๋ฉ๋๋ค.
๋๋ ์๋ก์ด ์ ์ฅ์์์ ๋ฌธ์ ๋ฅผ ๋ถ๋ฆฌํ๊ณ ๊ฐ๋ฅํ ๊ฒฝ์ฐ ๊ฒ์ํ๋ ค๊ณ ๋ ธ๋ ฅํ ๊ฒ์ ๋๋ค.
์ ์๊ฒ๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค(removeClippedSubviews๋ ํ์คํ ๋ฒ๊ทธ์ ๋ฐฉ์์ ์ ๋๋ค). react-native-tab-view ๋ด๋ถ์ ๋ชฉ๋ก์ด ์๋ ์ฑ์์ ์ฝ๊ฒ ์ฌํํ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ ๊ฐ๋จํ ์๊ฐ ๊ทธ๊ฒ์ ์ฌํํ ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
https://github.com/facebook/react-native/issues/1831#issuecomment -228775913์์ ๋ด ๋๋ต์ ๋ง์ง๋ง ๋ ๋จ๋ฝ์ ์ฐธ์กฐํ์ญ์์ค.
๋๋ ๊ทธ๊ฒ์ด ๊ทธ ์ฃผ๋ณ์ ๋ฌด์์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค (๋จ์ง ๊ฐ์ค).
(1) ๋ชฉ๋ก์ '๊ฒฝ๊ณ ์์ ๋ฐ์ ์๊ธฐ' ๋๋ฌธ์ ๋ฐฐ๊ฒฝ ํญ์์ ๋ ๋๋ง๋ฉ๋๋ค. removeClippedSubviews๋ ๋ชฉ๋ก์ด ์ฌ๊ธฐ์ ์๋ค๊ณ ๊ฐ์ ํ๊ณ ์๋ฌด ๊ฒ๋ ๋ ๋๋งํ์ง ์์ต๋๋ค(ํฐ์).
(2) ํญ์ด ํฌ์ปค์ค๋ก ์ด๋ํ๊ณ ํด๋น ํญ์ด <StaticContainer>
์ ๊ฐ์ ๊ฒ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์๋ฌด๊ฒ๋ '์๋ก ๊ณ ์นจ'๋์ง ์์ผ๋ฏ๋ก ์ฌ์ ํ ํฐ์์
๋๋ค.
(3) ์ฌ์ฉ์๊ฐ '์คํฌ๋กค'ํ๋ฉด ๋ชฉ๋ก ์
์ด โโํ์๋๋์ง ํ์ธํ๋ removeClippedSubviews ๋
ผ๋ฆฌ๋ฅผ ์๋ก ๊ณ ์น๊ณ ์๋ก ๊ณ ์นฉ๋๋ค.
๋ฆฌ๋ @gre ๊ฐ์ฌํฉ๋๋ค
RN 0.41.2์ ์ฌ์ ํ ์กด์ฌํ๊ณ Android๋ ๊ด์ฐฎ์ต๋๋ค. ios10๋ง ์์ผ๋ฉด removeClippedSubviews={false}๋ก ์ค์ ํ๋ฉด ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค. ๋ด listView๋ ์๊ธฐ ๋๋ฌธ์ ํฐ ๋ฌธ์ ๋ ์๋๋๋ค. tabNavigator(react-navigation)์ stackNavigator ๋ด๋ถ์ ์๋ listView.
render() {
return (
<View style={{ flex: 1, justifyContent:'center'}}>
<ListView
dataSource={this.state.dataSource}
renderRow={this._renderRow.bind(this)}
removeClippedSubviews={false}
/>
</View>
);
}
๋์ผํ ๋ฌธ์ ๊ฐ ์ฌ๊ธฐ์ ์์ต๋๋ค. removeClippedSubviews={false} ์ธ์๋ ์ถ๊ฐํ ๊ฒ์ด ์์ต๋๋ค.
@agentilela ์์ ์ฌ๊ธฐ์๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
removeClippedSubviews={false}
์์ ํ์ต๋๋ค.
๋ฐ์ ๋ชจ๊ตญ์ด๊ฐ-์ง๋์์์ด ๋ฌธ์ ๊ฐ ์กด์ฌ MapView
AFAIK๋ ์ฌ์ฉํ์ง ์๋ ScrollView
ํ๊ณ ์๋ ์๋ฌด ์๊ด์ด ์์ต๋๋ค ListView
.
๋ฌธ์ ๋ ์ฌ์ ํ RN44์์ ๋ฐ์ํ๊ณ ์์ต๋๋ค. initialListSize={200}
๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง๋ง ํ์ํ๊ธฐ ์ ์ ๋ ๋๋งํ๋ ๋ฐ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ฏ๋ก ์ฅ๊ธฐ์ ์ผ๋ก ์ข์ ํด๊ฒฐ์ฑ
์ ์๋๋ผ๊ณ ์๊ฐํฉ๋๋ค. 100๊ฐ ์ด์์ ํ์ด ์๋ ๋ชฉ๋ก ๋ณด๊ธฐ์์๋ ๋ถ๋ช
ํฉ๋๋ค.
ps removeClippedSubViews={false}
๋ ๋ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง ๋ชปํฉ๋๋ค
removeClippedSubViews={false}
์(๋) ListView
๋ํด ์ผํ์ต๋๋ค.
๋ํ FlatList
์๋ ๋์ผํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
ListView/FlatList ๋ฐ react-navigation์ ๋์ผํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
TabNavigator ์ต์
์ lazy: true
๋ฐ ListView์ removeClippedSubViews={false}
ํ์ต๋๋ค.
RN 0.44.0์์ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ์์ ํ์ธํ ์๋ ์์ต๋๋ค.
๋ฐ์ ํ์ + TabNavigator + (ListView ๋๋ FlatList)๋ฅผ ์ฌ์ฉํ ๋ ๋ฐ์ํฉ๋๋ค.
ํญ์ผ๋ก ์ด๋ํ๋ฉด ๋น์ด ์๋ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค. ์กฐ๊ธ๋ง ์คํฌ๋กคํ๋ฉด ๋ชฉ๋ก์ด ํ์๋ฉ๋๋ค.
๋ฐ์ํ์ง ์๋ ์ ์ผํ ํญ์ TabNavigator์ initialRouteName์ ์์ต๋๋ค.
์ธ๊ธํ๋ฏ์ด lazy: true ๋ฅผ ์ค์ ํฉ๋๋ค. TabNavigator๊ฐ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค.
์ฌ๊ธฐ์์ ๋์ผํ ๋ฌธ์ , removeClippedSubViews๋ก ์์ ๋จ
์ค๋ณต ๋ฌธ์ https://github.com/facebook/react-native/issues/14069์ ์ค๋ช
๋ ๋๋ก
๋์์ด ๋ ์ ์๋ค๋ฉด https://github.com/jcharlet/react_native_listview_bug ๋ฌธ์ ๋ฅผ ์ฌํํ๊ธฐ ์ํด ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ๋ง๋ค์์ต๋๋ค.
๋ํ ๋์ผํ ์ฌ์ฉ ์ฌ๋ก์ ๋ํด 'react-navigation' ๋์ 'react-native-router-flux'๋ฅผ ์ฌ์ฉํ ๋ ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค.
TabNavigator์ ๋ฐ์ ํ์์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. removeClippedSubViews={false}๋ ๋์์ด ๋์ง ์์ต๋๋ค.
์ ์๊ฒ๋ ๊ฐ์ ๋ฌธ์ ์ ๋๋ค. TabNavigator ๋ฐ StackNavigator๋ฅผ ํด๋น ํญ์ ์์์ผ๋ก ์ฌ์ฉํ๊ณ ์ผ๋ฐ ListView์ ํจ๊ป ๋ฐ์ ํ์์ ์ฌ์ฉํฉ๋๋ค. RN 0.44 / Expo 17, ๊ทธ๋ฆฌ๊ณ removeClippedSubviews๋ lazy๋ ๋์์ด ๋์ง ์์์ต๋๋ค :-/
removeClippedSubviews๋ IOS ๋ฒ์ ์ ์์ ํ๋ ๋ฐ ๋์์ด ๋์์ง๋ง Android์ ๊ฒฝ์ฐ initialListSize๋ฅผ ์ฌ์ฉํด์ผ ํ์ต๋๋ค.
์ ํจ๊ป
"dependencies": {
"react": "16.0.0-alpha.6",
"react-native": "0.44.2",
"react-navigation": "1.0.0-beta.11"
}
๊ทธ๋ฆฌ๊ณ lazy: true
์์ TabNavigator
์ TabNavigatorConfig
๋ชจ๋ ๊ฒ์ ์ ๋ ๋๋ง :
const AppNavigator = TabNavigator({
HomeTab: {
screen: HomeScreen,
path: '/'
},
PeopleTab: {
screen: PeopleNavigator,
path: '/people',
}
}, {
lazy: true
});
const PeopleList = ({ people }) => {
return (
<FlatList
data={people}
renderItem={({item}) => <Text>{item.name}</Text>}
/>
);
};
๋ค์์ผ๋ก ์
๊ทธ๋ ์ด๋
{
"๋ฐ์ ๋ค์ดํฐ๋ธ": "0.44.2",
"๋ฐ์ ํ์": "1.0.0-beta.11"
}
๋๋ฅผ ์ํด ์ผํ์ต๋๋ค. lazy=true๋ StackNavigator์ ํ์ํ์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค.
{
"๋ฐ์ ๋ค์ดํฐ๋ธ": "0.44.2",
"๋ฐ์ ํ์": "1.0.0-beta.11"
}
๊ฒ์ผ๋ฅธ = ์ฌ์ค
removeClippedSubViews={๊ฑฐ์ง}
์๋ํ์ง ์์ต๋๋ค
์ด๊ฒ์ ์ ๋ง ํฅ๋ฏธ๋กญ์ต๋๋ค. ์ด 2๋ ๊ฐ์ ๋ฒ๊ทธ๊ฐ ๋ง์นจ๋ด ์ธ์ ๋ซํ์ง ๋ณด๊ณ ์ถ์ต๋๋ค.
๋๋ react-native 0.44.2, react-navigation 1.0.0-beta.11๋ก ์ ๊ทธ๋ ์ด๋ํ๊ณ ๋ฌธ์ ์ TabNavigator์์ "lazy=true"๋ฅผ ์ค์ ํ๊ณ ์์ ํ์ต๋๋ค. ์๋ง๋ lazy=true๋ฅผ ์ค์ ํ๋ ๊ฒ๋ง์ผ๋ก๋ ํธ๋ฆญ์ ์ํํ ์ ์์ง๋ง ์ด๋ฏธ ์ ๋ฐ์ดํธํ์ต๋๋ค.
@jhalborg FlatList & removeClippedSubViews={false}๊ฐ ์๋ ๋ชฉ๋ก์ ๋ฌธ์ ๋ฅผ ์์ ํ์ต๋๋ค.
๋๋ react-navigation์ ์ฌ์ฉํ๊ณ ์๊ณ removeClippedSubViews๋ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ก ์๋ํฉ๋๋ค.
๋ชจ๋ฌ ์คํ -> ํ์ฌ ํญ ์คํ -> ํ์ ์คํ์ด ์๋ ์ฌ๋ฌ ํญ ํฌํจ
๋ด ๋ฌธ์ ๋ ์ฑ๋ฅ ๋ถ์กฑ์ด์๊ธฐ ๋๋ฌธ์ ์ํ ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก removeClippedSubViews ๊ฐ์ ๋ง๋ค์ด ํ๋ฉด ๋ก๋ ์ฌ๋ถ์ ๋ฐ๋ผ on/off๋ฅผ ํ ๊ธํ ์ ์๋๋ก ํ์ต๋๋ค.
๋ค๋ฅธ ํญ์ ์๋ ๋์ ๋ค์ ๋ก๋ํ๋ ๋ชฉ๋ก์ด ์์ผ๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ ์ฌ์ฉํฉ๋๋ค.
constructor (props) {
super(props)
this.state = { removeClippedSubViews: false }
}
componentDidMount () {
this.setState({ removeClippedSubViews: true })
}
resetData () {
const callback = (newRecords) => {
this.setState({ removeClippedSubViews: true, records: newRecords })
}
this.setState({ removeClippedSubViews: false, records: [] }, () => {
someDataHelper.reloadData(callback)
})
}
render () {
return (
<ListView removeClippedSubViews={this.state. removeClippedSubViews} />
)
}
์ ์ ๋์ ๋๋ฅผ ๊ท์ฐฎ๊ฒํ์ง๋ง ๊ฝค ๊ฐ๋จํ ์๋ฃจ์ ์ผ๋ก ๋๋ฌ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ด ๋๊ตฐ๊ฐ์๊ฒ ๋์์ด๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๋ค์๊ณผ ๊ฐ์ ์ด์ ๋ก ์ด ๋ฌธ์ ๋ฅผ ์ข ๋ฃํ ์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
์๊ฐ?
์ด๊ฑฐ ์ง์ง ๋ฒ๊ทธ ์๋? ๊ทธ๋ ๋ค๋ฉด ์ ๋ฌธ์ ๋ฅผ ์ข ๋ฃํฉ๋๊น?
์ด์ ์ ๋ํด:
removeClippedSubViews
์ ๊ฑฐํ๋ ๊ฒ์ ์ฑ๋ฅ ๋น์ฉ์ด ์๋ ํดํน์ฒ๋ผ ๋ณด์ด์ง๋ง ํฉ๋ฆฌ์ ์ธ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์๋๋ผ๊ณ ์๊ฐํฉ๋๋ค.์ด๊ฒ์ด FlatList/SectionList ๋ด์์ ์ฌ์ ํ ํ์ฑ ๋ฒ๊ทธ์ธ์ง ํ์ธํฉ๋๋ค.
FlatList/SectionList์ ์ฑ๋ฅ๊ณผ ๊ด๋ จ๋ ๋ช ๊ฐ์ง ๋ฌธ์ ๋ ์์ต๋๋ค. ์ด๋ ์ผ๋ถ ์ฌ๋๋ค์ด ์์ง ListView์์ ์ด๋ํ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ฉฐ ์ด๋ฏธ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์ด์ํ๊ฒ ๋ณด์ ๋๋ค.
์์ ๊ฒ์ํ ๊ฒ๊ณผ ๊ฐ์ ๊ฒ์ด ๊ตฌ์ฑ ์์ ์์ฒด์ ํตํฉ๋ ์ ์์ต๋๊น?
ListView์์ ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ๋ฐ ์ด๋ค ๋ฌธ์ ๊ฐ ์์์ต๋๊น?
ListView๊ฐ ๋ ๋์ ์์น์ ๋ํ ์ธ๋ถ ์ฌํญ์ ๋ณด์ง ๋ชปํ์ต๋๋ค. ListView๋ ๊ทธ๋ฐ ์์ ์ ์ํํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ๋๋ ๊ฒฝ์ฐ ์ฐฝ ํฌ๊ธฐ๋ฅผ ๋๋ฆฌ๊ฑฐ๋ ๊ฐ์ํ๋ฅผ ๋ ์ ์์ต๋๋ค.
๊ณ์ ์งํํ๊ธฐ ์ ์ ๋ฐฉ๊ธ ์ง๋ฌธํ ์ง๋ฌธ์ ์๋ตํ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๊ณ ์ถ์ง๋ง ์์ ์ ์๋๋๋ค. ์ด ๋ฌธ์ ๋ ์ฌ์ ํ FlatList์์ ๋ฐ์ํ๊ณ ์ด๋ ค ์์ด์ผ ํฉ๋๋ค.
๋จ์ง ์ผ๋ฐ์ ์ธ ์ปค๋ฎค๋ํฐ ์ง์์ ์ํ ๊ฒ์ ๋๋ค.
ListView ํ ๋ด์์ Nested ListView, ์ฆ ListView๋ฅผ ์ฌ์ฉํ๋ ์๋๋ฆฌ์ค์์ ์ด ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ์ต๋๋ค. ๋ด ์๋ฃจ์
์ ์ค์ฒฉ๋ ListView์ removeClippedSubviews={false}
๋ฅผ ์ ์ฉํ์ฌ ์์ ๋์์ต๋๋ค.
react-native-cli: 2.0.1
react-native: 0.41.2
iOS 9.x๋ฅผ ์คํํ๋ iPad 3/iPad Mini์ ๊ฐ์ ์ค๋๋ ํ๋์จ์ด์์ ListView/FlatList/VirtualizedList/WindowedListView(๋ฌด์์ด๋ )๋ฅผ ์ฌ์ฉํ์ฌ ํฐ ๋ชฉ๋ก์์ ๋ถ๋๋ฝ๊ฒ ์คํฌ๋กคํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
์ฐธ๊ณ : ๋๋ ๋จ์ํ ๋ชฉ๋ก, ์ด๋ฏธ์ง๊ฐ ์๋ ํ์ ํ ์คํธ ๊ตฌ์ฑ ์์์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ต๋๋ค.
๋๊ตฐ๊ฐ๋ ์คํฌ๋กค์ด ๋ถ๋๋ฝ๊ณ ๊ณ ๋ฅด์ง ์์ 7000๊ฐ์ ๋ ์ฝ๋ ๋ฐ์ดํฐ ์ธํธ์ ํจ๊ป ๊ธฐ๋ฅ์ ์๋ฅผ ๊ณต์ ํ ์ ์์ต๋๋ค. ๋ชจ๋ ์์ฑ ๊ตฌ์ฑ์ ์๋ํ๊ณ ์ด์ด ์์ต๋๋ค ๐ข
๋์ํจ - ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์ํด ๋ณด์ด์ง ์๋ ์ ๋ ์ง์ฐ๊ณ ์์ต๋๋ค. ๋ง์ ์ฑ์์ ์ด๋ฌํ ํ์ ๊ตฌ์ฑ ์์๊ฐ ๋ง์ ์ฌ์ฉ ์ฌ๋ก์ ๋ํด ์ฑ๋ฅ์ด ๋๋ฌด ๋ถ์กฑํ๋ค๋ ๊ฒ์ ๋ถ๋๋ฌ์ด ์ผ์ ๋๋ค. ๋ค์ ์ฃผ ์ ๋์ ์ด์ ๋ํด ์์ธํ ์ดํด๋ณด๊ณ ์๋นํ ์ฑ๋ฅ ํฅ์์ด ์๋์ง ํ์ธํ๊ฒ ์ต๋๋ค.
2017๋ 6์ 10์ผ ์คํ 3์ 30๋ถ +1000, Ariel Falduto [email protected] ์์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
iOS 9.x๋ฅผ ์คํํ๋ iPad 3/iPad Mini์ ๊ฐ์ ์ค๋๋ ํ๋์จ์ด์์ ListView/FlatList/VirtualizedList/WindowedListView(๋ฌด์์ด๋ )๋ฅผ ์ฌ์ฉํ์ฌ ํฐ ๋ชฉ๋ก์์ ๋ถ๋๋ฝ๊ฒ ์คํฌ๋กคํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
์ฐธ๊ณ : ๋๋ ๋จ์ํ ๋ชฉ๋ก, ์ด๋ฏธ์ง๊ฐ ์๋ ํ์ ํ ์คํธ ๊ตฌ์ฑ ์์์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ต๋๋ค.
๋๊ตฐ๊ฐ๋ ์คํฌ๋กค์ด ๋ถ๋๋ฝ๊ณ ๊ณ ๋ฅด์ง ์์ 7000๊ฐ์ ๋ ์ฝ๋ ๋ฐ์ดํฐ ์ธํธ์ ํจ๊ป ๊ธฐ๋ฅ์ ์๋ฅผ ๊ณต์ ํ ์ ์์ต๋๋ค. ๋ชจ๋ ์์ฑ ๊ตฌ์ฑ์ ์๋ํ๊ณ ์ด์ด ์์ต๋๋ค ๐ข
โ
๋น์ ์ด ๋๊ธ์ ๋ฌ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ GitHub์์ ๋ณด๊ฑฐ๋ ์ค๋ ๋๋ฅผ ์์๊ฑฐํ์ธ์.
๋ฉ์ง @lprhodes , ์ฌ๊ธฐ์์ ~ 200๊ฐ์ ๋ ์ฝ๋๊ฐ ์๋ FlatList๋ฅผ ์ฌ์ฉํ๋ ๊ฐ๋จํ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๊ณต์ ํฉ๋๋ค. ์ด ์์ ๋ iOS 9๊ฐ ์ค์น๋ iPad 3์์ ๊ณ ๋ฅด์ง ๋ชปํฉ๋๋ค.
import React, { Component } from 'react';
import {
FlatList,
StyleSheet,
View,
} from 'react-native';
import Expo from 'expo';
import {
Text,
ListItem,
SearchBar,
} from 'react-native-elements';
class Feed extends Component {
loadFeed() {
const {data} = this.props;
const sections = [];
data.forEach((value, index) => {
const sectionName = value.name_line_sp;
const section = sections.find((section) => {
return section.title === sectionName;
});
if (section) {
section.data.push(value);
} else {
sections.push({
title: sectionName,
data: [value]
});
}
});
if (__DEV__) {
console.log('Sections size', sections.length);
}
return sections[0];
}
componentDidMount() {
this.flatListRef.scrollToOffset({
animated: false,
offset: 48
});
}
render() {
const feed = this.loadFeed();
return (
<View style={{flex: 1}}>
<Text h5 style={styles.section_title}>{feed.title} ({feed. data.length})</Text>
<FlatList
style={{flex: 1}}
ref={(list) => { this.flatListRef = list; }}
debug
ListHeaderComponent={() => (
<SearchBar
lightTheme
placeholder='Search...' />
)}
data={feed.data} // ~217 records
keyExtractor={(item) => (
item.code_group
)}
renderItem={({ item }) => {
return (
<ListItem
hideChevron
key={item.code_group}
title={`${item.name_group_sp}`}
subtitle={`${item.price_prod}`}
containerStyle={{ backgroundColor: 'white' }}
/>
);
}}
/>
</View>
)
}
}
import catalog from './data/catalog.json';
class App extends Component {
render() {
const data = catalog;
return (
<View style={styles.container}>
<Text h3 style={styles.title}>Skillcase</Text>
<Feed data={data} />
</View>
);
}
}
const styles = StyleSheet.create({
title: {
margin: 20,
marginBottom: 10,
color: 'white'
},
section_title: {
padding: 20,
color: 'white',
backgroundColor: '#1976D2',
},
container: {
flex: 1,
paddingTop: Expo.Constants.statusBarHeight,
backgroundColor: '#42A5F5',
},
});
Expo.registerRootComponent(App);
๋๋ ์์คํฌ uri: exp://8v-xvw.outatime.skillcase.exp.direct :80
๊ฐ์ฌ ํด์ !!!
์์ ์ฝ๋์๋ ๋ฌธ์์์ ํด๊ฒฐ๋ ๋ง์ ๋์ ์ฌ๋ก๊ฐ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ง์์ ์ผ๋ก ํจ์๋ฅผ ๋ค์ ๋ง๋ค๊ณ ๋ค์ ๋ฐ์ธ๋ฉํ๋ฉด CPU์ ๋ถ๋ด์ด ๋๊ณ ๋ชฉ๋ก ํญ๋ชฉ์ด ๋ถํ์ํ๊ฒ ๋ค์ ๋ ๋๋ง๋ฉ๋๋ค. ListItem ๊ตฌ์ฑ ์์๊ฐ PureComponent์ธ์ง ํ์ธํ๊ณ ์ฌ๊ธฐ์ ์ ๋ฌ๋ ๋ชจ๋ ์ํ์ด ๋ถํ์ํ ์ฌ๋ ๋๋ง์ ๋ฐฉ์งํ๊ธฐ ์ํด ์๊ฒ ๋์ผํ๊ฒ ์ ์ง๋๋์ง ํ์ธํด์ผ ํฉ๋๋ค. ์ฑ์ ๋๋จธ์ง ๋ถ๋ถ์๋ ์ ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๊ทธ๊ฒ์ ๋ง์ ๋์์ด ๋ ๊ฒ์ด์ง๋ง ๋๋ฆฐ ์ฅ์น์์ ์๋ฒฝํ ์ฑ๋ฅ์ ๋ณด์ฅํ ์ ์์ต๋๋ค. ์น ๋ธ๋ผ์ฐ์ ์ ๊ฐ์ ๋ค๋ฅธ ์ฑ์ด ํด๋น ์ฅ์น์์ ์ผ๋ง๋ ๋ ์ ์๋ํฉ๋๊น?
@outaTiME ๋ํ ๊ฐ ๋ ๋๋ง์์ loadFeed๋ฅผ ํธ์ถํด์๋ ์ ๋ฉ๋๋ค.
@lprhodes ๋ ๋ ๋ฉ์๋๋ ํ๋๋ง ์คํํฉ๋๋ค. btw ์ผ๋ถ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋๋ฅผ ์ ๋ฐ์ดํธํ๊ณ iOS 9๊ฐ ์ค์น๋ iPad 3์์ ์ฌ์ ํ ๊ณ ๋ฅด์ง ์์ต๋๋ค(iPhone 7์์๋ ๋ชจ๋ ์ํํจ). @sahrens์์ ๊ณ์ ์๋ชป๋ ์์ ์ ์ํํ๊ณ ์์ต๋๊น? ์กฐ์ธ ๊ฐ์ฌํฉ๋๋ค.
import React, { Component, PureComponent } from 'react';
import {
FlatList,
ListView,
Text,
StyleSheet,
View,
} from 'react-native';
import Expo from 'expo';
import {
ListItem,
SearchBar,
} from 'react-native-elements';
class FeedRow extends PureComponent {
render() {
const item = this.props.data;
return (
<Text>{item.name_group_sp}</Text>
)
}
}
class Feed extends Component {
constructor(props) {
super(props);
this.storeListRef = this.storeListRef.bind(this);
}
loadFeed() {
const {data} = this.props;
const sections = [];
data.forEach((value, index) => {
const sectionName = value.name_line_sp;
const section = sections.find((section) => {
return section.title === sectionName;
});
if (section) {
section.data.push(value);
} else {
sections.push({
title: sectionName,
data: [value]
});
}
});
if (__DEV__) {
console.log('Sections size', sections.length /*, images.length */);
}
return sections[0];
}
componentDidMount() {
this.flatListRef.scrollToOffset({
animated: false,
offset: 48
});
}
renderItem(item) {
return (
<FeedRow data={item.item} />
);
}
keyExtractor(item) {
return item.code_group;
}
listHeaderComponent() {
return (
<SearchBar
lightTheme
placeholder='Buscar...' />
);
}
storeListRef(list) {
this.flatListRef = list;
}
render() {
const feed = this.loadFeed();
return (
<View style={{flex: 1}}>
<Text h5 style={styles.section_title}>{feed.title} ({feed. data.length})</Text>
<FlatList
style={{flex: 1}}
ref={this.storeListRef}
debug
// pagingEnabled
ListHeaderComponent={this.listHeaderComponent}
data={feed.data} // ~217 records
keyExtractor={this.keyExtractor}
renderItem={this.renderItem}
/>
</View>
)
}
}
import catalog from './data/catalog.json';
class App extends Component {
render() {
const data = catalog;
return (
<View style={styles.container}>
<Text h3 style={styles.title}>Skillcase</Text>
<Feed data={data} />
</View>
);
}
}
const styles = StyleSheet.create({
title: {
margin: 20,
marginBottom: 10,
color: 'white'
},
section_title: {
padding: 20,
color: 'white',
backgroundColor: '#1976D2',
},
container: {
flex: 1,
paddingTop: Expo.Constants.statusBarHeight,
backgroundColor: '#42A5F5',
},
});
Expo.registerRootComponent(App);
๋ ์ข์ง๋ง debug
๋ฅผ ์ค์ ํ๋ฉด ์์
์๋๊ฐ ํฌ๊ฒ ๋๋ ค์ง๋๋ค. ๋ํ ์ฑ๋ฅ์ ํ๊ฐํ ๋ ๊ฐ๋ฐ/๋๋ฒ๊ทธ ๋น๋๊ฐ ์๋ ์ต์ ํ๋ ํ๋ก๋์
๋น๋๋ฅผ ์คํํ๊ณ ์๋์ง ํ์ธํด์ผ ํฉ๋๋ค. ๋ง์ง๋ง์ผ๋ก, ๋ ๋๋งํ ๋๋ง๋ค ์ฌ์ ํ ์๋ก์ด ์คํ์ผ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์์ผ๋ฉฐ onMount์์ scrollToOffset์ ํธ์ถํ๋ ๋์ initialScrollPosition์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
@sahrens yup debug
ํ๋๊ทธ๊ฐ ์๊ณ ์ต์ ํ๋ ํ๋ก๋์
๋น๋๊ฐ ์คํ๋๋ฉด ๋ ๊ณ ๋ฅด์ง ์๊ฒ ์คํ๋ฉ๋๋ค. ๋ฐ์ ๋ค์ดํฐ๋ธ 0.44๋ฅผ ์ฌ์ฉํ๋ ์์คํฌ 17์ ์ฌ์ฉํ๊ธฐ ์ ์ ๋งํ๋ฏ์ด, ๋ฐ์ ๋ค์ดํฐ๋ธ(0.45 ) FlatList
์ ๋ํ ๊ฐ์ ์ฌํญ์ด ์์ต๋๋ค.
btw, ์ ๋ชจ๋ ๋ ๋๋ง์์ ์คํ์ผ์ด ์์ฑ๋ฉ๋๊น? ์ด ๊ฒฝ์ฐ flex
์คํ์ผ์ ๋ ๋๋ง( Feed
๊ตฌ์ฑ ์์์์)์ ํ ๋ฒ๋ง ์คํ๋ฉ๋๋ค.
App
๋ ๋๋งFeed
๋ ๋๋งFeedRow
๋ ๋๋ง@lprhodes ๊ฐ ๋ ๋๋ง์ loadFeed์ ๋ํด ์ด์ผ๊ธฐ ๊ฒ๊ณผ ๋งค์ฐ ์ ์ฌํ, ๋๋ ์ดํด Feed
์ด ์ฌ๋ฐ๋ฅธ์ง, ํ ๋ฒ๋ง ์คํ๋ฉ๋๋ค ๋ ๋๋ง?
initialScrollPosition
ํ๋ฉด initialScrollIndex
์ด๊ฒ ์ฃ ? scrollToOffset
์ฒ๋ผ ์๋ํ์ง ์์ต๋๋ค. Feed
๋ง์ดํธ๋ ๋ ListHeaderComponent
(๋์ด 48ํฝ์
)์ ์จ๊ฒจ์ผ ํฉ๋๋ค.
์ด ์ฝ์ ๊ฒฝ๊ณ ๋ ์ด๋ป์ต๋๊น? ๋๋ renderItem์ PureComponent๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๊น?
VirtualizedList: You have a large list that is slow to update - make sure your renderItem function renders components that follow React performance best practices like PureComponent, shouldComponentUpdate, etc. {"dt":85588,"prevDt":1497296394821,"contentLength":10023}
๊ฐ์ฌ ํด์ !!
๊ทธ ๊ฒฝ๊ณ ๋ ๋ง์คํฐ์์ ์์ ๋ ์ผ์ข ์ ๋ฒ๊ทธ์ด์ง๋ง ์ด๊ธฐ ๋ง์ดํธ์ ๊ฒฝ์ฐ 85์ด๋ ์์ฒญ๋๊ฒ ๋๋ฆฝ๋๋ค. ์ฝ๋๋ฅผ ๋ ๊น์ด ํ๊ณ ๋ค์ด ๋ฌด์์ด ๊ทธ๋ ๊ฒ ์ค๋ ๊ฑธ๋ฆฌ๋์ง ์์๋ด์ผ ํฉ๋๋ค. ๊ตฌ๊ธ์์ ๋ฐ์ ์ฑ๋ฅ์ ๋ํด ๊ฒ์ํ๊ฑฐ๋ ๊ด๋ฒ์ํ React ์ปค๋ฎค๋ํฐ์์ ๋์์ ์์ฒญํ๋ฉด ๋ง์ ๋ฆฌ์์ค๊ฐ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์, initialScrollIndex
. ์๋ํ๋ ค๋ฉด getItemLayout
๋ฅผ ๊ตฌํํด์ผ ํฉ๋๋ค. ListHeaderComponent
๋ฅผ ์ค๋ช
ํด์ผ ํฉ๋๋ค.
์ข์ @sahrens , ๋๋ iPad 3 ๋๋ OS ๋ฒ์ iOS 9์ ๊ฐ์ ์ค๋๋ ํ๋์จ์ด์ ๋ํด ๋๋ ค์ํฉ๋๋ค ... ์ต์ ์ฅ์น์์ ํ ์คํธํ๋ ๊ฒ์ ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋ค๋ฅธ ์ฌ๋์ด ๋์ผํ ํ๋์จ์ด ๋ฌธ์ ๋ฅผ ๊ฒช๊ณ ์๋์ง ์๊ณ ์ถ์์ต๋๋ค ... ์ ์ ํ ์ปค๋ฎค๋ํฐ์ ๋ ๊น์ ๋ด์ฉ์ด ์๋์ง ํ์ธํ๋๋ก ์์ฒญํ๊ฒ ์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค!!!
์๋
๊ด์ฐ์ ํ๋ซ ๋ชฉ๋ก์ style={{ backgroundColor: 'white' }}
๋ฅผ ์ ๊ณตํ์ฌ ์์ ๋์์ต๋๋ค.
@hramos & @sahrens , 0.44.0
์ฌ์ฉ react-native-tab-vew
, ๊ทธ๋ฆฌ๊ณ ์ ๋ง ํต์ฌ ํ์์ด ์๊ฐ์ ์ถ์ฒ ๋ฌด์ ๋ถ๋ช
ํ์ง ์๋ค.
@sjmueller ๋ @sahrens ๊ฐ ์ด๊ฒ์ด ์ด๋ฏธ ๋ง์คํฐ์์ ์์
@hramos ๋ฐฉ๊ธ ์ด ์ ์ฒด ์ค๋ ๋๋ฅผ ๋ค์ ๊ฒํ ํ์ต๋๋ค. ๋์ณค์ ์๋ ์์ง๋ง @sahrens ์์ FlatList๊ฐ ๋ณด์ด์ง ์๊ฒ ๋๋ ๊ฒ์ด ๋ง์คํฐ์ ๊ณ ์ ๋์ด ์๋ค๋ ์ธ๊ธ์ ๋ณธ ์ ์ด ์์ต๋๋ค. ๋ํ ์ด ๋ฌธ์ ๋ฅผ ์ฐธ์กฐํ๋ ์ปค๋ฐ/PR๋ ๋ณด์ง ๋ชปํ๊ณ ๋ง์ง๋ง์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๊ถ์ฅ ํด๊ฒฐ ๋ฐฉ๋ฒ๋ ์์์ต๋๋ค.
@yaronlevi ๋ react-native-tab-view
๋๋ TabNavigator
lazy={true}
์ค์ ์ ๊ถ์ฅํ์ง๋ง ์ด๋ iPhone 7 ํ๋ฌ์ค์์๋ ๊ธ๊ฒฉํ ์ง์ฐ์ ์ ๋ฐํฉ๋๋ค.
@knappdev์ ๋ฐ๋ฅด๋ฉด lazy
์์ด ์๋ํ๋ฏ๋ก 0.44.0์์ ์
๊ทธ๋ ์ด๋ํ์ฌ ์ฑ๊ณต ์ฌ๋ถ๋ฅผ ํ์ธํ๊ฒ ์ต๋๋ค.
๋ด ํด๊ฒฐ ๋ฐฉ๋ฒ์ ํ๋ซ๋ฆฌ์คํธ๊ฐ ์ฌ์ฉ ์ค์ธ์ง ์ฌ๋ถ์ ๋ฐ๋ผ removeClippedSubviews๋ฅผ ์ผ๊ณ ๋๋ ๊ฒ์ ๋๋ค.
constructor (props) {
super(props)
this.state = { removeClippedSubviews: false }
this._disableRemoveClippedSubviews = this._disableRemoveClippedSubviews.bind(this)
this._onViewableItemsChanged = this._onViewableItemsChanged.bind(this)
this._renderItem = this._renderItem.bind(this)
}
_disableRemoveClippedSubviews () {
this.setState({ removeClippedSubviews: false })
}
_onViewableItemsChanged({ viewableItems, changed }) {
if (!this.state.removeClippedSubviews) this.setState({ removeClippedSubviews: true })
if (this._disableRemoveClippedSubviewsTimeout) clearTimeout(this._disableRemoveClippedSubviewsTimeout)
this._disableRemoveClippedSubviewsTimeout = setTimeout(this._disableRemoveClippedSubviews, 3000)
}
render () {
const { removeClippedSubviews } = this.state
return (
<FlatList
renderItem={this._renderItem}
removeClippedSubviews={removeClippedSubviews}
onViewableItemsChanged={this. _onViewableItemsChanged}
/>
)
}
removeClippedSubviews๋ ์ด์ FlatList์ ๋ํด ๊ธฐ๋ณธ์ ์ผ๋ก ๊บผ์ ธ ์์ต๋๋ค.
๋๋ฆฐ ์ฅ์น์ ๋ฌธ์ ์ ๋ํด RNTester ์ฑ FlatListExample์ ์ฌ์ฉํด ๋ณด์ จ์ต๋๊น?
FlatListExample์ ์ฑ๋ฅ์ ์ด๋ป์ต๋๊น?
removeClippedSubviews๋ ์ด์ FlatList์ ๋ํด ๊ธฐ๋ณธ์ ์ผ๋ก ๊บผ์ ธ ์์ต๋๋ค.
์ - ๊ทธ๋์ ์ค์ ๋ก ์คํฌ๋กคํ ๋ ์ผ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฐ ์์ผ๋ก ๋ฌด์์ ์งํฐ๋ฅผ ๋ ์ป์ต๋๋ค.
๊ทธ๋ฐ ๋ค์ FlatList๊ฐ ์์ฒด์ ์ผ๋ก ์ํํ๋ ๊ฒ๋ณด๋ค ๋ ๋ง์ด ์ฟ๋ฃ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ค์ด๊ธฐ ์ํด ๋ทฐ ์ ์์ ๋ฉ๋ฆฌ ๋จ์ด์ง ์ ์ ๋น ์ ๋ก ๋ฐ๊ฟ๋๋ค.
๊ทธ๋์ ๊ฒฐ๊ตญ removeClippedSubviews={false}
๋ฅผ ์ฌ์ฉํ๋ ๋์ ์ ๊ณ ์น ๋ฐฉ๋ฒ์ด ์์ต๋๊น? ์ฑ๋ฅ์ด ๋๋ฌด ๋น์ธ๋๋ผ๋?
๋๋ฅผ์ํ ์์ ์ ios ์๋ฎฌ๋ ์ดํฐ์ ๋ํด ์๊ฒฉ์ผ๋ก js ๋๋ฒ๊น ์ ๋นํ์ฑํํ๋ ๊ฒ์ด ์์ต๋๋ค.
lazy: true
์ค์ ์ด ํจ๊ณผ๊ฐ ์์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์์ง ์ฑ๋ฅ์ ํ
์คํธํ์ง ์์์ต๋๋ค.
์ด ๋ฌธ์ ๋ฅผ removeClippedSubViews={false}
์ต๊ณ ์ ํด๊ฒฐ ๋ฐฉ๋ฒ
๋ชจ๋ ํ๋์จ์ด/์๋ฎฌ๋ ์ดํฐ์์ ์๋ํฉ๋๋ค. removeClippedSubViews={false}
๊ฐ iPhone 7์์ ํญ์ ์๋ํ๋ ๊ฒ์ ์๋๋๋ค.
๋ชฉ๋ก ๋ณด๊ธฐ์์ ๊ฐ์ ๋ก ์ด๋ํด์ผ ํฉ๋๋ค.
componentDidMount() {
requestAnimationFrame(() => {
// HACK TO RELOAD DATA
this.refs._list.scrollTo({x: 1, y: 0, animated: false})
});
}
์ฐธ์กฐ์ ์.
<ListView
ref="_list"
dataSource={this.state.dataSource}
renderRow={(data, sectionId, rowId) => <Row
rowId={rowId}
selectedRow={this.state.selectedRow}
onPressRow={this._pressRow.bind(this)}
{...data}/>}
renderSeparator={(sectionId, rowId) => <View key={rowId} style={styles.separator} />}
removeClippedSubViews={false}
initialListSize={SortedBrandList.count}/>
๋ฌธ์ ๋ ์ด๋ฏธ ๋ง์ดํธ๋์์ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
2017๋ 8์ 24์ผ ์คํ 3์ 44๋ถ์ Peter Suwara [email protected] ์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ
๋ชจ๋ ํ๋์จ์ด/์๋ฎฌ๋ ์ดํฐ์์ ์๋ํฉ๋๋ค.'''componentDidMount() {
์์ฒญ ์ ๋๋ฉ์ด์ ํ๋ ์(() => {
// ๋ฐ์ดํฐ๋ฅผ ๋ค์ ๋ก๋ํ๋ ํดํน
this.refs._list.scrollTo({x: 1, y: 0, ์ ๋๋ฉ์ด์ : false})
});
}''''''
์ฐธ์กฐ="_list"
dataSource={this.state.dataSource}
renderRow={(๋ฐ์ดํฐ, ์น์ ID, ํ ID) => }
renderSeparator={(sectionId, rowId) => }
removeClippedSubViews={๊ฑฐ์ง}
initialListSize={SortedBrandList.count}
/>'''โ
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ GitHub์์ ๋ณด๊ฑฐ๋ ์ค๋ ๋๋ฅผ ์์๊ฑฐํ์ธ์.
๋๋ ์ ์ด๋ ์๋ฎฌ๋ ์ดํฐ์์ ๋ค์์ ์ฌ์ฉํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
<ListView removeClippedSubViews={false} .... />
๋ด ์๊ฐ์๋ ClippedSubviews๋ฅผ ๊ด๋ฆฌํ๋ ๋ฃจํด์ด ListView๊ฐ ํ์ฌ ํ๋ฉด์ ์์ ๋ ๊ฒฝ๊ณ๋ฅผ ์ ๋๋ก ํ์ธํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ํ๋ฉด ๋ฐ์์ ๋ ๋๋งํ ๋ค์ ํ๋ฉด์์ ์์ง์ด๋ ๋ชจ๋ ListView ๊ตฌ์ฑ ์์์์ ๋งค์ฐ ์์ฃผ ๋ฐ์ํฉ๋๋ค. ์ด๊ฒ์ ์์ ํ๊ธฐ์ ๋๋ฌด ์ด๋ ค์ด ๋ฒ๊ทธ๊ฐ ์๋๋๋ค.
์ด ๊ธฐ๋ฅ์ด ๋ฌธ์ ๋ผ๊ณ ํ์ ํฉ๋๋ค: https://github.com/facebook/react-native/blob/master/React/Views/RCTView.m#L321 -L369
๋ด ์๊ฐ์ ์ธก์ ํ๋ ์ขํ ๊ณต๊ฐ์ด ์๋ชป๋ ๊ณณ์ด ์์ต๋๋ค. ์ง๊ธ ๊ทธ๊ฒ์๋ณด๊ณ ์์ต๋๋ค.
์ด๊ฒ์ด ์์ ์ด ๋ ์ ์์ต๋๊น? https://github.com/facebook/react-native/pull/15669/files
์์ง ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์๋์?
@petersuwara : ๋น์ ์ด ์ ์ํ ์์ . ๊ฐ์ฌํฉ๋๋ค. @MattFoley : ์์ ์ฌํญ์ ์ธ์ ๋ค์ด๋ก๋ํ ์ ์์ต๋๊น?
To FlatList์๋ง ๊ตญํ๋์ง ์๊ณ ListView์์๋ ๋ก๋ํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ฐ์ดํฐ ์์ค๋ฅผ ์ค์ ํ ๋ ์ฝ๊ฐ์ ์ง์ฐ์ ์ฌ์ฉํ์ฌ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฐพ์์ต๋๋ค.
componentWillMount ๋ฉ์๋์์ ์๊ฒฉ ์์ค์์ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๋ฉด ๋ค์ ์ฝ๋๊ฐ ์คํ๋ฉ๋๋ค.
์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค :
setTimeout(function(){
this.updateDataSource(array,newArray)
},30)
updateDataSource = (comments,dataSource) =>{
this.setState({
allComments:comments,
dataSource: this.state.dataSource.cloneWithRows(dataSource),
isLoading:false
})
}
๊ทธ๋ฆฌ๊ณ ์ฝ๊ฐ์ ์ง์ฐ ์๊ฐ ๋์ ํญ์ ๋ก๋ฉ ํ๋ฉด์ ํ์ํ ์ ์์ต๋๋ค. ๋๋ฌด ์งง์์ ๋ณด์ด์ง๋ ์์ต๋๋ค.
@nathvarun ์ ๋ฐฉ๋ฒ์ด ์๋ํ๋ ๊ฒ์ ์ฐพ์
์ด๊ฒ์ react-navigation์ ํญ์ ํ ๋น๋ ํ๋ฉด๊ณผ ๊ฐ์ด ์ด๋ฏธ ๋ง์ดํธ๋ ๊ตฌ์ฑ ์์์์ ๋ฐ์ํ์ง๋ง ๋ ํ์ฌ ์ ํ๋์ด ์์ต๋๋ค.
์์ ๋ด PR์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๊ฒ ๊ฐ์ง๋ง ๋ณํฉํ๋ ๋ฐ ์ด์ด ์์์ต๋๋ค. ๋ค๋ฅธ ์ฌ๋์ด ๊ทธ PR์ ๋ํด ์ฐจ์ํ๊ณ ์ถ์ต๋๊น?
@MattFoley ๋ณํฉ ์ฌ๋ถ. ๋๋ ์ง๊ธ ๋น์ ์ ์ฝ๋๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ์ ๋ง๋ก ๋ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค.
react-navigation
์ TabNavigator
๋ฅผ react-navigation
lazy: true
๊ฒ๋ ์๋ํฉ๋๋ค... ํ์ง๋ง react-native
์์ ๋๋ ๊ฒ์ ๋ณด๋ ๊ฒ์ด ์ข์ต๋๋ค.
SectionList ๋๋ Flatlist๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ref = {(ref)=> this.sectionList = ref }
์ฝ๋์์ this.sectionList.recordInteraction() - ๋ทฐ๋ฅผ ๋ ๋๋งํด์ผ ํฉ๋๋ค.
@MattFoley ์ ์ ์๋ ์์ ์ฌํญ์ด ๋ณํฉ๋์์ผ๋ฉฐ ์ด์ 0.50 ๋ฆด๋ฆฌ์ค์ ์ผ๋ถ์ ๋๋ค. https://github.com/facebook/react-native/commit/03ae65bc25185fe6d7f62e66f5575ced5c3e8378
๋ฐฉ๊ธ ์
๋ฐ์ดํธํ๋๋ฐ <ListView />
์์ ์ด ๋ฌธ์ ๊ฐ ๊ณ์ ํ์๋ฉ๋๋ค. ๋ด๊ฐ ๋ญ๊ฐ ์๋ชปํ๊ณ ์์ต๋๊น? ๋ด package.json์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
"dependencies": {
"native-base": "^2.3.1",
"react": "^16.0.0",
"react-native": "^0.50.0-rc.1",
"react-native-linear-gradient": "^2.3.0",
"react-native-modal": "^4.1.0",
"react-native-simple-store": "^1.3.0",
"react-navigation": "^1.0.0-beta.11"
},
ListView
๋ ์ง๊ธ์ฏค ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค. FlatList
์๋ํ๊ณ ์ด๋ป๊ฒ ๋๋์ง ํ์ธํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋๋ ์ฐ๋ฆฌ๊ฐ 0.50.3์์ ์ด๊ฒ์ ๊ณ์ ๋ณด๊ณ ์๋ค๊ณ ๋ฏฟ๋๋ค. ๋ค๋ฅธ ์ฌ๋์ด ํ์ธํ ์ ์์ต๋๊น?
FlatList๋ก ์ ํํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
2017๋
11์ 17์ผ ๊ธ์์ผ ์ค์ 8:39 Colin Ramsay [email protected]
์ผ๋ค:
๋๋ ์ฐ๋ฆฌ๊ฐ 0.50.3์์ ์ด๊ฒ์ ๊ณ์ ๋ณด๊ณ ์๋ค๊ณ ๋ฏฟ๋๋ค. ๋ค๋ฅธ ์ฌ๋์ด ํ์ธํ ์ ์์ต๋๊น?
โ
๋น์ ์ด ๋๊ธ์ ๋ฌ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/facebook/react-native/issues/1831#issuecomment-345294840 ,
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AAZnGZ9oz7uKXx-wz3KFg-FSIzejAfM6ks5s3bavgaJpZM4FP1nt
.
์, ์ฐ๋ฆฌ๋ ์ด๋ฏธ FlatList๋ฅผ _์ฌ์ฉ_ํ๊ณ ์์ต๋๋ค.
์ด๊ฒ์ ์ฌ์ ํ โโ0.50.3์ ๋ฌธ์ ์ ๋๋ค. removeClippedSubviews๋ ํจ๊ณผ๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ค์ ์ด ์ ์์ต๋๊น?
0.50.3์์ ์ฌ์ ํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ด๊ฑฐ ๋ค์ ์ด์ด์ฃผ์ธ์.
๋ฒ๊ฑฐ๋กญ๊ฒ ํด์ ์ฃ์กํฉ๋๋ค๋ง ๋ค์ ์ด ์ ์์๊น์? ์ด๊ฒ์ ์๊ธํ ๋ฌธ์ ์ ๋๋ค.
์ต์ Expo React Native SDK๋ฅผ ์ฌ์ฉํ์ฌ ์ด ๋ฌธ์ ์ ๋ถ๋ช์ณค์ต๋๋ค. TabNavigator์ ์ธ ๋ฒ์งธ ListView์๋ง ๋ฐ์ํฉ๋๋ค. ๋ ๋ฒ์งธ์ ์ธ ๋ฒ์งธ ํ์ด์ง๋ฅผ ๋ฐ๊พธ๋ฉด ์ ์ธ ๋ฒ์งธ ํ์ด์ง๊ฐ ์ํฅ์ ๋ฐ์ต๋๋ค. removeClippedSubviews๋ ์ ๊ฒฝ์ฐ์๋ ๊ทธ๊ฒ์ ๊ณ ์ณค์ต๋๋ค.
requestAnimationFrame(() => { this.listview.scrollTo({y: 1}); });
๋๋ฅผ ์ํด ์ผํ์ต๋๋ค.
this.listView.scrollToEnd()
์ฌ์ฉํ๋ฉด ์๋ํ์ง ์์ผ๋ฏ๋ก ๋ชฉ๋ก ๋์ ์ขํ๋ฅผ ์๋์ผ๋ก ๊ณ์ฐํ์ฌ scrollTo()
์ ๋ฌํด์ผ ํ์ต๋๋ค.
flatlist์ ๊ฒฝ์ฐ ๋์ผํ ๋ฐฐ์ด์ ์ ๋ฐ์ดํธํ์ฌ ๋ฐ์ํ ์ ์์ต๋๋ค. FlatList๋ ๋ฐ์ดํฐ๊ฐ ๋ค๋ฅธ์ง ํ์ธํฉ๋๋ค. ๋ฐ๋ผ์ ๋ถ๋ณ ๋ฐฐ์ด์ ์ฌ์ฉํ์ญ์์ค.
removeClippedSubviews={false}๋ ์ ๊ฒฝ์ฐ์ ๋ํ ๋ฒ๊ทธ๋ฅผ ์์ ํฉ๋๋ค.
<ListView
data={this.state.mockData}
renderRow={(rowData) => this.renderRow(rowData)}
removeClippedSubviews={false}
/>
@edmengel ๋ง์ต๋๋ค. ๋๋ ํ๋ก์ ํธ์์ ์ผํ๊ณ ์์๊ณ ์ ํํ ๊ฐ์ ๋ฒ๊ทธ๊ฐ์์์ต๋๋ค.
์คํฌ๋กคํ๊ธฐ ์ ์:
์คํฌ๋กค ํ:
React-native-router-flux@^4.0.0-beta.27
๋ ํ์์ ์ฌ์ฉ๋๋ฉฐ App.js๋ ์ด๋ฅผ ๋ฐํํฉ๋๋ค. ๋ด ๊ฒ์ ํ์ด์ง์ ๋ชฉ๋ก ๋ณด๊ธฐ๊ฐ ํฌํจ๋์ด ์์ผ๋ฉฐ ์ด ๋ฒ๊ทธ๊ฐ ์์ต๋๋ค. ์ธ ๋ฒ์งธ ํญ์ ์์ต๋๋ค.
<Provider store={store}>
<View style={{flex: 1}}>
<Router hideNavBar={true}>
<Scene key="modal" modal>
{/* Tab Container */}
<Scene key="tabbar" tabs={true} tabBarPosition="bottom" tabBarStyle={{borderTopColor:'black', borderTopWidth:1,backgroundColor:'white'}}>
{/*Tabs */}
<Scene key="NewPage" component={NewPage} title="NewPage" icon={TabIcon} hideNavBar={true} />
<Scene key="NewPage2" component={NewPage2} title="Newpage2" icon={TabIcon} hideNavBar={true} />
<Scene key="SearchPage" component={SearchPage} title="Search" hideNavBar={true} />
</Scene>
</Scene>
</Router>
</View>
</Provider>
๋ชฉ๋ก ๋ณด๊ธฐ๊ฐ ํฌํจ๋ ๊ฒ์ ํ์ด์ง๋ฅผ ์ธ ๋ฒ์งธ ํญ์์ ๋ ๋ฒ์งธ ํญ์ผ๋ก ๋ณ๊ฒฝํ์ ๋ ๋ชฉ๋ก ๋ณด๊ธฐ๊ฐ ์ ๋๋ก ์๋ํ์ต๋๋ค.
์ด๋ฅผ ์ํด ์๋ํ๋ Hack์ ์ฐพ์์ต๋๋ค.
render() {
setTimeout(() => {
this.sectionList && this.sectionList.recordInteraction();
}, 50);
return (
<SectionList ref={(view) => { this.sectionList = view }} />
)
}
<Flatlist style={{ flex: 1 }}/>
์ด ํธ๋ฆญ์ ์ ์๊ฒ ํจ๊ณผ์ ์
๋๋ค.
ScrollView
๋ฐ ListView
๋ชจ๋ 0.55.4
์ ๋ํ ๋์ผํ ๋ฌธ์ ์
๋๋ค. removeClippedSubviews={false}
์ถ๊ฐํ๋ฉด ์๋ํฉ๋๋ค.
๋ถํํ๋ ์ฐ๋ฆฌ์ ๊ฒฝ์ฐ Android https://github.com/facebook/react-native/issues/13600#issuecomment -315629140์์ ๋๋ฝ๋ ์ด๋ฏธ์ง๋ฅผ ํผํ๊ธฐ ์ํด ํ์ํ๊ธฐ ๋๋ฌธ์ ์ต์ ์ด ์๋๋๋ค.
๋ ๋๋ง ์ ์๋ค๋ก ์คํฌ๋กคํ๋ ๊ฒ์ ํ์ ํ์๋ง ๋ฐ์ํ๋ฏ๋ก ์ฒ์์๋ ๋น ํ๋ฉด์ผ๋ก ์ ํ๋๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค.
๋ณด๊ธฐ๋ฅผ ์กฐ์ ํ๋ ๊ฒ๋ ๋์์ด ๋์ง ์์์ต๋๋ค.
๋ค๋ฅธ ์ ์ ์ฌํญ์ด ์์ต๋๊น?
ํน์ ์คํฌ๋กค ์์น ์ดํ์๋ง ๋ฐ์ํ๋ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค...
https://streamable.com/l5arv
chrome-devtools๋ฅผ ์ฌ์ฉํ์ฌ ๋ณด๊ธฐ๋ฅผ ๊ฒ์ฌํ๋ฉด ๋ชจ๋ ํ์ ๋ณด๊ธฐ๊ฐ ์๋ฆฐ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
์ฌ์ ํ ๋ฉ์ท์ต๋๋ค. @hramos ๋ฅผ ๋ค์ ์ฌ์ญ์์ค.
๊ทธ๋ฐ ๊ฐ๋จํ ๊ธฐ๋ฅ์ ์ฌ์ ํ ๋ฌธ์ ๊ฐ ์์ต๋๊น? ์ด๊ฒ์ด ์ฐ๋ฆฌ๊ฐ React Native์์ ๊ณง์ฅ Native ์ฝ๋๋ก ๋ค์ ์ด๋ํ ์ด์ ์ ๋๋ค.
๊ทธ๋ ๊ฒ ๊ฐ๋จํ๋ค๋ฉด ์์ ๋ด๋ฐ์ด ๊ณ ์ณ์ฃผ์ธ์ @petersuwara
์ด ๋ฌธ์ ๋ ์ ์ ๋ซํ ์์ต๋๋ค. ์ด๊ฒ์ด ๊ทํ์๊ฒ ์ํฅ์ ๋ฏธ์น๋ ๊ฒฝ์ฐ _์ ํธ๋ฅผ ์ด๊ณ ๊ฐ๋ฅํ ํ ์์ธํ ์ ๋ณด๋ฅผ ์ ๊ณตํ์ญ์์ค. ์ฌ๊ธฐ์ ๋ณด๊ณ ๋ ์๋ ๋ฌธ์ ๊ฐ ์์ ๋์๊ธฐ ๋๋ฌธ์ ์ด ๋ฌธ์ ๋ฅผ ์ ๊ทธ๊ณ ์์ผ๋ฉฐ, ์ดํ์ ๋๊ธ์ ๋จ๊ธด ๊ฐ ์ฌ๋์ด ๋๊ฐ์ ๋ฌธ์ ์ ์ง๋ฉดํ๊ณ ์๋์ง ํ์คํ์ง ์์ต๋๋ค.
์ฐ๋ฆฌ๋ Facebook์์ FlatList
_๊ด๋ฒ์ํ๊ฒ_ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ ๋ด๋ถ์ ์ผ๋ก ์ด๋ฌํ ์ข
๋ฅ์ ๋ถ๋ง์ด ์ ๊ธฐ๋ ์ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ํน์ ํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ด๋ฌํ ์ ํ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ๋ฌธ์ ์ ๋ํ ์์ธํ ์ ๋ณด์ ํจ๊ป ์ ๋ฌธ์ ๋ฅผ ์ฌ๋ ๊ฒ์ ์ฌํ ๋จ๊ณ์ ๋ช
ํํ ๋ชฉ๋ก์ด๋ ์ด์์ ์ผ๋ก๋ ์๊ท๋ชจ ํ๋ก์ ํธ๊ฐ ํฐ ๋์์ด ๋ ๊ฒ์
๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
0.17์์ ์ด์ ๋์ผํ ๋ฌธ์ ๋ฅผ ๋ณด์์ง๋ง
removeClippedSubviews
๋นํ์ฑํํ๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ ๊ฒ ๊ฐ์ต๋๋ค.