æ¢åã®ãªã¹ãããã³ã°ãªããã³ã³ããŒãã³ãã«ã³ã¹ããè¿œå ãããªãããã«ããã«ã¯ãæ°ããããªã¢ã³ããäœæããŸãïŒäŸïŒ DynamicSizeList
ããã³DynamicSizeGrid
ïŒã ãã®ããªã¢ã³ãã¯ãã³ããããã§ãŒãºäžã«ãã®ã³ã³ãã³ããèªåçã«æž¬å®ããå¿
èŠããããŸãã
ããã®æåã®å®è£
ã¯ãreact-virtualizedã§CellMeasurer
ãã©ã®ããã«æ©èœããããšåæ§ã«æ©èœããå¯èœæ§ããããŸãã
äžèšã®3çªç®ã®å¶çŽãåé€ããŠãåã®ã¢ã€ãã ã枬å®ããã«ïŒã¢ã€ãã ã€ã³ããã¯ã¹ãŸãã¯ã¹ã¯ããŒã«ãªãã»ããã®ããããã«ããïŒã©ã³ãã ã¢ã¯ã»ã¹ãèš±å¯ãããšããã®ã³ã³ããŒãã³ãã®ããã©ãŒãã³ã¹ãåäžããå¯èœæ§ããããŸãã ããã«ããããã£ããã¢ããªã±ãŒã·ã§ã³ãªã©ã®ãŠãŒã¹ã±ãŒã¹ã§react-windowã®ããã©ãŒãã³ã¹ãå€§å¹ ã«åäžããŸãã
ããã«ããã ResizeObserverã䜿çšããŠïŒ react-measureãä»ããŠïŒã¢ã€ãã ã®ãµã€ãºãèªåçã«æ€åºããäœçœ®ãšæž¬å®å€ã®ãã£ãã·ã¥ãå®å šã«åé€ããæ©èœã®ããã¯ã解é€ãããŸãã ããã«ããããã£ãã·ã¥ããã枬å®å€ã匷å¶çã«ãªã»ããããå¿ èŠããªããªããAPIãåçã«æ¹åãããŸãã
äžèšãå¯èœã«ããããã«ãåçãªã¹ã/ã°ãªããã³ã³ããŒãã³ãã¯ããªãã»ãããã€ã³ããã¯ã¹ã«ããŸãã¯ãã®éã«ãããã³ã°ããããã«åçã«ç°ãªãã¢ãããŒãã䜿çšããå¿ èŠããããŸãã ïŒ react-virtualizedã®ãã¹ã¯ããŒã«ã¢ã³ã«ãŒãã«é¢ãããã®ã³ã¡ã³ãã«ã¯ãããã€ãã®åªããããžã¥ã¢ã«ããããŸããïŒåºæ¬çã«ã次ã®ãããªããšãè¡ãå¿ èŠããããŸãã
ã¢ã€ãã ã®æ°ã«estimatedItemSize
å°éå
·ãæãããã®ã«åºã¥ããŠãåèšãµã€ãºãèŠç©ãããŸãã ïŒä»¥äžã§èª¬æãããããã³ã°ã¯ãããŸãã§ã¯ãªãããããã®æšå®ãµã€ãºã調æŽããå¿
èŠã¯ãããŸãããïŒ
ã¹ã¯ããŒã«äœçœ®ãå€ãã£ãããæ°ãããªãã»ãããåã®ãªãã»ãããšæ¯èŒããŸãã ãã«ã¿ã[æªå®]ã®ãããå€ããã倧ããå Žåã¯ãæ°ãããªãã»ããããã¹ã¯ããŒã«ã¢ã³ã«ãŒããšããŠèšå®ããŸãã ãªãã»ãããæšå®ã€ã³ããã¯ã¹ã«ãããããŸãïŒããšãã°ããªãã»ãããæšå®ã¹ã¯ããŒã«å¯èœãµã€ãºã®åèšã§å²ãããããã³ã¬ã¯ã·ã§ã³å ã®ã¢ã€ãã æ°ã§ä¹ç®ããŸãïŒã ãã®ããããããã€ã³ããã¯ã¹ããã¢ã³ã«ãŒã€ã³ããã¯ã¹ããšããŠä¿åããŸãã ããšãã°ãäžã®ç»åã§èª¬æãããŠãããªã¹ãã«250åã®ã¢ã€ãã ãããå Žåããã¢ã³ã«ãŒã€ã³ããã¯ã¹ãã¯132ã«ãªããŸãã
äžèšã®ã¢ãããŒãã«ã¯ã倧ããªæ¬ ç¹ã1ã€ã ããããŸããããã¯ããªã¹ãã®å¢çã§ã¢ã€ãã ãæ£ããé 眮ããããšã§ãã ã¢ã€ãã ã®ã€ã³ããã¯ã¹ãïŒäžèšã®ããã«ïŒæšå®ãããå Žåãã¹ã¯ããŒã«å¯èœãªé åã®æåãŸãã¯æåŸãšæ£ç¢ºã«äžèŽããªãå¯èœæ§ããããŸãã
äžèšã®ã¢ãããŒãã§ã¯ãŸã æ£ããåŠçãããªã1ã€ã®ã±ãŒã¹ã¯ããã»ãŒããŸãŒã³ãã®å€åŽã«èšå®ãããŠããã¹ã¯ããŒã«ã¢ã³ã«ãŒã§ãããçŸåšã®ã¹ã¯ããŒã«ã¯ã»ãŒããŸãŒã³ã®å
åŽã«ãããŸãïŒä»¥äžãåç
§ïŒã ãŠãŒã¶ãŒããªã¹ãã®å
é ã«åãã£ãŠãã£ãããšã¹ã¯ããŒã«ããŠæ»ãå Žåãã¹ã¯ããŒã«ãžã£ã³ããŒãå°å
¥ããã«ãæåã®ã»ã«ããŒãã«æããããšãé£ããå ŽåããããŸãã
https://github.com/bvaughn/react-window/compare/master...issues/6ã§å ¥æå¯èœãªMVPã®é²è¡äžã®äœæ¥
ç§ã¯ãããmui-downshiftå
ã§äœ¿çšããçŸåšãUNSAFE_componentWillReceiveProps
䜿çšããŠããŸãããè¿ãå°æ¥ïŒåçã³ã³ãã³ãã®é«ããå©çšå¯èœã«ãªã£ããïŒ react-window
ã«ç§»æ€ããäºå®ã§ãã
ããã¯IOSã®UITableViewã§åå©çšå¯èœãªã¡ã«ããºã ã§ããïŒ
@luobodingããªãã®è³ªåãããããŸããã 詳ããæããŠããã ããŸããïŒ
@bvaughnç³ãèš³ãããŸããããç§ã®å人ãç§ã®è±èªã¯ããŸãäžæã§ã¯ãããŸããã
ç§ã®ãããžã§ã¯ãã«åé¡ããããŸããselectèŠçŽ ã«äœåãã®ãªãã·ã§ã³ããããŸããããŒãžã®ãªããŒãæã«éåžžã«é ããªããè©°ãŸããŸããç§ã¯ãããããè¯ãããããã«ã³ã³ããŒãã³ããæžã蟌ãããšããŸãããç§ã¯IOSéçºè ã§ãããç§ã¯ã§åå©çšå¯èœãªã¡ã«ããºã ãç¥ã£ãŠããŸãIOSã®UITableViewã500pxã®é«ãã®selectèŠçŽ ãå¿ èŠãªå Žåã¯ãoption-elementã®é«ãã100pxã«æ§æããã®ã§ãïŒMath.floorïŒ500/100ïŒïŒã®æ°ã®ãªãã·ã§ã³èŠçŽ ãšãã¥ãŒã®å®¹éïŒçŸåšè¡šç€ºãããŠããããŒã¿ãœãŒã¹ãã¥ãŒïŒãäœæããå¿ èŠããããŸãïŒãéžæããèŠçŽ ãäžäžã«ã¹ã¯ããŒã«ãããšãã¯ããã¥ãŒã«ããã·ã¥ãŸãã¯ãããããŠåã¬ã³ããªã³ã°ããŸãã
ãããžã§ã¯ãã«react-windowãã€ã³ããŒããããã®ã§ãããåè¿°ã®ããã«æ©èœããŸããïŒ
ããªãã説æããŠããã®ã¯ãreact-windowïŒããã³äžè¬çã«ã¯ãŠã£ã³ããŠåŠçãŸãã¯ãªã¯ã«ãŒãžã§ã³ã«ãªã³ã°ïŒãã©ã®ããã«æ©èœãããã§ãã ãã ãããã®åé¡ãšã¯å®éã«ã¯é¢ä¿ãããŸããã ããã¯ããŠã£ã³ããŠåãããã³ã³ãã³ãããžã£ã¹ãã€ã³ã¿ã€ã ã§æž¬å®ããããšã§ãã ããªãã®å Žåããªããžã§ã¯ãã®é«ãã¯åºå®ãããŠããããã FixedSizeList
ã³ã³ããŒãã³ãã䜿çšã§ããŸãïŒ https ïŒ//react-window.now.sh/#/examples/list/fixed -size
react-windowã§ãã€ãã£ãã«ã¢ãã¬ã¹æå®ãããã¢ã³ã«ãŒãèŠãã®ã¯ããããã§ãã
ã¡ãªã¿ã«ããã€ã¢ã°ã©ã ã§ããŒãå°ãäžãããããç³ãèš³ãããŸããâŠð
@bvaughnãã€ãã®æ©èœããªãªãŒã¹ããŸãããç§ã¯ãããæ¢ããŠããŸã
ä»ãããå®äºããæéïŒãšãšãã«ã®ãŒïŒãèŠã€ããã®ã«èŠåŽããŠããã®ã§ããã®æ©èœãªãã§1.0.0ãå ¬éããŸããã ãŸã å°æ¥çã«è¿œå ããäºå®ã§ãã ãã€ã®èŠç©ããã¯ãããŸããã
ããªããŒã®ãéã®ãªã¹ããã¯ãç§ãããã§ææ¡ããŠãããã®ãšåæ§ã®ææ³ã䜿çšããŠããããã§ãïŒ https ïŒ
ããã¯ç§ãã¡ã«ãšã£ãŠæ¬åœã«äŸ¿å©ã§ããä»ã®ãšãããCSSããä»®æ³ãªã¹ãã«æž¡ãããã ãã«é«ãã®èšç®ãè€è£œããã³ã³ããŒãã³ãããžãã¯ãšåæãããå¿ èŠãããããã§ãã
@kevinderã¯ããžã£ã¹ãã€ã³ã¿ã€ã ã§æž¬å®ãããã³ã³ãã³ãã«ã©ã®ããã«å¯ŸåŠããŠããããå ±æã§ããŸããïŒ åãã£ãŠæè¬ããŸã
@carlosagsmendesã¯ããã圹ç«ã€ãã©ãã
1.ïŒã³ã³ã¹ãã©ã¯ã¿ãŒã§ããªã¹ããšChatHistory
ã³ã³ããŒãã³ãã®åç
§ãäœæããŸãã
constructor(props) {
super(props);
this.listRef = createRef();
this.chatHistoryRef = createRef();
this.listHeight = 0;
}
次ã«ããªã¹ãã®ã¬ã³ããªã³ã°ãæ
åœããChatHistory
ãæž¡ããŸãã
2.ïŒèŠªã³ã³ããŒãã³ãã®componentDidMount
ã§ã ChatHistory
refã䜿çšããŠèŠçŽ ã®é«ããååŸããŸãã
componentDidMount() {
this.listHeight = this.chatHistoryRef.current.offsetHeight;
}
3.ïŒèŠªã³ã³ããŒãã³ãã§ã¯ãé åããã£ããå±¥æŽã®è©³çŽ°ãå«ãç¶æ ã«ç¶æããŸãã ãã®é åã«æ°ããã¢ã€ãã ãè¿œå ãããšããç§ã¯æ¬¡ã®ããã«ããŸãã
// 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 ïŒCode SandboxïŒãŸãã¯åæ§ã®ãã®ïŒã®ããã«ãç§ããã§ãã¯
@bvaughn確ãã«ãã³ãŒãã®é¢é£éšåãhttps://codesandbox.io/s/5z282z7q1lã«æœåºããŸãã
å ±æããŠãããŠããããšãïŒ ð
é²è¡äžã®ããã€ãã®äœæ¥ããé 延枬å®ãããã³ã³ãã³ãã«é¢ããæåã®ã¢ãããŒãã«ãissue / 6ãšããååã®ãã©ã³ãã«ããã·ã¥ããŸããã
ãã¢ãå±éããŸããïŒ
https://react-window-next.now.sh/#/examples/list/dynamic -size
ãšãŠããã£ãããã
issue / 6ãã©ã³ãã®ãœãŒã¹ãšãã®ãã£ã¹ã«ãã·ã§ã³ãèªã¿ãªãããç¡éã¹ã¯ããŒã«ã«é¢ããäžè¬çãªåé¡ãç解ããããšããŠããŸãã ãããã£ãŠã質åã«ç¶ã質åã¯æå³ããªããªããããããŸãããããããããã«ç解ãããã®ã§ãããã§èª¬æããŸãã
äžèšã®ãã¹ã¯ããŒã«ã¢ã³ã«ãŒããžã®èšåã¯ããªã³ã¯ãããèšäºãCSSã¹ã¯ããŒã«ã¢ã³ã«ãŒä»æ§ã®ãããªææ³ãšããŠã®ã¹ã¯ããŒã«ã¢ã³ã«ãŒã«é¢é£ããŠã
åãã£ãŠæè¬ããŸã
ããã¯ãæåã®ãªã³ã¯ã«æ¥ç·æ¹åã«é¢é£ããŠããŸããã2çªç®ã®ãªã³ã¯ã«ã¯é¢é£ããŠããŸããã ããã¯ãä»ã®ä»æ§ãææ¡ã«é¢é£ããŠããã®ã§ã¯ãªããç§ã«ãšã£ãŠæå³ããããšããçç±ã§ããã®åé¡ã«äœ¿çšããããšãéžæããçšèªã§ãã
ãŸããreact-windowã®ãã¬ãªãªãŒã¹ããŒãžã§ã³ãã次ãžããšããŠNPMã«å
¬éããŸããïŒäŸïŒ yarn add react-window@next
ïŒã
ãã®ã³ãŒããµã³ãããã¯ã¹ããã©ãŒã¯ããããšã§ããããè©Šãããšãã§ããŸãã
https://codesandbox.io/s/5x8vlm0o7n
ç§ã¯ããããã¹ãããŸããã ç§ã¯10000段èœãè©ŠããæåŸãŸã§ãžã£ã³ãããããšããŸããã ãããããããã
ç§ãæ£ããç解ããŠããã°ãããã¯æåŸã«ãããšæšå®ãããè¡ã ãã枬å®ããã¯ãã ã£ãã®ã§ãããã¯å³åº§ã«æåŸãŸã§ãžã£ã³ãããã¯ãã§ããã ããã¯æ£ããã§ãïŒ
2018幎10æ12æ¥ã«ã¯ãåå12æ53åã§ããã©ã€ã¢ã³ã»ãŽã©ãŒã³ã®[email protected]ã¯æžããŸããïŒ
ãŸããreact-windowã®ãã¬ãªãªãŒã¹ããŒãžã§ã³ããnextããšããŠNPMã«å ¬éããŸããïŒäŸïŒ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 ã
ããããããã·ã¥ããæåã®ãã©ã³ãã¯ã¢ã«ãŽãªãºã ãå®è£
ããŠããŸãã
ãã®å·ã§èª¬æãããŠããŸãã ããã¯å¿
èŠãªããçŽ æŽãªã¢ãããŒããåããŸã
åŸã®ã³ã³ãã³ããã¬ã³ããªã³ã°ããåã«ãåã®ã³ã³ãã³ãã枬å®ããŸãã
æ··ä¹±ãããŠç³ãèš³ãããŸããïŒ
éã2018幎10æ12æ¥ã«ã¯ãåå6æ34åPM akraines [email protected]ã¯æžããŸããïŒ
ç§ã¯ããããã¹ãããŸããã ç§ã¯10000段èœãè©Šããã«ãžã£ã³ãããããšããŸãã
çµããã ãããããããã
ç§ãæ£ããç解ããŠããã°ãæšå®ãããè¡ã®ã¿ã枬å®ããå¿ èŠããããŸãã
æåŸã«ãªããããããã¯å³åº§ã«ã«ãžã£ã³ãããå¿ èŠããããŸã
çµããã ããã¯æ£ããã§ãïŒ2018幎10æ12æ¥ã«ã¯ãåå12æ53åã§ããã©ã€ã¢ã³ã»ãŽã©ãŒã³ã®[email protected]ã¯æžããŸããïŒ
ãŸããreact-windowã®ãã¬ãªãªãŒã¹ããŒãžã§ã³ãNPMã«å ¬éããŸããã
ã次ãžãïŒäŸïŒ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
ã«ç§»è¡ããããšããå§ãããŸããïŒ ãããšããå
¬åŒãªãªãŒã¹ãåŸ
ã€å¿
èŠããããŸããïŒ
ãŸãããã®æ©èœã®å®æã«è²¢ç®ã§ããæ¹æ³ãããã°ããæäŒãããããšæããŸãð
æ®å¿µãªãããç§ã¯å€ãã®ãã¹ããè¡ã£ãŠãããããã¹ããè¡ããšãã«ã©ã®ãããªçš®é¡ã®åé¡ãçºçãããïŒãŸãã¯ä¿®æ£ã«ãããæéïŒãããããªããããçŸæç¹ã§ã¯ãªãªãŒã¹ã¿ã€ã ã©ã€ã³ã«ã³ãããã§ããŸããããããïŒã
è²¢ç®ãããå Žåã¯ãã¢ã«ãã¡ãªãªãŒã¹ããã¹ãããŠããããã©ã®çšåºŠããŸãæ©èœããŠãããããã°ãèŠã€ãããç§ã«ç¥ãããŠãã ããã
ç§ã¯ããããããã«ãã£ãšããã«çŠç¹ãåãããã§ãããããããç§ã¯ã©ããããæ©ãèšãããšãã§ããŸããã ç¹ã«æ¬¡ã®1ã2é±éã¯ãReact confã«æ°ãåããã16.6ãªãªãŒã¹ã®æºåãã§ããŠããŸãã
@bvaughnçŽ æŽãããä»äºðæåŸã«éãã§ã¿ãæéããããŸãã ð¹
display: none
ãªã¹ããé衚瀺ã«ããå Žåãããã€ãã®èª¿æŽãå¿
èŠãªããã§ããããšãã°ã2ã€ã®ã¿ããããããŒãžããããçŸåšã®ç¶æ
ïŒã¹ã¯ããŒã«äœçœ®ãªã©ïŒã倱ãããšãªãããããåãæ¿ãããå Žåãããã¯çãã䜿çšäŸã§ã¯ãããŸããã ã
åé¡ãæ瀺ããåçŽãªã³ãŒããµã³ãããã¯ã¹ïŒ
https://codesandbox.io/s/p7vq18wmjq
ããã¯ãdisplay noneãããªã¬ãŒãããšããã¹ãŠã®åãoffsetHeight === 0
ãæã€ããã«çºçããŸãã
ãµã€ãºå€æŽã¯ãããã¯ã€ã³ãšæŽæ°ãããæ°ããå€ãç£èŠããŸãã react-window
ã¯ãåŒã³åºãå
ãé衚瀺ã«ããããšã決å®ããå Žåããã®ç¶æ³ãæ°ã«ããå¿
èŠã¯ãããŸãããbasicã¯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}
ãã®ãã©ã³ãã«æŽæ°ãããã·ã¥ãïŒãããŠæ°ãã@next
ã¿ã°ãNPMã«å
¬éãïŒãã¹ã¯ããŒã«ã®é²è¡äžã«ãµã€ãºå€æŽãããã¢ã€ãã ã説æããããã«margin-top
ã䜿çšããŠãFirefoxã®ã¹ã ãŒãºã¹ã¯ããŒã«ã®ãã°ãä¿®æ£ããŸããã æã£ãããè€éã§ãããä»ã®ãšãããããåŠçããããè¯ãæ¹æ³ãããããŸããã ïŒæ¥µç«¯ãªå Žåã«ã¯ãŸã ããã€ãã®ç²ããšããžããããããããªããšæãã®ã§ããã®ã¢ãããŒãã®ããã€ãã®ãã¹ããããã«è¡ãå¿
èŠããããŸããïŒ
äžèšã®ãã£ãŒãããã¯ã@ piecykã«æè¬ããŸãã ç§ã¯ãŸã ãããæãäžããæéããããŸããã§ããã ïŒããã¯ãçŸæç¹ã§ã¯ãŸã ç§ã«ãšã£ãŠã¯åãªãå¯æ¬¡çãªãããžã§ã¯ãã§ããïŒ
å°ãªããšãFirefoxã§ã¯scrollBy
ãåªå
ããŠãããŒãžã³ããã¯ãåé€ã§ããå¯èœæ§ãããããã§ãã ãã ããæåã«IEãšEdgeããã¹ãããå¿
èŠããããŸãã 圌ãã«ã¯ç¬èªã®èª²é¡ããããããããŸããã
ãã@bvaughnç§ã¯ç¥ã£ãŠããŸããçŽ æŽãããä»äºðããªããæéãèŠã€ããæ¹æ³ãããããŸããïŒ ð¥ããªããžã®ç§°è³ïŒ
ãããããªã¹ããdisplay noneã§é衚瀺ã«ãªã£ãŠããDOMèŠçŽ ã«ããå Žåã®åé¡ã«æ»ããŸããããåºæ¬çã«ãã©ãããŒã«é«ããå¹ ããããã©ããã確èªããå¿ èŠããããŸããããã§ãªãå Žåã¯ãã¬ã³ããªã³ã°ãéå§ããŸããïŒçŸåšã¯ã¬ã³ããªã³ã°ãè©Šã¿ãŸãïŒãªã¹ãå šäœïŒææ¥ãããä¿®æ£ããããšããŸãïŒäœããé ããŠãããŸãïŒ
ããã ããªãã説æããŠããåé¡ã®æ žå¿ãç解ããŠããŸãã ãã ããã€ã³ã¹ã¿ã³ã¹ã¡ãœããããªãŒããŒã©ã€ã/ã¢ã³ããŒãããããããšã§ãããã³ã°ãããšããã¢ã€ãã¢ã¯å«ããªã®ã§ãæåã«ããå°ãèããŠã¿ãããšæããŸãã
@nextããã±ãŒãžãå£ããŠããããã§ããïŒ
ããã質åãæ®ãã®ã«é©åãªå Žæã§ãããã©ããããããªãã®ã§ãç§ãééã£ãŠããå Žåã¯ãã¿ãŸããã ã€ãŸããèŠããã«ïŒ
DynamicSizeList
ãAutoResizer
ãšäžç·ã«äœ¿çšããŸããããäžè¬çã«ã¯ããŸãæ©èœããŸãã 称è³ïŒJSON.parseïŒJSON.stringifyïŒdataïŒïŒããã¯ã䜿çšããŠãå¥ã®åããªããžã§ã¯ããæäŸããããšã«ãããitemDataããªããŒãããããšããŸããã éããªã:-(
é«ãã®èšç®ãã¹ãçãããŸãã ãã®åé¡ãå æããããã®ã¢ã€ãã¢ã¯ãããŸããïŒ
ã³ãŒããµã³ãããã¯ã¹ã®äŸãæããŠããã ããŸããïŒ ãäºãã«å©ãåããããã«ã䌌ããããªããšãããå¿ èŠããããŸã
@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.
componentDidUpdate
scrollToItem(items.length-1)
ãåŒã³åºãããšããŠããŸã
ããã¯æå³ãããåäœã§ããïŒ
ãããå€åãã®ãããªãã®ã¯@piecykã§ããŸããããããããŸããð
ããã¯æå³ãããåäœã§ããïŒ
@xaviergmailã®ããã«ã¯
ã¡ãã£ãš@bvaughnç§ã¯ãã®åé¡ãè±ç·ãããã¹ããŒã¹é åã®å®è£ ããããšèšãããã£ãã®ã§ãã FlashãïŒ-1ïŒã§ããããšã¯ç¥ã£ãŠããŸãããFlexã®æåŸã®ããŒãžã§ã³ã«ã¯ãå®éã«ã¯éåžžã«åªããä»®æ³åã¬ã€ã¢ãŠããšã³ãžã³ããããŸãã... Flash :-)
LinearLayoutVectorã¯ãåäžæ¬¡å ã®ã¢ã€ãã ã€ã³ããã¯ã¹ãšãã¯ã»ã«äœçœ®ã®éããããã³ã°ããããã®ã¹ããŒã¹é åã§ãã 3ã€ã®åºæ¬çãªæäœã¯æ¬¡ã®ãšããã§ãã
interface LinearLayoutVector {
start: (index) => position;
end: (index) => position;
indexOf: (position) => index;
}
å
éšçã«ã¯ãã¢ã€ãã ã®äœçœ®ãæ ŒçŽããããã«2ã®çŽ¯ä¹ã§ãã±ãããå²ãåœãŠãŸãïŒç¹å®ã®çŽ¯ä¹ã¯ããã倧ããªãŸãã¯ããå°ããªã¢ã€ãã ãµã€ãºã«å¯Ÿå¿ããããã«èª¿æŽã§ããŸãïŒã ããã«ãããäžå®æéã®OïŒ1ïŒ index -> position
ã«ãã¯ã¢ãããããã³position -> index
ã«ãã¯ã¢ããã®å¹ççãªç·åœ¢ãããã¯ã¹ãã£ã³ãå¯èœã«ãªããŸãã ããã£ã³ã°ãã®ã£ãããããã©ã«ããµã€ãºãã©ã³ãã ã¢ã¯ã»ã¹ã®æ¿å
¥ãåé€ãæŽæ°ããµããŒãããŠããŸãã
çŽ6幎åãã¢ãã€ã«çšã®ä»®æ³åUIãããããè¡ã£ãŠãããšãã«ãJSã«
æ°é±éåã«åå¿ä»®æ³åããããã©ããCellSizeAndPositionManager
ã®å
éšãåãæ¿ããŸãããããã«ãããããã©ãŒãã³ã¹/ãã£ãã·ã¥ã®ç¡å¹åãããã€ã解決ãããŸããã ããŠã³ããŠããå Žåã¯ãæ°é±é以å
ã«åæ§ã®PRãreact-window
ã«éä¿¡ãããŠããã ããŸãã
ããã«ã¡ã¯@ trxcllntð
PRã®å
±æã«èå³ãããã°ããã²ã芧ãã ããã issues/6
ãã©ã³ãïŒWIP PRïŒ102ïŒã«å¯ŸããŠãããäœããããšæãã§ãããã
äžèŠãããšã linear-layout-vector
ã¯ãã¹ããè¡ââãããŠããªããã䜿çšé »åºŠãé«ãããããã«ã¯èŠããªãã®ã§ãæåã¯å°ãæ°ãé²ãŸãªãã§ãããããããã§ãèŠãŠãããããšæããŸãã ãŸããéå+çž®å°åãããåŸããã³ãã«ã«ã©ã®çšåºŠã®éã¿ãè¿œå ããããã確èªããããšæããŸãããããŸãå€ãã¯è¿œå ãããªããšæããŸãã ð
@bvaughnæ±ã
ã³ã¡ã³ãããåŸã移æ€ãããã¢ããã£ãããšãæãåºããŸããïŒ https ïŒ
@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ã察åŠããåé¡ãä¿®æ£ãããæåã¯ãã£ããã®ããã«ãäžçªäžããŸã§ã¹ã¯ããŒã«ããŸããïŒ åäœããªãäŸã®ã³ãŒããµã³ãããã¯ã¹ãäœæããŸããã ããã§ãªãå Žåãåé¿çã¯ãããŸããïŒ
ãã®åé¡ã«é¢ããã³ã¡ã³ãã¯ããã©ãã«ã·ã¥ãŒãã£ã³ã°ã§ã¯ãªããAPIã®è°è«ã«çŠç¹ãåœãŠããŸãŸã«ããŠãããŸãããã
質åãããããã«StackOverflowããå§ãããŸãã
ãã®APIã§resetAfterIndexãå ¬éããããšã¯å¯èœã§ããïŒ DynamicSizeListã«è¿œå ãç·šéãåé€ããŸããå°ãªããšãåéã§ãããã®ããã¯ããããé«ããä¿®æ£ããããã«åŒã³åºãã¡ãœããã«ãªããŸããã
@bvaughnã¯é±æ«ã«ãã¢ã³ã«ãŒã€ã³ããã¯ã¹ã䜿çšããŠã¢ã€ãã ãé 眮ãããªã¹ããã¹ã¯ããŒã«ããŠãŠãŒã¶ãŒã«è¡šç€ºãããŠãããã®ãæãããšããã¢ã€ãã¢ã§éãã§ããŸãã...ãããæ©èœããå¯èœæ§ããããšãã第äžå°è±¡ð ç°¡åã«ããããã«ããªã¹ãã¯ãªãŒããŒã¹ãã£ã³èŠçŽ ãªãã§ã¬ã³ããªã³ã°ãããŸãããã£ãã·ã¥ã®åäœãå€æŽããå¿ èŠããããŸãïŒãã®wipã§ã¯åžžã«ã¯ãªã¢ãããŸãïŒ...ã©ãæããŸããïŒ
pocã®å®è£
https://github.com/piecyk/react-window/pull/2/files
ããããã©ã³ãã®ãã«ããå®è¡ããã³ãŒããµã³ãããã¯ã¹ã§ã
https://codesandbox.io/s/4x1q1n6nn9
ãããšãChromeã®ããã«é«éã¹ã¯ããŒã«ããã®ã¢ãããŒãã䜿çšããŠããå ŽåãFirefoxã¯ã¬ã³ããªã³ã°ã«è¿œãã€ãããšãã§ããŸããð€·ââïž
ãã£ããããã¯ã¹ã¹ã¿ã€ã«ã®ã¢ããªã«èªåã¹ã¯ããŒã«ãè¿œå ããããšããŠããŸããããã®åé¡ãçºçããŠããŸãïŒ
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.
componentDidUpdate
scrollToItem(items.length-1)
ãåŒã³åºãããšããŠããŸãããã¯æå³ãããåäœã§ããïŒ
ã¡ãã£ãšé ãã§ãããç§ã¯ãã®åå¿ããã¯ã§ãã®åé¡ã解決ããããšããŠããŸãã
æåã®è§£æ±ºçã§ã¯ãããŸããããç§ã¯ãŸã ããã«åãçµãã§ããŸãã ãã¶ãããããããäžè¬çïŒãããŠåçŽïŒã«ããŠããã±ãŒãžãäœæããããã«åãããšãã§ããŸããïŒ
ãããçŸåšã©ã®ããã«æ©èœããŠãããã瀺ãGIFïŒ
https://cl.ly/87ca5ac94deb
ãã¶ãããã®ãã£ããã®ãããªæ¯ãèãã®è§£æ±ºçã«ã€ããŠè©±ãããã«ãæ°ããåé¡ãéãããšãã§ããŸããïŒ
ãããšãChromeã®ããã«é«éã¹ã¯ããŒã«ããã®ã¢ãããŒãã䜿çšããŠããå ŽåãFirefoxã¯ã¬ã³ããªã³ã°ã«è¿œãã€ãããšãã§ããŸãã
FirefoxNightlyããŒãžã§ã³68ã§åäœããããã§ãã
@bvaughn InfiniteLoaderããã³Autosizerã³ã³ããŒãã³ãã§DynamicSizeListã䜿çšããŠããã£ãŒããäœæããããšããŠããŸãã ç§ã¯ãããŸã§ã«èŠããã®ã奜ãã§ãããããç¶ããŠãã ãã:)
APIãšåäœã®èŠ³ç¹ããïŒ
FixedSizeListã®ããã«ãitemKeyã³ãŒã«ããã¯ã®2çªç®ã®åŒæ°ãšããŠããŒã¿ãªããžã§ã¯ããååŸã§ããŸããïŒ
ããŒã¿ãªããžã§ã¯ãããã£ã«ã¿ãªã³ã°/å€æŽããããšãã«ãå éšã³ã³ããã®é«ãããªã»ããã§ããŸããïŒ
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ã®ç§ã®todoãªã¹ãã¯ããªãæ£ç¢ºã ãšæããŸãã ãã¹ããè¡ã£ãŠãã¿ãŒã²ããã®ãã©ãŠã¶ã«é©ããŠãããšæããå Žåã¯ãæçš¿ãç¶ããŠãã ããã
ç§ãæçš¿ããŠãã ããïŒ
ã䜿ã£ãŠã¿ãŸããããä»ã®ãšããæåããŠããŸãããã
åäœããŸããããããã©ãŒãã³ã¹ã¯è¯ããããŸããã ãã¶ãç§ã®ã¢ã€ãã ã®ã¬ã³ããªã³ã°ã¯é«äŸ¡ãä»ã®ãã®ã§ãã
ã³ã³ããã®é«ãã100ïŒ ã®AutoSizerã䜿çšãããšãææ°ããŒãžã§ã³ã§åé¡ãçºçããå¯èœæ§ããããŸãã
ç·šéïŒ100vhãšcalcïŒïŒã䜿çšããŠåé¿çãèŠã€ããããšãã§ããŸãã
äœããå£ããå¯èœæ§ããããŸã
ææ§ãããŠå®è¡å¯èœã§ã¯ãããŸããã äºæ³ãããåäœãšäžç·ã«åçŸãå ±æããŸããïŒ
1.6.0-alpha.1ã®DynamicSizeListããããŸããŸãªãã£ã«ã¿ãŒãšããã€ãã®è€éãªã«ãŒããã¥ãŒã§äœ¿çšããŠããŸãã ããããç§ãã¡ã¯é«ããšå¹ ã§å ãå¿ èŠããããŸãã ããã¯ç§ã«ãšã£ãŠã¯ããŸããã£ãŠããŸãã
åãã¡ããããšã
ããã«ã¡ã¯ã DynamicSizeList
è©ŠããŠããŸããããã¹ãŠã®ã¢ã€ãã ãéãªãåã£ãŠã¬ã³ããªã³ã°ãããŠããŸãã ã¬ã³ããªã³ã°ãããã¢ã€ãã ã«styleå±æ§ãæž¡ããŸããã 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ç§ããããæã£ãŠããŸãããããã¥ã¡ã³ãã¯ããã«ã€ããŠèšåããŠããŸããããããªãã¯ããªãã®è¡ã³ã³ããŒãã³ããåç §ãåãåãããšããµããŒãããããã«ããå¿ èŠããããŸãïŒ
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
ã¯ãã確ãã«ã€ã³ã©ã€ã³é¢æ°ã®å Žåãããã¯ç§ãreact-windowã«ç§»è¡ããããšããéåžžã«å€ãã³ãŒãã§ãããããã§ããããæ¹åããã®ã«æéãããããŸããã§ããã
ãæèŠãããã ãããããšãããããŸãã ãã®ãµã³ãããã¯ã¹ã§èŠã€ãããã®ãæããŠãã ããã
Annnnndãµã³ãããã¯ã¹ãå®è¡ããåã«@brunolemosã¡ãã»ãŒãžã確èªããå¿
èŠããããŸããã
ããã¯æ¬ ããŠããã¹ãããã§ãããç§ã®åé¡ãä¿®æ£ããŸãããããããšãïŒ
å¥ã®åé¡ãçºçããŸããã@ bvaughnãåçŸã§ããããã«ãµã³ãããã¯ã¹ãæŽæ°ããŸãã
ããã§ãããèŠã€ããŠãã ããïŒ https ïŒ
ããã§ãªã¹ãã¯æ£åžžã«æ©èœããŸãããå¥åŠãªããšã«ãã³ã³ãã³ããšãšãã«å€§ãããªããäºåºŠãšçž®å°ããããšã¯ãããŸããã
æå³ïŒ
å¥ã®åé¡ãçºçããŸããã@ bvaughnãåçŸã§ããããã«ãµã³ãããã¯ã¹ãæŽæ°ããŸãã
ããã§ãããèŠã€ããŠãã ããïŒ https ïŒããã§ãªã¹ãã¯æ£åžžã«æ©èœããŸãããå¥åŠãªããšã«ãã³ã³ãã³ããšãšãã«å€§ãããªããäºåºŠãšçž®å°ããããšã¯ãããŸããã
æå³ïŒ
- 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ããã³ãŒããµã³ãããã¯ã¹ããã§ãã¯ããæéããããŸãããïŒ
ããã«ã¡ã¯ããã£ããã¢ããªã«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ã§ãããã¢ããªããŒãã¹ã¯ããŒã«ããŠã³æã«é衚瀺ã«ãªã£ãŠããåé¡ããã1ã€ãããŸãããããã¯çŸåšçºçããŠããŸããã解決çã¯äœã§ããããã
è¯ãäžæ¥ã ãã¢ãããžã§ã¯ãã§DinamycSizeListã䜿çšããŸããã ãã¹ãŠãé 調ã§ãããããã°ãããããšããªã¹ãã³ã³ããŒãã³ããæ£ããæ©èœããªããªã£ãããšã«æ°ã¥ããŸããã æåã¯ãreact-windowãäŸåããã©ã€ãã©ãªã ãšæããŸããã ããããããªãã®ãã¢ãèŠãŠãã ãã
https://react-window-next.now.sh/#/examples/list/dynamic -size
éå»ã«ã¯å®å
šã«æ©èœããŠããŸããããã»ãŒåãçµæã«æ°ã¥ããŸããã ãããã®ãã°ã®åå ãæããŠãã ããã
@simeonoff
ãããåºæ¬çã«å éšã³ã³ããã¯ããŒã¿ã®ãã£ã«ã¿ãªã³ã°/å€æŽæã«é«ãããªã»ããããå¿ èŠããããŸãã
ã©ãããã°ããã§ããç¶æ
ã®é«ããå
¥åããããšããŸããããæ©èœããªãããã§ã
解決çã¯ãããŸããïŒ
@simeonoff
ãããåºæ¬çã«å éšã³ã³ããã¯ããŒã¿ã®ãã£ã«ã¿ãªã³ã°/å€æŽæã«é«ãããªã»ããããå¿ èŠããããŸãã
ã©ãããã°ããã§ããç¶æ ã®é«ããå ¥åããããšããŸããããæ©èœããªãããã§ã
解決çã¯ãããŸããïŒ
ã©ã€ãã©ãªã«ãã£ãŠå éšçã«å®è£ ããå¿ èŠããããŸãã
@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ã³ãŒãã«ããªãã®æéãè²»ãããŠãå¶éãªãã§ã©ãã«ã§ãã¹ã¯ããŒã«ããæ¹æ³ãšã枬å®ããããã®ãšãããŠããªããã®ã«ã¹ã¯ããŒã«ããæ¹æ³ãç解ããããšããŠããŸãã
ç§ã¯ããã§ãªããšãããããããšãã§ããŸããhttps://github.com/bvaughn/react-window/compare/issues/6...Sauco82ïŒissues / 6 lastMeasuredIndex
ãåãé€ãã代ããã«itemIsMeasured
ã¢ã€ãã ããšã«ãã§ãã¯ããŸã
ç§ã¯ãªãŒãã³ãœãŒã¹ãããžã§ã¯ãã«åå ããããšãFlowã䜿çšããããšããªãã®ã§ãããã圹ç«ã€ããå«ãã䟡å€ããããã©ããããŸãPRãçŽæ¥è©Šãããããã§è°è«ããå¿ èŠããããã©ããã¯ããããããŸããã
åãã§ãæäŒããããŠããã ããŸãã®ã§ãäœãå¿ èŠãªå Žåã¯ãç¥ãããã ããã
ãããããã¯ã¯ããã«ç°¡åãªè§£æ±ºçã§ãïŒãµã€ãºãèšç®ããããã«ãŽãŒã¹ãèŠçŽ ãDOMã«è¿œå ããå¿
èŠã¯ãããŸããïŒïŒ
ã³ãŒããµã³ãããã¯ã¹
ãããããã¯ã¯ããã«ç°¡åãªè§£æ±ºçã§ãïŒãµã€ãºãèšç®ããããã«ãŽãŒã¹ãèŠçŽ ãDOMã«è¿œå ããå¿ èŠã¯ãããŸããïŒïŒ
ã³ãŒããµã³ãããã¯ã¹
é©ãã°ããïŒ ãããã«ã¯ã§ããã è¯ããã£ãã
@Kashkovskyã¯ãæŽæ°ãããå Žåã«ãµã€ãºãèšç®ããŸãã
ããã³itemSizeã¯1ååŒã³åºããŸã
@ 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 ïŒ
ãã®ãœãªã¥ãŒã·ã§ã³ã§ã¡ã¢åã䜿çšããŠã©ã®ããã«ã¢ãããŒãããŸããïŒ
ChatMessageãmemo
ã§areEqual
ã§ã©ããããããšããŸããããã¡ãã»ãŒãžããªã¹ãã«è¿œå ããããã³ã«Reactã¯åãªããžã§ã¯ããåã¬ã³ããªã³ã°ããŸãã
ç§ã®ä»ã®FixedSizedListsã§ã¯ãã¡ã¢åã¯ãã®memo / areEqualã©ãããŒã§æ£åžžã«æ©èœããŸããã ref={root}
ã圱é¿ããŠããå¯èœæ§ããããŸããïŒ
Reactãã³ã³ããŒãã³ããåã¬ã³ããªã³ã°ããŠãããã©ããã¯ã ãã ã®ããã¹ãã®ä»£ããã«ããã«ã
ç§ã¯ããã§äŸããã©ãŒã¯ããŸããïŒ https ïŒ
ç·šéïŒã¡ã¢åãä¿®æ£ããŸãã-æåã®æ©èœã³ã³ããŒãã³ããã¡ã¢ã§ã©ããããããšãæå³ããŠããŸã-ã§ã¯ãªã
ç·šé2ïŒè¡ã®æåã®ã¬ã³ããªã³ã°ã¯å®å
šã«åé¡ãªãããšãããããŸãããã resetAfterIndex
åŒã³åºãã¯ç®¡çãéåžžã«å°é£ã§ãã ããŒã¿ãå€æŽãããŸãïŒããšãã°ããŠãŒã¶ãŒãå¥ã®äŒè©±ãéžæããå ŽåïŒã ããããæ¬åœã®åé¡ã¯ãæ°ããsetSize
ãçµäºããåã«resetAfterIndex
ãå®è¡ãããŠããããã«èŠããããšã§ãã ãããã£ãŠããã£ãã·ã¥ãããã¹ã¿ã€ã«ã¯æ£åžžã«ã¯ãªã¢ãããŸããããã©ãŠã¶ãã³ã³ãã³ãã®ãµã€ãºå€æŽãå®äºããŠããªããããå€ãã¹ã¿ã€ã«ã®æ°ãããã£ãã·ã¥ãå床çæãããŸãã
ãããæžé¢ã§æå³ããããã©ããã¯ããããŸããããä»ã®ãšããããã«ãã³ãå ¥ããå¿ èŠããããŸãã 誰ããã³ã³ãã³ããåçã«å€æŽããæŽæ°ãããé«ãã¹ã¿ã€ã«ãç¶æããŠããå Žåã¯ãç¥ãããã ããã
ç§ã¯ä»ã«ãããããã®react-windowå®è£ ãæã£ãŠããã®ã§ããã®1ã€ã®ãŠãŒã¹ã±ãŒã¹ã«react-virtualizedã䜿çšããã®ã§ã¯ãªããããã§è¯ã解決çãèŠã€ããããšæããŸãã
ç·šé3ïŒç§ã¯ã€ãã«ã»ããšã¬ã¬ã³ããªè§£æ±ºçãæãã€ããã®ã§ããããç§ã®æåŸã®ç·šéã«ãªããŸãã
1.ïŒitemDataãå€æŽããå¿
èŠãããå ŽåïŒã€ãŸããäŒè©±ãå€æŽãããŠããå ŽåïŒãå
šäœãã¢ã³ããŠã³ãããŸã
2ãïŒ ChatContext
ä»ããŠ{sizeMap, setSize, listRef}
ãChatMessage
ã«æž¡ããŸããã ããããã°ãåã«ãµã€ãºãç²ç®çã«èšå®ãã代ããã«ãChatMessageã«ãµã€ãºãèšå®ããŠå€ããµã€ãºãšæ¯èŒããããã«æ瀺ã§ããŸãã å€ããµã€ãºãæ°ãããµã€ãºãšç°ãªãå Žåã¯ãåŒã³åºãresetAfterIndex
ã§å§ãŸãindex
ãšåã®ã¢ããããŒãã«trueãæž¡ããŸãã
ãããã£ãŠãç§ã®æ°ãã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}/>;
}
}
ãµãã¡ãªã«ã¯æ¬åœã«å¥åŠãªæ¯ãèããããããã§ãã
DynamicSizedListdivã®é«ããšè¡ã®é«ããŸãã¯margin-topãæ£ããæ©èœããªãã³ã³ãã³ãããªãŒããŒã©ãããå§ããŸãã
è¡ã®ãŠã£ã³ããŠå¹ /ã³ã³ãã³ããå€æŽãããŠããæ°ããé«ãã¯åèšç®ããããã³ã³ãã³ãã®æ°ããé«ãã§æ©èœããããã«å€æŽãããŸããã
ãããä¿®æ£ããŠããããã«èŠããã®ã¯ãã³ã³ãã³ããã¹ã¯ããŒã«å¯èœã§ãè¡ã衚瀺ãããªããªããã€ã³ããŸã§ã¹ã¯ããŒã«ãããããŸã§ã¹ã¯ããŒã«ããŠæ»ããšãæ£ããã¬ã³ããªã³ã°ãããå Žåã§ãã
æåã®ããŒãžã®èªã¿èŸŒã¿æã«ã³ã³ãã³ããæ£ããã¬ã³ããªã³ã°ãããªããããæŽæ°ããŠãåé¡ã解決ããªãããã§ãïŒ/
ChromeãFirefoxãªã©ã®ä»ã®ãã©ãŠã¶ã§ãåé¡ãªãåäœããŸãã Safariã¯çŽ æŽãããã§ãããæ®å¿µãªãããã¢ããªã¯ããã䜿çšãã人ã ã®ããã«åäœããå¿ èŠããããŸãã
ç§ã¯æ¬åœã«ããã€ãã®å©ãã䜿ãããšãã§ããŸããïŒ
@tastyqbitSafariãšInternetExplorerã§ãåãåé¡ãçºçããŸããã ããªããèšã£ãããã«ãå±éãããè¡ãéããŠã¹ã¯ããŒã«ããŠããåŸãã«ã¹ã¯ããŒã«ãããšãæ£ããã¬ã³ããªã³ã°ã§ããŸããããã¡ããããã¯å®éã«ã¯åé¡ã解決ããŸããã
åé¿çãèŠã€ããããç§ã«ç¥ãããŠãã ããïŒ
@afreix @tastyqbitSafariãšInternetExplorerã§ã®åé¡ã¯ããããã®ãã©ãŠã¶ãŒã§ã®ResizeObserverã®ãµããŒãã®æ¬ åŠãåå ã§ãããšç¢ºä¿¡ããŠããŸãã ç§ã¯ãŸãã«ããªãã®åé¡ãæ±ããŠããŠïŒã¹ã¯ããŒã«ããã¯ã§ä¿®æ£ããŸããïŒãããªãã£ã«ãè¿œå ããããšã§è§£æ±ºããŸããã äºææ§ããŒãã«ã«ã€ããŠã¯ã MDNãåç §ããŠãã ããã
ResizeObserverããªããšãã³ã³ãœãŒã«ã«èŠåã衚瀺ãããã¯ãã§ãã
ãã®https://codesandbox.io/s/agitated-jennings-o9nn6ã®ãããªãã®ã¯ã©ãã§ããïŒ
ïŒ102ã®VariableSizeList + ItemMeasurerã®åºæ¬çãªäœ¿çšããã¯éåžžã«åçŽãªã¢ãããŒãã§ãããäžæçãªè§£æ±ºçãšããŠã¯å°ãæ©èœããŠããããã§ãïŒããã»ã©æªãã¯ãããŸããðïŒð€
ç§ãã¡ã®ããŒã ã§ã¯ãã©ã³ãã ãªãµã€ãºã®ããã¹ãããŒã¿ã®å€§èŠæš¡ãªãªã¹ããã¬ã³ããªã³ã°ããå¿
èŠæ§ã«ééããŸããã
ç§ãã¡ã«ãšã£ãŠãã¢ã€ãã éãæ£ç¢ºã«ãžã£ã³ãããé
ããããšãªãã¹ã¯ããŒã«ããæ©èœã¯å¿
é ã§ããã
ããªãã®ãªã³ã©ã€ã³æ€çŽ¢ã®åŸãç§ã¯ãããããŠãã®ã©ã€ãã©ãªãæžã
ãããããªãã®äœäººãã®äžæçãªè§£æ±ºçãšããŠåœ¹ç«ã€ããšãé¡ã£ãŠããŸãïŒsmile_catïŒ
ããã
ããã€ãã®äœæ¥ã®åŸã§ãããæŽæ°ãããã£ãã®ã§ãããã©ã€ãã©ãªã¯ãŸãšããªç¶æ
ã«ãªããã¢ã€ãã ãåããŠã¬ã³ããªã³ã°ãããåŸã«ãµã€ãºãå€æŽãããªãå Žåã¯è¯ã解決çã«ãªããšæããŸãã
@ gnir-ãŠã£ã³ããŠã®ãµã€ãºãå€æŽãããã³ã³ããã®ãµã€ãºãå€æŽãããŠãªã¹ãã®ãµã€ãºãå€æŽãããå Žåã¯ã©ããªããŸããïŒ
ãã®ã¹ã¬ãããèªãã§ãå¹ ãå€ããå¯èœæ§ã®ããã¢ã€ãã ãåŠçããããã®ããè¯ãæ¹æ³ããããããããªããšæããŸãã
ããã§ã®ãå€æ°ãã®å®çŸ©ã¯ãã»ããå šäœã§å€æ°ã§ãã å®éã®ã¢ã€ãã ã®ãµã€ãºã¯éçã§ãããåçã§ã¯ãããŸããã ããã¹ããå€æŽãããå Žåããµã€ãºå€æŽãŸãã¯å€æŽäžã«ãµã€ãºãå€æŽãããå¯èœæ§ããããããããããåçãããé©åãªçšèªã§ãã
ãããæ©èœããæ¹æ³ã¯ã芪ã®ã¹ã¯ããŒã«ãèãããšã§ãã
ã¢ã«ãŽãªãºã ã¯æ¬¡ã®ããã«æ©èœããŸãã
åã¢ã€ãã ã®æšå®ãµã€ãºãèšç®ããŸã-ããã¯éåžžã«å¹ççã§ããå¿ èŠããããŸãã å®ç§ã§ããå¿ èŠã¯ãããŸããã + -20ïŒ ã§åé¡ãããŸããã
ãŠãŒã¶ãŒãã¹ã¯ããŒã«ããŠãå€æŽã衚瀺ãããªãããã«ã衚瀺ãããŠããã¢ã€ãã ã®ã¿ãã¬ã³ããªã³ã°ããããã«20ïŒ å€ãã¬ã³ããªã³ã°ããŸãã
ãé«ãããæšå®é«ãã«èšå®ãããŠããä»ã®ãã¹ãŠã®ããŽãŒã¹ããããããŸãã ããã¯ãã ã®ç©ºã®divã§ãã ãã®ããã«ããŠãã¹ã¯ããŒã«ããŒã¯ã»ãŒå³ã«èŠããŸãã
ã¢ã€ãã ã¯ããã¥ãŒããŒãã«ããå Žåã«ã®ã¿è¡šç€ºãããŸãã ãã以å€ã¯ãŽãŒã¹ãã¢ã€ãã ã衚瀺ãããŸãã
ããã®å¯äžã®æ¬ ç¹ã¯ãã¹ã¯ããŒã«ããŒã®é«ãããããã«å€åããããšã§ãã ããããŠãŒã¶ãŒã®æ°ãæ£ãããã©ããã¯ããããŸããã ã¹ã¯ããŒã«ãªã¹ãã倧ããå ŽåããããŸãã æšå®ãµã€ãºãã¹ã¯ããŒã«ããŒã®é·ãã«åœ±é¿ãäžããªãããã«ãããã¡ãå¢æžããããšã§ããããã ãŸãããšãã§ãããããããŸããã
@ gnir-ãŠã£ã³ããŠã®ãµã€ãºãå€æŽãããã³ã³ããã®ãµã€ãºãå€æŽãããŠãªã¹ãã®ãµã€ãºãå€æŽãããå Žåã¯ã©ããªããŸããïŒ
ææ°ããŒãžã§ã³ïŒ 2.2.0
ïŒã®æç¹ã§ãã³ã³ããŒãã³ãã¯ãªã¹ãå
šäœã®ãµã€ãºïŒé«ããšå¹
ïŒã®å€æŽããµããŒãããŠããŸãã
ãã®ã¹ã¬ãããèªãã§ãå¹ ãå€ããå¯èœæ§ã®ããã¢ã€ãã ãåŠçããããã®ããè¯ãæ¹æ³ããããããããªããšæããŸãã
ããã§ã®ãå€æ°ãã®å®çŸ©ã¯ãã»ããå šäœã§å€æ°ã§ãã å®éã®ã¢ã€ãã ã®ãµã€ãºã¯éçã§ãããåçã§ã¯ãããŸããã ããã¹ããå€æŽãããå Žåããµã€ãºå€æŽãŸãã¯å€æŽäžã«ãµã€ãºãå€æŽãããå¯èœæ§ããããããããããåçãããé©åãªçšèªã§ãã
ãããæ©èœããæ¹æ³ã¯ã芪ã®ã¹ã¯ããŒã«ãèãããšã§ãã
ã¢ã«ãŽãªãºã ã¯æ¬¡ã®ããã«æ©èœããŸãã
- åã¢ã€ãã ã®æšå®ãµã€ãºãèšç®ããŸã-ããã¯éåžžã«å¹ççã§ããå¿ èŠããããŸãã å®ç§ã§ããå¿ èŠã¯ãããŸããã + -20ïŒ ã§åé¡ãããŸããã
- ãŠãŒã¶ãŒãã¹ã¯ããŒã«ããŠãå€æŽã衚瀺ãããªãããã«ã衚瀺ãããŠããã¢ã€ãã ã®ã¿ãã¬ã³ããªã³ã°ããããã«20ïŒ å€ãã¬ã³ããªã³ã°ããŸãã
- ãé«ãããæšå®é«ãã«èšå®ãããŠããä»ã®ãã¹ãŠã®ããŽãŒã¹ããããããŸãã ããã¯ãã ã®ç©ºã®divã§ãã ãã®ããã«ããŠãã¹ã¯ããŒã«ããŒã¯ã»ãŒå³ã«èŠããŸãã
- ã¢ã€ãã ã¯ããã¥ãŒããŒãã«ããå Žåã«ã®ã¿è¡šç€ºãããŸãã ãã以å€ã¯ãŽãŒã¹ãã¢ã€ãã ã衚瀺ãããŸãã
ããã®å¯äžã®æ¬ ç¹ã¯ãã¹ã¯ããŒã«ããŒã®é«ãããããã«å€åããããšã§ãã ããããŠãŒã¶ãŒã®æ°ãæ£ãããã©ããã¯ããããŸããã ã¹ã¯ããŒã«ãªã¹ãã倧ããå ŽåããããŸãã æšå®ãµã€ãºãã¹ã¯ããŒã«ããŒã®é·ãã«åœ±é¿ãäžããªãããã«ãããã¡ãå¢æžããããšã§ããããã ãŸãããšãã§ãããããããŸããã
ããã¯ãã§ã«@bvaughnã«ãã£ãŠreact-virtualized
å®è£
ãããŠããŸãã ãã®ã¢ãããŒãã®äž»ãªæ¬ ç¹ã¯ãç¹å®ã®è¡ãžã®ãžã£ã³ããããŸãæ©èœãããäžã«ã¹ã¯ããŒã«ãããšèŠèŠçãªãã°ãçºçããããšã§ãã
@ gnir-work ah .. ok ...å€åãäœæ¥ãäžæ¢ããŠãreact-virtualizedãèŠãŠã¿ãŸãããã
ã¹ã¯ããŒã«ã¢ããã®åé¡ã¯æ£ãããšæããŸããããæšå®ãµã€ãºããèšå®ããŠãã³ã³ããŒãã³ããããŠã³ãããããå®éã®ãµã€ãºã«å€æããããšã§ããããä¿®æ£ã§ãããšæããŸãã
...ãããããã¡ããå¥ã®åé¡ã¯åçã³ã³ãã³ãã®åŠçã§ãã äœããæŽæ°ããããšãã³ã³ããŒãã³ãã®é«ããå€ãããŸãã
æšå®ãµã€ãºãæ©èœãããããæ£ç¢ºã§ããå Žåãããšãã°ãç§ã¯ãã°ããåã«ãreact-virtualizedã䜿çšããŠåçãªé«ãã®ä»®æ³åãªã¹ããå®è£ ããæšå®ãµã€ãºãæ£ç¢ºã§ããéãããŸãæ©èœããŸããã ããããªããšãè¡ã«ã¹ã¯ããŒã«ããæ©èœãã¢ããªãå£ããŠããŸããŸãâ¹
Mail for Windows10ããéä¿¡
å·®åºäººïŒã±ãã³ããŒãã³
éä¿¡ïŒ2020幎4æ14æ¥ç«ææ¥23:07
å®å
ïŒbvaughn / react-window
CcïŒNir Geller; èšåãã
件åïŒReïŒ[bvaughn / react-window]ãžã£ã¹ãã€ã³ã¿ã€ã 枬å®ã³ã³ãã³ãããµããŒãïŒïŒ6ïŒ
@ gnir-work ah .. ok ...å€åãäœæ¥ãäžæ¢ããŠãreact-virtualizedãèŠãŠã¿ãŸãããã
ã¹ã¯ããŒã«ã¢ããã®åé¡ã¯æ£ãããšæããŸããããæšå®ãµã€ãºããèšå®ããŠãã³ã³ããŒãã³ããããŠã³ãããããå®éã®ãµã€ãºã«å€æããããšã§ããããä¿®æ£ã§ãããšæããŸãã
...ãããããã¡ããå¥ã®åé¡ã¯åçã³ã³ãã³ãã®åŠçã§ãã äœããæŽæ°ããããšãã³ã³ããŒãã³ãã®é«ããå€ãããŸãã
â
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGitHubã§è¡šç€ºããããç»é²ã解é€ããŠãã ããã
-
ãã®ã¡ãŒã«ã¯ãã¢ãã¹ãã¢ã³ããŠã€ã«ã¹ãœãããŠã§ã¢ã«ãã£ãŠãŠã€ã«ã¹ããã§ãã¯ãããŠããŸãã
https://www.avast.com/antivirus
@ gnir-ä»äºãã...ç§ã¯ãè¡ã«ã¹ã¯ããŒã«ãæ©èœã¯å¿ èŠãªããšæããŸã..å€åç§ã¯ééã£ãŠããŸããã
ããã¯ããªãã®ããŒãºã«ååãªã¯ãã§ãð
Mail for Windows10ããéä¿¡
å·®åºäººïŒã±ãã³ããŒãã³
éä¿¡ïŒ2020幎4æ14æ¥ç«ææ¥23:13
å®å
ïŒbvaughn / react-window
CcïŒNir Geller; èšåãã
件åïŒReïŒ[bvaughn / react-window]ãžã£ã¹ãã€ã³ã¿ã€ã 枬å®ã³ã³ãã³ãããµããŒãïŒïŒ6ïŒ
@ gnir-ä»äºãã...ç§ã¯ãè¡ã«ã¹ã¯ããŒã«ãæ©èœã¯å¿
èŠãªããšæããŸã..å€åç§ã¯ééã£ãŠããŸããã
â
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGitHubã§è¡šç€ºããããç»é²ã解é€ããŠãã ããã
-
ãã®ã¡ãŒã«ã¯ãã¢ãã¹ãã¢ã³ããŠã€ã«ã¹ãœãããŠã§ã¢ã«ãã£ãŠãŠã€ã«ã¹ããã§ãã¯ãããŠããŸãã
https://www.avast.com/antivirus
次ã®å Žåã®åé¿çãšããŠïŒ
ã³ã³ããŒãã³ãå šäœãã¬ã³ããªã³ã°ãã代ããã«ã CanvasRenderingContext2D.measureTextïŒïŒã䜿çšããŠè¡ã®é«ããèšç®ã§ããŸãïŒpoopïŒ
@bvaughn npmã§æ°ããã¢ã«ãã¡çãå
¬éããäºå®ã¯ãããŸããïŒ 1.6.0-alpha.1
以éãæŽæ°ã¯ãããŸããð
@bvaughnæŽæ°ã¯ãããŸããïŒ æè¿ã®ããŒãžã§ã³ã§ä¿®æ£ãããŸããïŒ
TypescriptãDynamicSizeList
䜿çšãããå Žåã¯ãã¢ãžã¥ãŒã«ã®æ¡åŒµã«ããã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
æåã«ã€ã³ã¹ããŒã«ããå¿
èŠããããŸãã
typedefãããããšããä»ããè¿œå ããŸãïŒ ç§ã¯1幎以äžprodã§DynamicSizeListã䜿çšããŠããŸãã çŸåšããã®ãã©ãŒã¯ã«åºã¥ããŠããŸãïŒ "@john-osullivan/react-window-dynamic-fork": "^1.9.0-alpha.1"
ïŒããã¯ãŸã ææ°ã®ãã®ã§ããïŒïŒã ãããå®éã«ãªãªãŒã¹ããããã©ãã/ãã€ãªãªãŒã¹ããããã«ã€ããŠã®äžç¢ºå®æ§ã®ããã«ãç§ã¯react-virtuoso
ã«åãæ¿ããããšããŸããã ããããããã©ãŒãã³ã¹ãäœäžããããã§ã¹ã¿ãã¯ããŠããããšãããããŸããã
@bvaughnã¯ãŸã ã«ãŠãã¹ãèè£
ãããããnpmã«ãªãªãŒã¹ããæã§ããïŒ æºåãã§ããŠããªãããšããŸã å¿é
ãªå Žåã¯ãååãExperimentalDynamicSizeList
å€æŽããã ããããããŸããã
ããã«ã¡ã¯ã¿ããªïŒ ããªãã®åªåãšãã®çŽ æŽãããå³æžé€šã«æè¬ããŸãã ãã®æ©èœãæ¬åœã«æ¥œãã¿ã«ããŠããŸãïŒ ãã ãããã®åé¡ã«é¢ããæ å ±ãREADMEããã³ããã¥ã¡ã³ã/äŸã«è¿œå ããããšããå§ãããŸãã åçã³ã³ãã³ããå®éã«ã¯ã©ã€ãã©ãªã§ãµããŒããããŠããããåºå®/æ¢ç¥ã®ãµã€ãºã®ã¢ã€ãã ã«ã®ã¿åœ¹ç«ã€ããšãç解ããã®ã«ããªãã®æéãããããŸããã READMEã«ã¯ããããè¿œå ã§ãããã°ãããFAQã»ã¯ã·ã§ã³ããããšæããŸãã
ããŒãã«/ã°ãªãã/ããªãŒãæ¢ããŠããå Žåãããã¯VariableSizeGrid
äžã«æ§ç¯ãããhttps://autodesk.github.io/react-base-table/examples/dynamic-row-heightsããå§ããã®ãè¯ãã§ãããã
@ tony-scio 1.6.0-alpha.1ã®DynamicSizeListãInfiniteLoaderã§äœ¿çšããããã®å®çšçãªã³ãŒããµã³ãããã¯ã¹ãå ±æããŠããã ããŸããïŒ ããããšããæ¬åœã«ãããããã§ãã
誰ãããããreact-beautiful-dndã§åäœãããããã«ãªããŸãããïŒ ãã©ãã°ãããšãã¢ã€ãã ãäºãã«ãžã£ã³ãããããã«èŠããŸãã
誰ãããããreact-beautiful-dndã§åäœãããããã«ãªããŸãããïŒ ãã©ãã°ãããšãã¢ã€ãã ãäºãã«ãžã£ã³ãããããã«èŠããŸãã
ç§ããã®çããåŸ ã¡ãŸãïŒD
[å©ããŠ]
ãã®ãªã³ã¯ã«è¡šç€ºããã³ãŒãã¯ãããŸããïŒ
dynamic-size-list-vertical
ãããŠç§ã¯ãã®èœåãå¿
èŠã§ãã
ããããšã
[å©ããŠ]
ãã®ãªã³ã¯ã«è¡šç€ºããã³ãŒãã¯ãããŸããïŒ
dynamic-size-list-vertical
ãããŠç§ã¯ãã®èœåãå¿ èŠã§ãã
ããããšã
https://react-window-next.now.sh/#/examples/list/dynamic -size
ããã«é¢ããæŽæ°ã¯ãããŸããïŒ ã§ããéã䌌ããããªãã®ãå¿
èŠã§ãïŒéåžžã¯éåžžã«å°ãªãã§ãããå Žåã«ãã£ãŠã¯å€ããªãå¯èœæ§ããããŸãïŒãã¢ã€ãã ã®å€§ããªã¬ã¹ãã³ã·ãã°ãªãããªã¹ããã¬ã³ããªã³ã°ããŸãïŒã¢ã€ãã ã®é«ãã¯åçã§ãããã¢ãã€ã«ã§ã¯ããŸããŸãªããã¹ãã®æãè¿ããªã©ã«ãã£ãŠå€åããŸãïŒã react-window
ããã®ãŠãŒã¹ã±ãŒã¹ãåŠçã§ããã°ãã²ãŒã ãã§ã³ãžã£ãŒã«ãªããšæããŸãã ããã§ãªãå Žåãä¿¡é Œã§ãã代æ¿æ段ã¯ãããŸããïŒ
ããã«é¢ããæŽæ°ã¯ãããŸããïŒ ã§ããéã䌌ããããªãã®ãå¿ èŠã§ãïŒéåžžã¯éåžžã«å°ãªãã§ãããå Žåã«ãã£ãŠã¯å€ããªãå¯èœæ§ããããŸãïŒãã¢ã€ãã ã®å€§ããªã¬ã¹ãã³ã·ãã°ãªãããªã¹ããã¬ã³ããªã³ã°ããŸãïŒã¢ã€ãã ã®é«ãã¯åçã§ãããã¢ãã€ã«ã§ã¯ããŸããŸãªããã¹ãã®æãè¿ããªã©ã«ãã£ãŠå€åããŸãïŒã
react-window
ããã®ãŠãŒã¹ã±ãŒã¹ãåŠçã§ããã°ãã²ãŒã ãã§ã³ãžã£ãŒã«ãªããšæããŸãã ããã§ãªãå Žåãä¿¡é Œã§ãã代æ¿æ段ã¯ãããŸããïŒ
@JavaJamieã¯ãç¹ã«ä»£æ¿æ¡ãæ±ããããã§ã-virtuosoã©ã€ãã©ãªã«ã¯ãåçã³ã³ãã³ãã枬å®ããããã®ãµããŒããçµã¿èŸŒãŸããŠããŸãã å 責äºé ïŒç§ã¯ããã®äœè ã§ãã
@JavaJamieã¯ãç¹ã«ä»£æ¿æ¡ãæ±ããããã§ã-virtuosoã©ã€ãã©ãªã«ã¯ãåçã³ã³ãã³ãã枬å®ããããã®ãµããŒããçµã¿èŸŒãŸããŠããŸãã å 責äºé ïŒç§ã¯ããã®äœè ã§ãã
react-virtuosoãreact-windowã®2åã®ãµã€ãºã§ãã äŸåé¢ä¿ã®ãµã€ãºãåžžã«å¿µé ã«çœ®ãå¿ èŠããããŸãã
https://bundlephobia.com/[email protected]
https://bundlephobia.com/[email protected]
ç§ã«ã¯ãã®åªåãçµããæéããšãã«ã®ãŒããªããšããäºå®ãåãå
¥ããŸããã 誰ããç§ãå§ãããã©ã³ãã«è¶³ãèžã¿å
¥ããŠçµäºãããã®ã§ããã°ãç§ã¯ããªãã®å©ããæè¿ããŸãã ïŒãããæ°ããList
ããã³Grid
ã³ã³ããŒãã³ããšããŠããŒãžã§ã³2ãªãªãŒã¹ã«ã©ã®ããã«é©åãããã«ã€ããŠã¯ãåé¡ïŒ302ãåç
§ããŠãã ãããïŒ
çµå±ãããã«ã¯ãéåžžã«ããŸãæ©èœããå¯èŠæ§ã»ã³ãµãŒã䜿çšãããããªãã®ããŒãããå®è£ ããããšã«ãªããŸããã
ãããåãé€ããŠæ°ãããããžã§ã¯ããäœæããããããã«ç§»åãããããå Žåã¯ãããããOSSã䜿çšããããé©åãªå Žæãæå®ããããšãã§ããŸãã
1ã€ã®ããªãã¯ã¯ãããã©ãŒãã³ã¹ãåäžãããããã«ããããã¯ãã䜿çšããããšã§ãã åºæ¬çã«ãåè¡ãååŸããå®éã«25ã¢ã€ãã ã®ãããªèŠªãããã¯ã«é 眮ããå¿ èŠã«å¿ããŠããã亀æããŸãã
@burtonatorããã¯æ¬åœã«åœ¹ã«ç«ã¡ãŸã
DynamicSizeListã䜿çšããŠreact-selectã®ãã°ã®ãªãå®è£
ãæäŸã§ãã人ã¯ããŸããïŒ
ç§ã¯ãããäžç·ã«ããŸãæ©èœãããããšãã§ããŸããã
çŸåšã2ã€ã®åé¡ã«çŽé¢ããŠããŸãïŒã¹ã¯ãªãŒã³ã·ã§ããããªãããç³ãèš³ãããŸããïŒïŒ
style={position: absolute, left: 0, top: 0}
ãããŸããããã¹ãŠã®ãªãã·ã§ã³ãäºãã«éãªãåã£ãŠããããããã®ã¹ã¿ã€ã«ã䜿çšããããšã¯ã§ããŸããã2ã€ã®å®çšçãªäŸã¯èŠã€ãããŸããã§ããã
Chromeã§ã¯1.9.0ãã©ãŒã¯ã䜿çšããŠããããšã«æ³šæããŠãã ããã
ç·šéããŸãã äžèšã®é衚瀺ã®ã³ã¡ã³ãã»ã¯ã·ã§ã³ã§çããèŠã€ããŸããã https://github.com/bvaughn/react-window/issues/6#issuecomment -509016422
ã¹ã¯ããŒã«ã®åé¡ãåçŽåããæ¹æ³ã®1ã€ã¯ãã¹ã¯ããŒã«ããã¥ãŒããŒãã®é«ãããããã1ã€ä»¥äžé¢ããŠããå Žåã«ãã¹ã¯ããŒã«ããŒã䜿çšããŠããã¯ã»ã«äœçœ®ã§ã¯ãªããªã¹ãå ã®ã¢ã€ãã ã®ã€ã³ããã¯ã¹ã瀺ãããšã§ãã ã³ã³ããŒãã³ãã¯ãXãã¯ã»ã«ããäžã«ã¹ã¯ããŒã«ãããããšãã代ããã«ãç®çã®ã€ã³ããã¯ã¹ã®åšãã«ã¢ã€ãã ãã¬ã³ããªã³ã°ããã ãã§ãã äžéå端ã«ã¢ã€ãã ãã€ã³ããã¯ã¹N / 2ã«ã¬ã³ããªã³ã°ããäžã«ã¢ã€ãã ãã€ã³ããã¯ã¹N-1ã«ã¬ã³ããªã³ã°ããŸãã
ããã«ãããã³ã³ããŒãã³ãããµã€ãºãã¬ã³ããªã³ã°ããã³èšç®ãããšãã«ã¹ã¯ããŒã«ãµã ãé ããããšãªãããªã¹ãã®äžå€®ãŸãã¯æåŸã«ãµã ãçŽæ¥ã¹ã¯ããŒã«ã§ããŸãã çŸåšãéåžžã«é·ãVariableSizeListã³ã³ããŒãã³ãã®å Žåãã«ãŒãœã«ãã¹ã¯ããŒã«ãµã ã®ç§»åãããéããã©ãã°ãããããäžçªäžãŸã§ã¹ã¯ããŒã«ããããšã¯ã»ãŒäžå¯èœã§ãã
æãåèã«ãªãã³ã¡ã³ã
ãã®ãããžã§ã¯ãã«ã¯ãåãã¡ãã¯ããªãã ããã¯äžäººã§ç¶æãããŸãã
ãããŠãåãæ¥ã«è€æ°ã®åé¡ã«ã€ããŠåãããšã«ã€ããŠäžå¹³ãèšã£ãŠã³ã¡ã³ããæ®ãããšã¯ãäžçš®ã®è»œçã§ãã ãã²ãreact-virtualizedããå©çšãã ããã