рдЗрд╡реЗрдВрдЯ рд╢реНрд░реЛрддрд╛ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдЕрдирдВрдд рд╕реНрдХреНрд░реЙрд▓ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдирд╛

рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реЛрддрд╛ рд╣реИ?



рдпрджрд┐ рдХрд┐рд╕реА рддрд░рд╣ рдХреЗ рд╕рдВрдХреНрд░рдордг рдПрдиреАрдореЗрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рд╢рд╛рд▓ рддрд╛рд▓рд┐рдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреБрдЫ рдФрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд┐рдЫрдбрд╝ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдиреБрдХрд╕рд╛рди рд╣реЛрдЧрд╛ред




рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЬрдм рд╣рдо рдИрд╡реЗрдВрдЯ рд╢реНрд░реЛрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдирдВрдд рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рди рдХреЗрд╡рд▓ рд╡реНрдпреВрдкреЛрд░реНрдЯ рдФрд░ рдкрдВрдХреНрддрд┐ рдХреА рдКрдВрдЪрд╛рдИ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдмрд▓реНрдХрд┐ рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рддрд░реНрдХ рднреА рд▓рд┐рдЦреЗ рдЬрд╛рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдмрд╣реБрдд рдмрд╛рд░ рд░рд┐рдбреНрд░реЗрд╕рд┐рдВрдЧ рдХреЛ рд░реЛрдХрд╛ рдЬрд╛ рд╕рдХреЗ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓рдмреИрдХ рд╕реНрдХреНрд░реЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдХреЙрд▓ setState рдХрд░реЗрдВред


рдХреЛрдб рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реЛрдЧрд╛:


 componentDidMount() { window.addEventListener('scroll', this.handleScroll) } handleScroll(e) { // use window offset and boundingRect const { ...someAttributes } = window; const { ...someBoundingRect } = this.component // some logic prevent re-render if ( ... ) return; // do some math const newIndex = ... // and how many rows should be rendered this.setState({index: newIndex }) } 

рд▓реЗрдХрд┐рди рдПрдХ рдЯреЗрдмрд▓ рдХреЗ рдЕрдирдВрдд рд╕реНрдХреНрд░реЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ, рдмрд┐рдирд╛ рдЦрд┐рдбрд╝рдХреА рдпрд╛ рдмрд╛рдЙрдВрдбрд┐рдВрдЧ рдорд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдЬрд╛рдирдиреЗ рдХреЗ рдмрд┐рдирд╛ред


рдпрд╣ рдПрдХ IntersectionObserver рд╣реИ ред W3c рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд╛:


рдпрд╣ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдПрдХ рдПрдкреАрдЖрдИ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдбреЛрдо рддрддреНрд╡ ("рд▓рдХреНрд╖реНрдп") рдХреА рджреГрд╢реНрдпрддрд╛ рдФрд░ рд╕реНрдерд┐рддрд┐ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдЧрдгрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрди рдХреА рдКрдВрдЪрд╛рдИ, рд╡реНрдпреВрдкреЛрд░реНрдЯ рдХреЗ рд╢реАрд░реНрд╖ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдореВрд▓реНрдп рдХреЛ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред



рдЕрд╡рдзрд╛рд░рдгрд╛ рдкреНрд░рддреНрдпреЗрдХ рдирд┐рдпрдВрддреНрд░рдг рдмрд┐рдВрджреБ рдкрд░ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЗ рд╕рд╛рде рдПрдВрдХрд░реЛрдВ рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдХрд░рдирд╛ рд╣реИ рдФрд░ рд╣рд░ рдмрд╛рд░ рдПрдВрдХрд░ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕реВрдЪрдХрд╛рдВрдХ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдФрд░ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рддреИрдпрд╛рд░ рдХрд░реЗрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЖрдкрдХреЛ рдбреЛрдо рдКрдВрдЪрд╛рдИ рдФрд░ рд╡реНрдпреВрдкреЛрд░реНрдЯ рдХреЗ рд╕рд╛рде рдХреЛрдИ рдЧрдгрд┐рддреАрдп рдЬрд╛рджреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред



рд╕реВрдЪрдХрд╛рдВрдХ 1 рдХреЗ рд▓рд┐рдП рдПрдВрдХрд░ рдЯреНрд░рд┐рдЧрд░


рдЕрдзрд┐рдХ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд░реЗрдВрдбрд░ рдХрд░реЗрдВ


IntersectionObserver рдХреЗ рд╕рд╛рде рдХреЛрдб рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реЛрдЧрд╛ред



 handleSentinel = (c) => { if(!this.observer) { //  observer this.observer = new IntersectionObserver( entries => { entries.forEach(e => { //   ,    if (e.isIntersecting) { this.setState( { cursor: +e.target.getAttribute('index') } ); } }); }, { root: document.querySelector('App'), rootMargin: '-30px', } } if (!c) return; //    this.observer.observe(c) } render() { const blockNum = 5; return( ... <tbody> {MOCK_DATA.slice(0, (cursor+1) * blockNum).map(d => <Block> { //       // ,   5  d.id % blockNum === 0 ? <span ref={this.handleSentinel} index={d.id / blockNum} /> : null } </Block>)} </tbody> ... ) } 

Source: https://habr.com/ru/post/hi456046/


All Articles