ããã
éšåçã«ããŒã«ã«ããŒã¿ãšéšåçã«ãªã¢ãŒãããŒã¿ã衚瀺ãããªã¹ããã¥ãŒããããŸãã ããŒã«ã«ããŒã¿ã¯ListView.DataSourceã®åæã§ãã ãã®ããŒã¿ãœãŒã¹ã¯ãListViewãã©ããããrenderã¡ãœããã§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
ã¯ããªãã®ããã«åããŸããïŒ 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ã§ãããã«æ°ã¥ããŸããã
åé¡ãåçŸã§ãã2ã€ã®äŸã次ã«ç€ºããŸãã
è¡ïŒ https ïŒ
è¡ãšã»ã¯ã·ã§ã³ïŒ https ïŒ
ç§ãæãã€ããäžæçãªè§£æ±ºçã¯ãListView1ptãããŠã³ãããããšãã«ã¹ã¯ããŒã«ããããšã§ããã
let listViewScrollView = this.refs.listView.getScrollResponder();
listViewScrollView.scrollTo(1);
ãã¹ãã®ããã«ãrnplay.orgã®äŸå ã®ãã®ã»ã¯ã·ã§ã³ã®ã³ã¡ã³ãã解é€ã§ããŸãã
æããªè³ªåã ããã¯NavigatorIOSã®äœ¿çšãšé¢ä¿ããããŸããïŒ ãªã¹ããã¥ãŒãNavigatorIOSã®åãšããŠã¬ã³ããªã³ã°ããããšãã«ãã¬ã³ããªã³ã°ãããã£ã³ã°ãªã©ã®åé¡ãçºçããŸããã
@jaygarciaäŸã§ã¯NavigatorIOSã䜿çšããŠããªããããããã¯æããŸããã ãŸããç§èªèº«ã®ãããžã§ã¯ãã§ã¯ãNavigatorIOSã®ä»£ããã«Navigatorã䜿çšããŠããŸãã
+1ã§ãããçŸåšãããã²ãŒã¿ãŒã䜿çšããŠãããšãã«ãã®åäœãçºçããŠããŸãã ç§ã¯0.11ã䜿çšããŠãããcloneWithRowsã䜿çšããŠããŸãã
åé¿çãšããŠã @ christopherdroã®ãœãªã¥ãŒã·ã§ã³ã䜿çšããå¿ èŠããããŸããããã¢ã€ãã ãã¬ã³ããªã³ã°ããã«ã¯ååã«ã¹ã¯ããŒã«ããå¿ èŠããããŸãïŒã¢ã€ãã ã¯å€§ããã§ãïŒã
èå³æ·±ãããšã«ãåé¿çã¯ãã®ãã°ã®åé¿çã«é¢é£ããŠããŸãïŒ //github.com/facebook/react-native/issues/1878ãªã®ã§ãç§ã®æçµçãªã³ãŒãã¯æ¬¡ã®ãšããã§ãã
listViewScrollView.scrollWithoutAnimationTo(80);
listViewScrollView.scrollWithoutAnimationTo(-80);
ããããŸãããäžèšã®ã³ãŒãã䜿çšãããšããã¹ããããScrollViewã«ããã€ãã®å¥åŠãªãã°ãçºçããŸãããããŠã³ãåŸãonScrollã€ãã³ããããªã¬ãŒããããããã®ãã¥ãŒã®æåã®ã¹ã¯ããŒã«ãªãã»ãããåé 眮ãããŸããã
ãŸã 0.12.0ã®ãã°ã ãã¥ãŒã®éå±€ã¯æ¬¡ã®ãšããã§ãã
0.11.0ã®@Sidniciousãšåãåé¡ã ç§ã®ã¢ããªã§ã¯ãreact-nativeã®åæããŒãžã§ã³ãããã®åé¡ãçºçããŠããŸãã ListView
Navigator
éå±€ãã移åãããšããã¹ãŠãæåŸ
ã©ããã«æ©èœããŸãã
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ã«èšå®ããããš
¯_ïŒãïŒ_ /¯
ããã§åãåé¡ã0.15.0ã§ããã¹ãŠã®ããªãã¯ãè©ŠããŸããããéããããŸããã§ããã ios 9.1 iphone 6
@ nicklockwood-ããã§æäŒã£ãŠããããŸããïŒ ãŸã ããã€ãã®ãã°ãããããã§ãã
0.14ãåãåé¡
åæ§ã®LisViewã®åé¡ããªã³ã¯ããïŒ https ïŒ
å¥ã®åæ§ã®åé¡ããªã³ã¯ããïŒ https ïŒ
ç§ã¯ããã0.16.0ã§èŠãŠããŸãã 誰ãããããProductPainsã®ã¬ãŒããŒã«èŒããŸãããïŒ ããã¯ããªãçããªã£ãŠããŠããŸãã ïŒ/
ãããProductPainsã«æçš¿ããŸããã ããã§ã圱é¿ãããå Žåã¯ãèªç±ã«æ祚ããŠãã ããã
0.16ãåãåé¡
dataSourceã§cloneWithRowsã䜿çšãããšã0.17ã§ãåé¡ã解決ããŸããã ãªã¹ãã¯ãã¹ã¯ããŒã«ãããŠãããšãã«ã®ã¿ã¢ã€ãã ãã¬ã³ããªã³ã°ããŸãã
0.17ã§ãåãåé¡ãçºçããŠããŸãããã removeClippedSubviews
ç¡å¹ã«ãããšä¿®æ£ãããããã§ãã
+1
0.17ã§ãåãåé¡ãçºçããŠããŸããããremoveClippedSubviewsãç¡å¹ã«ãããšä¿®æ£ãããããã§ãã
ç§ã«ãšã£ãŠã¯ã removeClippedSubviews
æç¡ã«ãããããã0.17ã§ãçºçããŸãã ç§ãæ°ä»ããã®ã¯ãç§ã®åé¡ãæåã§èšå®ãããcontentOffsetãšinitialListSize
é¢é£ããŠããå¯èœæ§ããããšããããšinitialListSize
ã«å¯ŸããŠã¬ã³ããªã³ã°ãããèŠçŽ ã®é«ããè¶
ããŠããå ŽåããŠãŒã¶ãŒãã¹ã¯ããŒã«ãããŸã§å¿
èŠãªèŠçŽ ã¯ã¬ã³ããªã³ã°ãããŸããã
flexDirection: 'row'
èšå®ãããŠãããªã¹ãã«ãåé¡ãããããã§ãã ãã®ããããã£ãåé€ãããšããã¹ãŠã®ã¢ã€ãã ãã¬ã³ããªã³ã°ãããŸãã èšå®ãããŠããå Žåããªã¹ãã¯æåã«2ã€ã®ã¢ã€ãã ã®ã¿ãã¬ã³ããªã³ã°ããŸãã
ããã²ãŒã¿ãŒäœ¿çšæã®removeClippedSubviewsåé¡ã®å Žåã
åé¡ãçºçããªãhttps://github.com/machard/react-native-advanced-navigationã確èªããããšããå§ãããŸãïŒããããããã¥ãŒãå®éã«ç»é¢ã«è¡šç€ºãããåŸãã¬ã³ããªã³ã°ãé
ããŠããããã§ãïŒ
contentContainerStyle
ããããã£ã«èšå®ãããflexDirection: 'row'
ãšflexWrap: 'wrap'
ãåé¡ããããŸãã ç§ã«ãšã£ãŠæå¹ãªåé¿çã¯ã pageSize
ã§ãã
react-nativeããŒãžã§ã³ïŒ 0.19.0
@jittuuãpageSizeãããããèšå®ããŠãããŠããããšãïŒ
pageSizeãäœã«èšå®ããŸããïŒ
@greããã¯ããªãã®ã¬ã€ã¢ãŠãã«äŸåããŸãã ãã¥ãŒãè¡ã«é 眮ãããŠããå ŽåãpageSizeã¯è¡ããšã®ã¢ã€ãã ã®åæ°ã§ããå¿ èŠããããŸãã æ£ç¢ºãªå€ãè©ŠããŠãããã©ãŒãã³ã¹ã«ã©ã®ããã«åœ±é¿ãããã確èªã§ããŸãã
ãŸããinitialListSizeãç»é¢å šäœã«è¡šç€ºããã®ã«ååãªå€§ããã«èšå®ããå¿ èŠããããŸãã
ãã®ã³ãããã®èª¬æã圹ç«ã€å ŽåããããŸãïŒ https ïŒ
@jittuuããã¯ç§ã®ããã«åããã flexWrap
ã䜿çšããŠãããšãã«ããã°ãçºçããŠããŸããã
ããããšã@jittuuå€2ã§
ãªã¹ããã¥ãŒãã¹ã¯ããŒã«ããŠã¢ããªãããã²ãŒãããŠæ»ããšããŸã åé¡ãçºçããŸãã
pageSizeã¯åœ¹ã«ç«ã¡ãŸããã§ããïŒ1ãã60ãŸã§ã®ç°ãªãå€ãè©ŠããŸããïŒã
@gre initialListSizeãååã«å€§ããèšå®ããŠããŸããïŒ è¡šç€ºã§ããã¬ãã¯ãããŸããïŒ
@jaygarcia @nicklockwoodãã®ãã°ãåçŸãããã¢ããããŸãããªããžããªã®URLïŒ ListNotRender
ã¹ãããïŒ
ãã®ãã°ã¯ListViewã®removeClippedSubviewsããããã«é¢é£ããŠãããšç¢ºä¿¡ããŠããããã®ãã°ã¯trueã«èšå®ãããŠããå Žåã«ã®ã¿çºçããŸãã
ããã¯ãRN0.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ã衚瀺ãããªããªã£ãå Žåã§ããããã¯ã°ã©ãŠã³ãã§ïŒããšãã°ãã¹ã¯ããŒã«ã®æŽæ°äžã«ïŒæŽæ°ãããŠããã®ã§ã¯ãªãããšæããŸãã
å®éããã¥ãŒãã¹ã¯ããŒã«ãããšãã°ã¯ç°¡åã«åçŸã§ããã®ã§ã ãéåãã§ãŸã§ãå
šç»é¢ãçœããªããŸãã
ããããããã¯åºæ¬çã«ãã®ãã°ãç§ã«èµ·ãã£ããšãã®å¯äžã®ã·ããªãªã§ãã ããã¯ã誰ã«ãšã£ãŠãåãåçŸã·ããªãªã§ããããããšããã°ã¯ãããããåºãã§ããïŒ
ãã®ã·ããªãªã¯ã @ janmonschke https://github.com/facebook/react-native/issues/1831#issuecomment-22799032ããããã»ã©é ããããŸããã
ãã®ãã°ã®çç±ãç解ããã®ã¯é£ããã§ãããããã«ç§ã®2ã»ã³ãããããŸãïŒ
ããã¯ã°ã©ãŠã³ãã§è¡ã_çœ_ã«ã¬ã³ããªã³ã°ãããããã§ãã ã¹ã¯ããŒã«ãã¥ãŒãåã³è¡šç€ºããå Žå_ïŒäŸïŒæ»ãïŒ_ããããã¯ãŸã çœã§ããã_ïŒæŽæ°ããçç±ããªãããããã£ãã·ã¥ãããŸãïŒ_æ°ããã¹ã¯ããŒã«ãçºçãããŸã§æŽæ°ãããŸããã
ScrollViewããŸã 衚瀺ãããŠããå Žåã«ã®ã¿åïŒ updateClippedSubviews
ïŒïŒãã¬ã³ããªã³ã°ããå Žåããã°ã¯ä¿®æ£ãããŸããïŒ ïŒè¡ãããã¯ã°ã©ãŠã³ãã§ã¬ã³ããªã³ã°ãããªãå Žåãè¡ãåã³çœã衚瀺ãããããšã¯ãããŸããïŒ
@javache 1fcd73fã¯ã
ãã°ãåçŸããç°¡åãªæ¹æ³ãèŠã€ããŸããã
ListViewã¯ç©ºçœã«ãªããè¡ã1ç»é¢ããå€ããªããã¹ã¯ããŒã«ãããšListViewãå衚瀺ãããè¡ã1ç»é¢ããå°ãªããªããŸããã¹ã¯ããŒã«ããŠããListViewã¯äœãå衚瀺ã§ããŸããã 1fcd73fã¹ã¯ããŒã«ã䜿çšãããšãListViewã¯å衚瀺ã§ããŸã:)
ç§ãã¡ãéžãã 解決çã¯ãscrollTo1pxã·ãããååŸã«onRefreshããããšã§ããã ããã¯åé¿çã§ãããã©ã¡ãã®å Žåãæ©èœããŸããã
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
é«ããæŽæ°ããŠããŸãã
é«ãæŽæ°ã³ãŒããcomponentDidUpdate()
ã§setTimeout
ã§ã©ããããã«ã¹ã¿ã ã¿ã€ã ã¢ãŠãã䜿çšããããšã圹ç«ã¡ãŸãã
ç§ããããçµéšããŸããããããŒã«ã«ããŒã¿ãå
¥åãããã®ã¯1ã€ã®ListViewã«ãããŸããã ç§ããããiOSã§ããèŠãŠããŸããã§ãããã0.29ã«ã¢ããã°ã¬ãŒãããåŸã§ãã åé¡ã®ListViewã¯this.state.dataSource.cloneWithRowsAndSections
ã componentDidMount
ã¯ããŒãæã§ãã
ãããŠã removeClippedSubviews={false}
ãããã«å¯ŸåŠããŸããã
ListView
ã³ã³ããŒãã³ãã«removeClippedSubviews
ãèšå®ããããšããç§ã«ãšã£ãŠã¯ããŸããããŸããã ããã©ã«ãã®Navigator
ã³ã³ããŒãã³ãã䜿çšããŠããå Žåã 0.29
ã®Release
ã¹ããŒã ã§ã®ã¿ãã®åé¡ãçºçããŠããŸããã
åãåé¡ããããŸããflexDirectionïŒ 'row'ãšflexWrapïŒ 'wrap'ãèšå®ããŸãããRN0.29.2ã䜿çšããŠããŸãã ä»ã®ãªã¹ããã¥ãŒïŒflexDirectionïŒ 'row'ãèšå®ããŠããªãå ŽåïŒã§ã¯ããã®åé¡ã¯ãããŸããã
ä»ã®æçš¿è ãèšã£ãŠãããããªç°¡åãªä¿®æ£ã¯ãé©åãªinitialListSizeãšpageSizeãèšå®ããããšã§ãããããšãã°ããªã¹ããã¥ãŒå ã«ããã¢ã€ãã ã®ãªã¹ãã®äžéšã ãã衚瀺ãããã£ã«ã¿ãŒãããå Žåããããã¯ã¢ããªã®å¿çæ§ãäœäžããããšæããŸãããªã¹ããã¥ãŒã衚瀺é åå šäœãåã¬ã³ããªã³ã°ããããšããŠããããããã£ã«ã¿ãŒéã®ã¿ããã¯é ããªããŸãã
ä»ã®ãªã¹ããã¥ãŒã§ã¯ãinitialListSize = 0 pageSize = 1ãèšå®ããããšã§ããã解決ããŸããã ããããã°ãªãããªã¹ããã¥ãŒã«ã¯ã§ããŸããïŒflexDirectionïŒ 'row'ããã³flexWrapïŒ 'wrap'ïŒã
ç§ã¯RNv0.31.0-rc.0ã§ãããæã£ãŠããŸãã
removeClippedSubviews = {false}ãè¿œå ãããšãåé¡ãä¿®æ£ãããããã§ãã
ãremoveClippedSubviews = {false}ãã¯é©åãªè§£æ±ºçã§ã¯ãªãããã§ãããã¹ãŠã®è¡ãã¬ã³ããªã³ã°ãããã¡ã¢ãªç®¡çã®åé¡ãçºçããŸãã ãlistView.scrollToããšãremoveClippedSubviewsã以å€ã®èª°ããããè¯ã解決çãæã£ãŠããŸããïŒ
ãã®åé¡ã¯ãRN0.31ã®iOS10ããŒã¿çã§ã¯ã¯ããã«æ·±å»ã§ã:-(
removeClippedSubviews
ã¯Androidã§åœ¹ã«ç«ã¡ãŸããScrollView
ãã代ããã«ã ListView
ããScrollView
ã«ç§»åããå¿
èŠããããŸããã
æ¬åœã«å€§ããªãã°ã ç§ãäŒããŸããã
å šå¡ã補åã®åé¡ã«è³æããããã«ããŠãã ããã ããã¯ãã§ã«ããªãé«ãã§ããããŸã 誰ãã®åä¿¡ãã¬ã€ã«çéžããã®ã«ååãªé«ãã§ã¯ãããŸãã:-(ããã«ãªã³ã¯ããããŸã
ãã®æç¹ã§ãããã¯ããããïŒ8607ãšåãåé¡ã ãšæããŸãã ããã«åãçµãæ¹æ³ã«ã€ããŠã®ç§ã®èšç»ã®ããã«ããããã§ãã¯ããŠãã ããã
0.33.0
ã«ååšãç¶ããŸã
0.32ã«ãŸã ååšããŸã
ç§ã¯æšæ¥ãã®ãã°ã«ééãã removeClippedSubviews = {false}
èšå®
0.33ã§+1
ãããç§ã«ãåãåé¡ïŒ +1
0.33ã
ç·šéïŒ
removeClippedSubviews = {false}ãç§ãåé¡ãä¿®æ£ããŸããã
+1
ãã®ãããhttps://gist.github.com/majak/b0ee1fb6ca725d2cf810d2f0ab394f2eïŒïŒ8607ããïŒãè©ŠããŠããã®åé¡ã«åœ¹ç«ã€ãã©ããæããŠ
@majakãã®ããããå ±æããŠããã ãããããšãããããŸãã é©çšããã ãã§ããã®åé¡ã¯ãªããªããŸããïŒRN0.34ïŒã
@majakããã¯ç§ã«ãšã£ãŠããããä¿®æ£ããããã§ããè¯ãä»äºã§ãïŒ
ããã¯RN34ã§removeClippedSubviews={true}
React Native0.34ã§ãã®åé¡ãçºçããŸããã
ãã®åé¡ã¯ã次ã®å Žåã«ã®ã¿çºçããŸããã
flexDirection: 'row',
flexWrap: 'wrap',
justifyContent: 'center',
ãªã¹ããã¥ãŒã®ã¹ã¿ã€ãªã³ã°ã
initialListSize={100}
ç§ã®ããã«ãããä¿®æ£ããŸãã
@majakãã®ãããã§PRãäœæããäºå®ã§ããïŒ
@janmonschkeããïŒ ãªã³ã¯ãããåé¡ã«åŸã£ãŠæŽæ°ã確èªããŠãã ããã
React Native0.36ã§ãã®åé¡ãçºçããŸãã
ããã0.36ã«çºçããããšã確èªã§ããŸã
ãšãã¥ã¬ãŒã¿ãŒã§ããããã°ã¢ãŒãã§ã®ã¿å®å
šã«æ©èœããŸãããããã€ã¹ã§ã¯æ©èœããŸããã ãã®ãªã¹ãã¯ããã€ã¹ã§ã¯æ©èœãããäžèšã®æšå¥šäºé
ããã¹ãŠè©Šãã ListView
ãScrollView
ã«çœ®ãæããŠããAndroidããã€ã¹ã«è¡šç€ºãããã®ã¯ããã²ãŒã¿ãŒã ãã§ãã ïŒãªã¹ããããã²ãŒã¿ãŒã®å€ã«çœ®ããŠã¿ãŠãïŒ
0.37
ç§ã¯ãŸã 0.36ã§åé¡ãèŠã€ããããšãã§ããŸãããåé¿çã«æè¬ããŸãïŒ
ç§ã¯ãŸã 0.36.1ã§ãããèŠãŠããŸã
ç§ã¯ãŸã 0.36.1ã§ãããèŠãŠããŸã
0.31ã«ååšãã
initialListSize={1}
ç§ã®ããã«ããã解決ããŸã
React Native0.38ã§ãã®åé¡ãçºçããŸãã
renderScrollComponent={(props) => <ScrollView style={flex: 1} /> }
ããã«ãããããŒãžã§ã³0.38ã®åé¡ãä¿®æ£ãããŸããã以åã®ããŒãžã§ã³ã§ãæ©èœãããã©ããã¯ããããŸããã
ããã¯ããŒãžã§ã³0.38ã§åé¡ãã¢ãŒã«ã€ãããŸããç§ã¯åæã®ããŒãžã§ã³ã§åäœãããã©ããããããŸãã
ãã®åé¡ã¯0.36ã«ååšããŸãã
removeClippedSubviews = {false}ããã³initialListSize = {8}ã§ã¯æ©èœããŸããã§ãã
1幎以äžçµã¡ãŸãããããã®å·ã¯ãŸã æªè§£æ±ºã§ããïŒ
0.39ã«ãŸã ååšããŸãã removeClippedSubviews = {false}
æ©èœããŸãã
ãremoveClippedSubviews = {false}ãã¯è¯ã解決çã§ã¯ãªãããã§ããæ°ãã解決çããããããŸããããŸãã PaltformiOSã RCTView.mãã¡ã€ã«
PRãäœæããå¿ èŠããããŸããïŒ
RN0.40ã§ãã¹ããã人ã¯ããŸããïŒRN0.40ã«ã¢ããã°ã¬ãŒãããåŸããã®åé¡ã¯çºçããªããªããŸããã
ãã®åé¡ã¯ååšããŸãã
1ãremoveClippedSubViews = trueã§ListViewã衚瀺ããŸãã
2ãè¡ãã¿ããããŠæ¬¡ã®ããŒãžã«å
¥ããŸãã
3ãç»é¢ã®åãã90å転ãããŸãã
4ãListViewç»é¢ã«æ»ãã
ListViewã¯ç©ºçœã«ãªãã1ç»é¢ä»¥äžã®è¡ã衚瀺ãããŸããã¹ã¯ããŒã«ãããšãListViewãå衚瀺ãããŸãã
@endpress RN0.41RC0ã䜿çšããŠãæé ãå®è¡ããŸãããããŸã åçŸã§ããŸããã
0.38ã§ãã®åé¡ãçºçããŸãã
ç§ã®åé¿çã¯ãListViewã®paddingTopã0ãã1ã®éã§å€æŽããããšã§ããããã«ãããListViewã¯æ¯åæŽæ°ãããŸãã
backgroundColorãborderãªã©ãå€æŽããŠã¿ãŠãã ãããä»ã®ããããã£ãæ©èœãããã©ããããç¥ãããã ããã
@nihgwuã¯ãŸã
ãããåé¡ã§ã
@endpressã®å€æŽïŒhttps://github.com/facebook/react-native/issues/1831#issuecomment-270552011ïŒã¯ç§ã®å Žåã«æ©èœããfacebook / react-nativeïŒ8607ã«ã圹ç«ã€å¯èœæ§ããããŸãã
ãããã¯ãŸã å®ç§ã«ã¯ã»ã©é ããããããŸããããPRãäœæããããšããå§ãããŸãã
ç§ã«ãšã£ãŠã¯ãinitialListSize = {0}ãèšå®ããŠããããã¯rn0.40.0ã«ä¿®æ£ãããŸãã
@majakãã®èŽåœçãªåé¡ã«äœãè¯ããã¥ãŒã¹ã¯ãããŸããïŒ
FlatListã¯ãŸã å®éšæ®µéã§ããããããã°ãå°ãªãããšããäžäœäºææ§ã®ãªãæ¹æ³ã§å€æŽãããããšãä¿èšŒãããã®ã§ã¯ãããŸããããèªå·±è²¬ä»»ã§è©Šãããšãã§ããŸãã
@sahrens @greå€ããªã¹ããã¥ãŒãšåãAPIãæäŸããFlatListã®äžã«æœè±¡ã¬ã€ã€ãŒãæ§ç¯ããŠãå€ãã¢ããªã±ãŒã·ã§ã³ã³ãŒããåãã«ä¿ã€ããšã¯å¯èœã§ããã
@sahrens FlatListã¯UITableViewã§å®è£ ãããŠããŸããïŒ
FlatListãå®å®ããå®éšçã§ãªããªã£ãããListViewãšåãAPIã䜿çšããŠã¢ããã¿ãŒãäœæããããå éšã§ListViewã®å®è£ ã亀æããå¯èœæ§ããããŸãã
UITableViewã¯äœ¿çšããŸããã å®éã«ã¯ãæ°ãããã€ãã£ãã³ãŒãã¯ãŸã£ãã䜿çšãããŠããŸããããã¹ãŠãæ¢åã®ãã€ãã£ã/ãã¬ãŒã ã¯ãŒã¯ããªããã£ãã䜿çšããJSã®ã¿ã§ããå®è£ ã¯æ¬¡ã®å Žæã§ç¢ºèªã§ããŸãïŒ https ïŒ
@sahrensããããšãããããŸãããšãŠãã¯ãŒã«ã§äŸ¿å©ã§ãã
@savanthongvanhãåæãµã€ãºã0ã«èšå®ãããšãåæããŒãæã«ListViewå ã®ãã¹ãŠã®ã¢ã€ãã ãã¬ã³ããªã³ã°ãããå¹æããããŸãã ã¢ã€ãã ãå€ãå Žåã¯æ³šæããŠãã ããã
ãŸãããã®rn0.41.2ãåŠçããŸãã 誰ããç§ãã³ããŒã§ããFlatLIstã®ç°¡åãªå®è£
ãæã£ãŠããŠãæ¬åœã«ããã«è§£æ±ºçãæãã§ããŸããïŒ
ããããšãã
ãã³
FlatListïŒããã³VirtualizedListïŒã¯ãããããè©ŠããŠã¿ããå Žåã¯ãã¹ã¿ãŒã«ãªã£ãŠããŸãã
ãããæ±ã£ãŠãã人ã®ããã«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ã®ReactNavigationStackNavigatorã«åã蟌ãŸããŠããŸãã
ãŸããããã°ã©ã ã§1pxã¹ã¯ããŒã«ãããªã¬ãŒããããã¯ã¯ãListView / FlatListã®äž¡æ¹ã§åŒãç¶ãæ©èœããŸãã ãã ããé©åãªã©ã€ããµã€ã¯ã«ã§åŒã³åºãå¿ èŠããããŸãïŒéåžžã¯ç»é¢ã«æ»ã£ããšãïŒã
@gre ïŒ
@gre ããã®ããã®ãµã³ãã«ã³ãŒãã¯ãããŸããïŒ ãããŠãListViewãå«ããã®ã³ã³ããŒãã³ãã®componentWillMountãæå³ããŸããïŒ
@ ericvicenti -RNããä»ã®ããªãã®æ°ã®ã³ãŒããå¿ èŠãªããã§ãã ä»ã®å Žæããå°ããã€åããŠããŸãã®ã§ã¯ãªãããšå¿é ã§ããã æããããããŸããã ãã¶ããä»ã®äººã䜿çšã§ããããã«ã¬ãã«ãããæããŸã-ããã¯èš±å¯ãããŠããŸããïŒ
@sahrensç³ãèš³ãããŸããããäŒç€Ÿã®ã¢ããªã«ãããŸããã空çœã®äŸãäœæããŠåçŸããããšãã§ããŸãã
ã³ã¡ã³ãã®å°ãäžã®@natdmïŒ https ïŒ
SectionListã§ãã®åé¡ãçºçããŠããŸã-ã¹ã¯ããŒã«ãããŸã§æåã®ã¬ã³ããªã³ã°ã§ç©ºçœã«ãªããŸãã @sahrensä¿®æ£ã¯ãããŸããïŒ
@smkhalsaæ確ãªåçŸã¯ãããŸããïŒ removeClippedSubviews = {false}ãèšå®ããŸãã
@sahrens removeClippedSubviews = {false}ãèšå®ãããšããããä¿®æ£ãããããã§ãã ããããªããšããã®ç¹å®ã®ãã¥ãŒã«ç§»åãããã³ã«ç©ºçœã®ç»é¢ã衚瀺ãããŸãã
æ°ããã¬ãã§åé¡ãåãåããŠãå¯èœã§ããã°æçš¿ããŸãã
ç§ã«ãšã£ãŠãåãã§ãïŒremoveClippedSubviewsã¯ééããªããã°ã®ããªã¬ãŒã§ãïŒã ç§ãã¡ã®ã¢ããªã«ã¯ãreact-native-tab-viewå ã«ãªã¹ããããç°¡åãªåçŸããããŸããã ãããããã£ãšç°¡åãªäŸã§ãããåçŸã§ãããã©ããã¯ããããŸããã
ããã§ç§ã®çãã®æåŸã®2ã€ã®æ®µèœãåç §ããŠãã ãã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
ç§ã®ç¥ãéãã§ã¯äœ¿çšããŸããScrollView
ããŠãšã¯äœã®é¢ä¿ããããŸããListView
ã
ãã®åé¡ã¯RN44ã§ãåŒãç¶ãçºçããŠããã initialListSize={200}
åé¡ã¯è§£æ±ºããŸããã衚瀺ãããŸã§ã«ã¬ã³ããªã³ã°ã«æéãããããããé·æçãªè§£æ±ºçãšããŠã¯é©åã§ã¯ãªããšæããŸãã 100è¡ãè¶
ãããªã¹ããã¥ãŒã§ã¯æããã§ãã
ps removeClippedSubViews={false}
ã¯ç§ã®åé¡ã解決ããŸãã
removeClippedSubViews={false}
ã¯ListView
ã§ç§ã®ããã«åããã
ãŸãã FlatList
ã«ãåãåé¡ããããŸãã
ListView / FlatListãšreact-navigationã§ãåãåé¡ããããŸãã
ç§ã¯ãããä¿®æ£ããŸããlazy: true
TabNavigatorã³ã³ãããªãã·ã§ã³ãšã§removeClippedSubViews={false}
ListViewã³ã³ãããŒã«ã§
RN0.44.0ã§ãã°ãçºçããŠããããšã確èªã§ããŸãã
react-navigation + 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ã®react-navigationã«é¢ããããã€ãã®åé¡ã removeClippedSubViews = {false}ã¯åœ¹ã«ç«ã¡ãŸããã
ç§ã«ãšã£ãŠãåãåé¡ã§ãã åé¡ã®ã¿ãã®åãšããŠTabNavigatorãšStackNavigatorãããã³ãã¬ãŒã³ãªListViewã§react-navigationã䜿çšããŸãã RN 0.44 / Expo 17ããããŠremoveClippedSubviewsãæ æ°ãç§ãå©ããŸããã§ããïŒ-/
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>}
/>
);
};
ã«ã¢ããã°ã¬ãŒããã
{{
"react-native"ïŒ "0.44.2"ã
"react-navigation"ïŒ "1.0.0-beta.11"
}
ç§ã®ããã«åãããlazy = trueã¯StackNavigatorã«ã¯å¿
èŠãªãããã§ã
{{
"react-native"ïŒ "0.44.2"ã
"react-navigation"ïŒ "1.0.0-beta.11"
}
lazy = true
removeClippedSubViews = {false}
åäœããŸãã
ããã¯æ¬åœã«èå³æ·±ãããšã§ãããã®2幎éã®ãã°ãæçµçã«ã¯ããŒãºãããææã確èªããããšæããŸãã
ç§ã¯react-native0.44.2ãreact-navigation 1.0.0-beta.11ã«ã¢ããã°ã¬ãŒãããåé¡ã®TabNavigatorã§ãlazy = trueããèšå®ãããšããããä¿®æ£ãããŸããã ããããlazy = trueãèšå®ããã ãã§ããŸãããã§ãããããç§ã¯ãã§ã«æŽæ°ããŠããŸããã
@jhalborg FlatListïŒremoveClippedSubViews = {false}ã®ãªã¹ãã®åé¡ãä¿®æ£ããŸããã
ç§ã¯react-navigationã䜿çšããŠãããremoveClippedSubViewsã¯æ¬¡ã®æ§é ã§æ©èœããŸãã
ã¢ãŒãã«ã¹ã¿ãã¯->çŸåšã®ã¿ãã¹ã¿ãã¯->ããã²ãŒã·ã§ã³ã¹ã¿ãã¯ãå«ãè€æ°ã®ã¿ããå«ãã
ç§ã®åé¡ã¯ããã©ãŒãã³ã¹ã®æ¬ åŠã ã£ãã®ã§ãç¶æ å€ã«åºã¥ããŠremoveClippedSubViewså€ãäœæããç»é¢ãèªã¿èŸŒãŸããŠãããã©ããã«å¿ããŠãªã³/ãªããåãæ¿ããããšãã§ããããã«ããŸããã
å¥ã®ã¿ãã§ãªããŒããããªã¹ããããã®ã§ã次ã®ãããªãã®ã䜿çšããŸãã
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ãã€ãŸãListViewè¡å
ã®ListViewã䜿çšããŠããã·ããªãªã§çºçããŸããã ç§ã®è§£æ±ºçã¯ããã¹ããããListViewã«removeClippedSubviews={false}
ãé©çšããããšã§ä¿®æ£ãããŸããã
react-native-cli: 2.0.1
react-native: 0.41.2
iOS9.xãå®è¡ããŠããiPad3 / iPadMiniãªã©ã®å€ãããŒããŠã§ã¢ã§ListView / FlatList / VirtualizedList / WindowedListViewïŒäœã§ãïŒã䜿çšããŠå€§ããªãªã¹ããã¹ã ãŒãºã«ã¹ã¯ããŒã«ããããšã¯äžå¯èœã§ãã
泚ïŒãã©ãããªã¹ãã«ã€ããŠè©±ããŠããã®ã§ãããç»åã¯ãªããè¡ã®ããã¹ãã³ã³ããŒãã³ãã®ã¿ã§ãã
誰ãã7000ã¬ã³ãŒãã®ããŒã¿ã»ãããšæ©èœäŸãå ±æããå¯èœæ§ããããŸããã¹ã¯ããŒã«ã¯ã¹ã ãŒãºã§éåããããšã¯ãããŸããããã¹ãŠã®å±æ§æ§æãè©ŠããŠã¿ãŠãã ãããéãæªãã§ãð¢
åæããŸãã-ã¡ã¢ãªç®¡çã®ããã«ãèŠããªãã»ã«ãã¯ãªã¢ããŠããŸãã å€ãã®ã¢ããªã§ãã®ãããªéèŠãªã³ã³ããŒãã³ããå€ãã®ãŠãŒã¹ã±ãŒã¹ã§ããã©ãŒãã³ã¹ã«æ¬ ããŠããã®ã¯æ®å¿µã§ãã æ¥é±ããããã§æ·±ãæãäžããŠãããã©ãŒãã³ã¹ãå€§å¹ ã«åäžãããã©ããã確èªããŸãã
2017幎6æ10æ¥ã«ã¯ãååŸ3:30 +1000ãã¢ãªãšã«Faldutoã®[email protected]ã¯ãæžããŸããïŒ
iOS9.xãå®è¡ããŠããiPad3 / iPadMiniãªã©ã®å€ãããŒããŠã§ã¢ã§ListView / FlatList / VirtualizedList / WindowedListViewïŒäœã§ãïŒã䜿çšããŠå€§ããªãªã¹ããã¹ã ãŒãºã«ã¹ã¯ããŒã«ããããšã¯äžå¯èœã§ãã
泚ïŒãã©ãããªã¹ãã«ã€ããŠè©±ããŠããã®ã§ãããç»åã¯ãªããè¡ã®ããã¹ãã³ã³ããŒãã³ãã®ã¿ã§ãã
誰ãã7000ã¬ã³ãŒãã®ããŒã¿ã»ãããšæ©èœäŸãå ±æããå¯èœæ§ããããŸããã¹ã¯ããŒã«ã¯ã¹ã ãŒãºã§éåããããšã¯ãããŸããããã¹ãŠã®å±æ§æ§æãè©ŠããŠã¿ãŠãã ãããéãæªãã§ãð¢
â
ããªããã³ã¡ã³ãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGitHubã§è¡šç€ºããããã¹ã¬ããããã¥ãŒãããŠãã ããã
çŽ æŽããã@lprhodes ãããã§ã¯ãæ倧200ã¬ã³ãŒãã®FlatListã䜿çšããç°¡åãªäœ¿çšäŸãå ±æããŸãããã®äŸã¯ãiOS9ãæèŒããiPad3ã§ã¯éåãéåãã§ãã
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);
ãŸãã¯expouri ïŒ
ããããšã ïŒïŒïŒ
ãµã³ãã«ã³ãŒãã«ã¯ãããã¥ã¡ã³ãã§å¯ŸåŠãããŠããå€ãã®æªãç¿æ £ããããŸãã ããšãã°ãé¢æ°ã絶ããåäœæããã³åãã€ã³ãããŠããå Žåãããã¯CPUã«è² æ ããããããªã¹ãã¢ã€ãã ã®äžèŠãªåã¬ã³ããªã³ã°ãçºçããŸãã ListItemã³ã³ããŒãã³ããPureComponentã§ããããšã確èªããæž¡ããããã¹ãŠã®å°éå ·ãæµ ããŸãŸã§ããããšã確èªããå¿ èŠããããŸããããã¯ãäžèŠãªåã¬ã³ããªã³ã°ãé²ãããã§ãã ã¢ããªã®æ®ãã®éšåã«ããå§ãããŸãã
ããã¯å€§ãã«åœ¹ç«ã€ã¯ãã§ãããé ãããã€ã¹ã§å®ç§ãªããã©ãŒãã³ã¹ãä¿èšŒããããšã¯ã§ããŸããã Webãã©ãŠã¶ã®ãããªä»ã®ã¢ããªã¯ãããã®ããã€ã¹ã§ã©ãã ãããŸãæ©èœããŸããïŒ
@outaTiMEãŸããåã¬ã³ããªã³ã°ã§loadFeedãåŒã³åºãã¹ãã§ã¯ãããŸãã
@lprhodesã¬ã³ããªã³ã°ã¡ãœããã¯1ã€ããå®è¡ããŸããããããã€ãã®ãã¹ããã©ã¯ãã£ã¹ã䜿çšããŠã³ãŒããæŽæ°ãã
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
ãã©ã°ããªããæ¬çªãã«ãã®æé©åã䜿çšãããšãreact- native0.44ã䜿çšããexpo17ã䜿çšããåã«èšã£ãããã«ãåäœã®éåããå°ãªããªããŸããæ°ããããŒãžã§ã³ã®react-nativeïŒ0.45 ïŒ FlatList
ãæ¹åãããŸããã
ãšããã§ããªãã¹ã¿ã€ã«ã¯ãã¹ãŠã®ã¬ã³ããªã³ã°ã§äœæãããã®ã§ããïŒ ãã®å ŽåãïŒ Feed
ã³ã³ããŒãã³ãå
ã®ïŒ flex
ã¹ã¿ã€ã«ã®ã¬ã³ããªã³ã°ã¯1åã ãå®è¡ãããŸãã
App
ã¬ã³ããªã³ã°Feed
ã¬ã³ããªã³ã°FeedRow
ã¬ã³ããªã³ã°@lprhodesã¯ç§ãããããšãç解ããããããã®ã¬ã³ããªã³ã°ã«loadFeedã«ã€ããŠç§ã«èšã£ãããšã«éåžžã«ãã䌌Feed
ã¬ã³ããªã³ã°ã¯1åã ãå®è¡ãããããã¯æ£ããã§ããããïŒ
initialScrollPosition
ãšèšããšãã¯ã initialScrollIndex
ããšã§ããïŒ scrollToOffset
ããã«ã¯æ©èœããŸããFeed
ããŠã³ãããããšãã«ListHeaderComponent
ïŒé«ã48pxïŒãé衚瀺ã«ããå¿
èŠããããŸã
ãã®ã³ã³ãœãŒã«ã®èŠåã¯ã©ãã§ããïŒ 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ã®ããã©ãŒãã³ã¹ãã°ãŒã°ã«ã§æ€çŽ¢ããããããåºãReactã³ãã¥ããã£ã§å©ããæ±ããããããªããããã«ã¯å€ãã®ãªãœãŒã¹ããããŸãã
ã¯ããç§ã¯initialScrollIndex
ãæå³ããŸããã ãããæ©èœããããã«ã¯getItemLayout
ãå®è£
ããå¿
èŠããããããã¯ListHeaderComponent
ãå ããã¯ãã§ãã
çŽ æŽããã@ sahrens ã iOS9ã®ãããªå€ãããŒããŠã§ã¢ãæãã§ã...æ°ããããã€ã¹ã§ãã¹ãããŠãããã©ãŒãã³ã¹ã®åé¡ã¯ãããŸãããä»ã®èª°ããåãããŒããŠã§ã¢ã®åé¡ãçµéšããŠãããã©ããç¥ããããšæããŸãã...ãã°ããã®éç§ã¯ã³ãã¥ããã£ã«ç§ããã£ãšæ·±ãäœãã«å°éãããã©ããèŠãããã«é Œãã§ããããthks !!!
ããã«ã¡ã¯ç§ã®ãã®ã¯ãã©ãããªã¹ãã«style={{ backgroundColor: 'white' }}
ãäžããããšã§ä¿®æ£ãããŸãã
ã§ã¯ã @ hramosãš@ sahrens ã 0.44.0
䜿çšããŠreact-native-tab-vew
ããããŠæ¬åœã«ã³ã¢ããŒã ã¯ããã®æç¹ã§æšå¥šããŠãããã®ãã¯ãªã¢ããŠããŸããã
@sjmuellerã¯@sahrensãããããã§ã«ãã¹ã¿ãŒã§ä¿®æ£ãããŠãããšèšã£ãŠããŸãã
@hramosãã®ã¹ã¬ããå šäœãããäžåºŠç¢ºèªããŸããã ç§ã¯ãããèŠéãããããããŸãããã@ sahrensãFlatListãé衚瀺ã«ãªãããšããã¹ã¿ãŒã§ä¿®æ£ãããŠãããšèšåããŠãããšããã¯ã©ãã«ã
@yaronleviãreact-native-tab-view
ãŸãã¯TabNavigator
ã«lazy={true}
ãèšå®ããããšãæšå¥šããŠããããšã¯ããããŸãããããã¯iPhone 7plusã§ãæ¥æ¿ãªé
延ãåŒãèµ·ãããŸãã
@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}
/>
)
}
FlatListã®removeClippedSubviewsãããã©ã«ãã§ãªãã«ãªããŸããã
é ãããã€ã¹ã®åé¡ã«ã€ããŠã¯ãRNTesterã¢ããªFlatListExampleãè©ŠããŸãããïŒ
FlatListExampleã¯ã©ã®ããã«æ©èœããŸããïŒ
FlatListã®removeClippedSubviewsãããã©ã«ãã§ãªãã«ãªããŸããã
ãã-ã ããç§ã¯å®éã«ã¹ã¯ããŒã«ãããšãã«ããããªã³ã«ããŸãã ããããã°ãã©ã³ãã ãªãžãã¿ãŒãå°ãªããªããŸãã
次ã«ãFlatListèªäœãããããã«è³ã«èãããã¡ã¢ãªãæžããããã«ãïŒã¯ããã«ïŒèŠããªãã»ã«ã空ã®ã»ã«ã«çœ®ãæããŸãã
ããã§ãæåŸã«ããããããã»ã©ããŒããªããã©ãŒãã³ã¹ãç ç²ã«ããŠãã removeClippedSubviews={false}
ã䜿çšãã代ããã«ãããä¿®æ£ããæ¹æ³ã¯ãŸã ãããŸãããïŒ
ç§ã®ä¿®æ£ã¯ãiOSã·ãã¥ã¬ãŒã¿ãŒã®jsã®ãããã°ããªã¢ãŒãã§ç¡å¹ã«ããããšã§ãã
lazy: true
èšå®ã¯ç§ã«ãšã£ãŠã¯ããŸããã£ãããã§ãã ãŸã ããã©ãŒãã³ã¹ããã¹ãããŠããŸããã
ç§ã¯ãã®åé¡ãremoveClippedSubViews={false}
æé«ã®ä»äº
ãã¹ãŠã®ããŒããŠã§ã¢/ã·ãã¥ã¬ãŒã¿ãŒã§åäœããŸãã removeClippedSubViews={false}
ã¯iPhone7ã§åžžã«æ©èœãããšã¯éããŸããã
ãªã¹ããã¥ãŒã§åŒ·å¶çã«ç§»åããŠãã ããã
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åpmã«ãããŒã¿ãŒSuwaraã®[email protected]ã¯æžããŸããïŒ
åé¿ç
ãã¹ãŠã®ããŒããŠã§ã¢/ã·ãã¥ã¬ãŒã¿ãŒã§åäœããŸãã'' 'componentDidMountïŒïŒ{
requestAnimationFrameïŒïŒïŒ=> {
//ããŒã¿ããªããŒãããããã®ããã¯
this.refs._list.scrollToïŒ{xïŒ1ãyïŒ0ãanimatedïŒfalse}ïŒ
}ïŒ;
} '' ''' '
ref = "_ list"
dataSource = {this.state.dataSource}
renderRow = {ïŒdataãsectionIdãrowIdïŒ=>}
renderSeparator = {ïŒsectionIdãrowIdïŒ=>}
removeClippedSubViews = {false}
initialListSize = {SortedBrandList.count}
/> '' 'â
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGitHubã§è¡šç€ºããããã¹ã¬ããããã¥ãŒãããŠãã ããã
ç§ã¯ãã®åé¡ããå°ãªããšãã·ãã¥ã¬ãŒã¿ãŒã§ã次ã®æ¹æ³ã§è§£æ±ºããŸããã
<ListView removeClippedSubViews={false} .... />
ããã§ã®ç§ã®æšæž¬ã§ã¯ãListViewãçŸåšç»é¢ã«è¡šç€ºãããŠããªãå ŽåãclippedSubviewsã管çããã«ãŒãã³ã¯å¢çãé©åã«ãã§ãã¯ããŠããŸããã ããã¯ãç»é¢å€ã«ã¬ã³ããªã³ã°ããŠããç»é¢äžã«ç§»åããListViewã³ã³ããŒãã³ãã§ããçºçããŸãã ããã¯ãä¿®æ£ããã®ã«ããã»ã©é£ãããã°ã§ã¯ãªãã¯ãã§ãã
ãã®é¢æ°ãåé¡ã§ãããšç¢ºä¿¡ããŠããŸãïŒ https ïŒ
ç§ã®æšæž¬ã§ã¯ãããã枬å®ããŠãã座æšç©ºéã¯ã©ããã§ééã£ãŠããŸãã ä»ãããèŠãŠãã ããã
ããã¯ä¿®æ£ãããããŸãããïŒ https://github.com/facebook/react-native/pull/15669/files
ãŸã ããã«å¯Ÿããä¿®æ£ã¯ãããŸãããïŒ
@petersuwara ïŒããªããææ¡ããäœåã ããããšãããããŸããã @MattFoley ïŒä¿®æ£ã¯ãã€ããŠã³ããŒãã§ããããã«ãªããŸããïŒ
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ã®ã¿ãã«å²ãåœãŠãããŠããããçŸåšéžæãããŠããç»é¢ãªã©ããã§ã«ããŠã³ããããŠããã³ã³ããŒãã³ãã§çºçããŸãããã®ãããcomponentWillMountãä¿®æ£ããŠãããä¿®æ£ããæ¹æ³ãããããŸããã
äžèšã®ç§ã®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 ïŒ
æŽæ°ããã°ããã§ããã <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ã«åãæ¿ããããšã§ããã®åé¡ãä¿®æ£ããŸããã
8:39ã³ãªã³ã»ã©ã ãŒã€ã§éã2017幎11æ17æ¥ã«ã¯[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ã§ããŸã åé¡ããããŸãã ãããããäžåºŠéããŠãã ããã
å床ãè¿·æããããããŠç³ãèš³ãããŸããããåéããŠãããããã§ããïŒ ããã¯å·®ãè¿«ã£ãåé¡ã§ãã
ææ°ã®ExpoReact NativeSDKã䜿çšããŠããã«ééããŸããã ããã¯ãTabNavigatorã®3çªç®ã®ListViewã§ã®ã¿çºçããŸãã 2çªç®ãš3çªç®ãå ¥ãæ¿ãããšãæ°ãã3çªç®ã®ããŒãžã圱é¿ãåããŸãã ç§ã®å ŽåãremoveClippedSubviewsã¯ãããä¿®æ£ããŸããã
requestAnimationFrame(() => { this.listview.scrollTo({y: 1}); });
ã¯ç§ã®ããã«åããã
this.listView.scrollToEnd()
ããŠãæ©èœããªãã£ãããããªã¹ãã®æåŸã®åº§æšãæåã§èšç®ããŠã scrollTo()
æž¡ãå¿
èŠããããŸããã
ãã©ãããªã¹ãã®å Žåãããã¯åãé åãæŽæ°ããããšã«ãã£ãŠçºçããå¯èœæ§ããããŸãã 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ã¯ãããè¿ããŸãã ç§ã®æ€çŽ¢ããŒãžã«ã¯ãªã¹ããã¥ãŒãå«ãŸããŠããŠããã®ãã°ããããŸããã 3çªç®ã®ã¿ãã«ãããŸãã
<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>
æ€çŽ¢ããŒãžïŒãªã¹ããã¥ãŒãå«ãïŒã3çªç®ã®ã¿ããã2çªç®ã®ã¿ãã«å€æŽãããšããªã¹ããã¥ãŒã¯æ£åžžã«æ©èœããŸããã
ãã®ããã®å®çšçãªããã¯ãèŠã€ããŸããã
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ãå床éããŠãã ããã
ãã®ãããªåçŽãªé¢æ°ã§ãŸã åé¡ããããŸããïŒ ããããReactNativeããã¹ãã¬ãŒããã€ãã£ãã³ãŒãã«æ»ã£ãçç±ã§ãã
ç°¡åãªå Žåã¯ãæã貞ããŠä¿®æ£ããŠãã ãã@petersuwara
ãã®åé¡ã¯ãã°ããã®éã¯ããŒãºãããŠããŸãã ãããããªãã«åœ±é¿ãåãŒããŠããå Žåã¯ã_æ°ããåé¡ãéããŠ_ãå¯èœãªéã詳现ãæäŸããŠãã ããã ããã§å ±åãããå ã®åé¡ãä¿®æ£ãããããããã®åé¡ãããã¯ããŠããŸããåŸã§ã³ã¡ã³ãããå人ããŸã£ããåãåé¡ã«çŽé¢ããŠããããšã¯æããã§ã¯ãããŸããã
Facebookã§ã¯FlatList
_åºç¯å²ã«_䜿çšããŠããããã®çš®ã®èŠæ
ã¯ç€Ÿå
ã§è¡šé¢åããŠããªãã ãã®ã¿ã€ãã®åé¡ã¯ãããšãã°ç¹å®ã®ããã²ãŒã·ã§ã³ã©ã€ãã©ãªã§çºçããå¯èœæ§ããããŸãã åé¡ã«é¢ãã詳现æ
å ±ãšãåçŸããæé ã®æ確ãªãªã¹ãããŸãã¯çæ³çã«ã¯å°ããªãããžã§ã¯ãã§æ°ããåé¡ãéãããšã¯ãéåžžã«åœ¹ç«ã¡ãŸãã
æãåèã«ãªãã³ã¡ã³ã
0.17ã§ãåãåé¡ãçºçããŠããŸãããã
removeClippedSubviews
ç¡å¹ã«ãããšä¿®æ£ãããããã§ãã