React.memo () рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдШрдЯрдХ рдореЗрдВ рд╕реБрдзрд╛рд░

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



React.js рдХреА рдЯреАрдо рд░рд┐рдПрдХреНрдЯ рдХреЛ рддреЗрдЬреА рд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдбрд╝реА рдореЗрд╣рдирдд рдХрд░ рд░рд╣реА рд╣реИред рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЕрдкрдиреЗ рд░рд┐рдПрдХреНрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рддреЗрдЬ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЯреВрд▓ рдЬреЛрдбрд╝реЗ рдЧрдП рд╣реИрдВ:

  • рд╡рд┐рд▓рдВрдмрд┐рдд рдШрдЯрдХ рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП React.lazy рдФрд░ Suspense;
  • рд╢реБрджреНрдз рдШрдЯрдХ
  • рдЬреАрд╡рди рдЪрдХреНрд░ рдХреЗ рд╣реБрдХ рдЪрд╛рд╣рд┐рдПрдХрдВрдкрдиреА рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ (...) {...}ред

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рджреВрд╕рд░реЛрдВ рдХреЗ рдмреАрдЪ, рдШрдЯрдХ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рддреЗрдЬреА рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП React v16.6 рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдПрдХ рдЕрдиреНрдп рдЕрдиреБрдХреВрд▓рди рдЙрдкрдХрд░рдг - React.memo рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ ред

рдпреБрдХреНрддрд┐: рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдШрдЯрдХреЛрдВ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдФрд░ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд┐рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдирдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдФрд░ рдЪреАрдЬреЛрдВ рдХреЛ рдЧрддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЯреАрдо рдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдШрдЯрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЗрд╕реЗ рдЖрдЬрдорд╛рдЗрдП!



рдЕрддрд┐рд░рд┐рдХреНрдд рд░реЗрдВрдбрд░


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

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдШрдЯрдХ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

import React from 'react'; class TestC extends React.Component { constructor(props) { super(props); this.state = { count: 0 } } componentWillUpdate(nextProps, nextState) { console.log('componentWillUpdate') } componentDidUpdate(prevProps, prevState) { console.log('componentDidUpdate') } render() { return ( <div > {this.state.count} <button onClick={()=>this.setState({count: 1})}>Click Me</button> </div> ); } } export default TestC; 

{рдЧрдгрдирд╛: 0} рд╕реНрдерд┐рддрд┐ рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдорд╛рди рд╣реИред рдпрджрд┐ рдЖрдк рдХреНрд▓рд┐рдХ рдореА рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЧрд┐рдирддреА рдХреА рд╕реНрдерд┐рддрд┐ 1 рд╣реЛ рдЬрд╛рдПрдЧреАред рд╣рдорд╛рд░реА рд╕реНрдХреНрд░реАрди рдкрд░, 0 рднреА рдмрджрд▓ рдЬрд╛рдПрдЧреАред 1. рд▓реЗрдХрд┐рди рдпрджрд┐ рд╣рдо рдлрд┐рд░ рд╕реЗ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИрдВ: рдШрдЯрдХ рдХреЛ рдлрд┐рд░ рд╕реЗ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рдд рдирд╣реАрдВ рдмрджрд▓реЗ рд╣реИрдВред рдХрд╛рдЙрдВрдЯрд░ рд╡реИрд▓реНрдпреВ "рдЯреВ" 1 рд╣реИ, рдирдпрд╛ рдореВрд▓реНрдп рднреА рдПрдХ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ DOM рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

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

рдпрджрд┐ рд╣рдо рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдШрдЯрдХ рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХрдИ рдмрд╛рд░ рдХреНрд▓рд┐рдХ рдореА рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдирд┐рдореНрди рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рддреЗ рд╣реИрдВ:



рд╣рдорд╛рд░реЗ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдХрдВрдкреЛрдиреЗрдВрдЯрд╡рд┐рд▓реАрдкреЗрдб рдПрдВрдЯреНрд░реА рдХреЛ рджреЛрд╣рд░рд╛рдирд╛ рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдХрдВрдкреЛрдиреЗрдВрдЯ рддрдм рднреА рд░рд┐рд╡рд░реНрдЬрди рд╣реЛрддрд╛ рд╣реИ, рдЬрдм рд╕реНрдЯреЗрдЯ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд░реЗрдВрдбрд░ рд╣реИред

рд╢реБрджреНрдз рдХрдВрдкреЛрдиреЗрдВрдЯ / shouldComponentUpdate


ShouldComponentUpdate рдЬреАрд╡рди рдЪрдХреНрд░ рд╣реБрдХ, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдШрдЯрдХреЛрдВ рдореЗрдВ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдкреНрд░рддрд┐рдкрд╛рджрди рд╕реЗ рдмрдЪрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред

рд░рд┐рдПрдХреНрдЯ рдиреЗ рдХрдВрдкреЛрдиреЗрдВрдЯ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ shouldComponentUpdate рдореЗрдердб рдХреЛ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдФрд░ рдкреНрд░реЛрд╕реЗрд╕ рдпрд╛ рд╕рд┐рдЧреНрдирд▓ рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╡рд┐рдзрд┐ рд╕реЗ рд╣рд░реА рдмрддреНрддреА рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред

рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╣рдорд╛рд░реЗ shouldComponentUpdate рдХреЛ рджреЗрдЦрдиреЗ рджреЗрдВ:

 shouldComponentUpdate(nextProps, nextState) { return true } 

  • nextProps : рдЕрдЧрд▓рд╛ props рдореВрд▓реНрдп рдЬреЛ рдШрдЯрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛;
  • nextState : рдЕрдЧрд▓рд╛ state рдорд╛рди рдЬреЛ рдШрдЯрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛ред

рдЗрд╕рд▓рд┐рдП рд╣рдо рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдШрдЯрдХ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ true ред

рдорд╛рди рд▓реАрдЬрд┐рдП рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓рд┐рдЦрддреЗ рд╣реИрдВ:

 shouldComponentUpdate(nextProps, nextState) { return false } 

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдШрдЯрдХ рдХреЛ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд┐рдПрдХреНрдЯ рдХрд░рдиреЗ рд╕реЗ рдордирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ false рд▓реМрдЯрд╛ рджреА рдЬрд╛рддреА рд╣реИред
рдКрдкрд░ рд╕реЗ рдпрд╣ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ рдХрд┐ рдШрдЯрдХ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ true рд▓реМрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ true ред рдЕрдм рд╣рдо рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ TestC рдШрдЯрдХ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:

 import React from 'react'; class TestC extends React.Component { constructor(props) { super(props); this.state = { count: 0 } } componentWillUpdate(nextProps, nextState) { console.log('componentWillUpdate') } componentDidUpdate(prevProps, prevState) { console.log('componentDidUpdate') } shouldComponentUpdate(nextProps, nextState) { if (this.state.count === nextState.count) { return false } return true } render() { return ( <div> { this.state.count } <button onClick = { () => this.setState({ count: 1 }) }> Click Me </button> </div> ); } } export default TestC; 

рд╣рдордиреЗ TestC рдШрдЯрдХ рдореЗрдВ рдПрдХ shouldComponentUpdate рд╣реБрдХ рдЬреЛрдбрд╝рд╛ рд╣реИред рдЕрдм рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ count рд╡реИрд▓реНрдпреВ this.state.count рддреБрд▓рдирд╛ рдЕрдЧрд▓реЗ рд╕реНрдЯреЗрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ nextState.count рдореЗрдВ count рд╡реИрд▓реНрдпреВ рдХреЗ рд╕рд╛рде рдХреА nextState.count ред рдпрджрд┐ рд╡реЗ рд╕рдорд╛рди рд╣реИрдВ === , рддреЛ рдкреБрдирд░реНрд╡рд┐рддрд░рдг рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ false рд▓реМрдЯрд╛ рджреА рдЬрд╛рддреА рд╣реИред рдпрджрд┐ рд╡реЗ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИрдВ, рддреЛ true рд▓реМрдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдирдП рдореВрд▓реНрдп рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд░реЗрдВрдбрд░рд░ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрджрд┐ рд╣рдо рдХрд┐рд╕реА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдПрдХ рдкрд░рд┐рдЪрд┐рдд рдкрд░рд┐рдгрд╛рдо рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:



рд▓реЗрдХрд┐рди Click Me рдмрдЯрди рдкрд░ рдХрдИ рдмрд╛рд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рд╕реЗ, рд╣рдо рд╕рднреА рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд (рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИ!)ред

componentWillUpdate
componentDidUpdate




рдЖрдк React DevTools рдЯреИрдм рдореЗрдВ TestC рдШрдЯрдХ рдХреА рд╕реНрдерд┐рддрд┐ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЯреИрдм рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ, рджрд╛рдИрдВ рдУрд░ TestC рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ, рдФрд░ рдЖрдк рдХрд╛рдЙрдВрдЯрд░ рд╕реНрдерд┐рддрд┐ рдорд╛рди рджреЗрдЦреЗрдВрдЧреЗ:



рдЗрд╕ рдорд╛рди рдХреЛ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХрд╛рдЙрдВрдЯрд░ рдЯреЗрдХреНрд╕реНрдЯ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ, 2 рдЯрд╛рдЗрдк рдХрд░реЗрдВ рдФрд░ рдПрдВрдЯрд░ рджрдмрд╛рдПрдВред



рдЧрд┐рдирддреА рдХреА рд╕реНрдерд┐рддрд┐ рдмрджрд▓ рдЬрд╛рдПрдЧреА, рдФрд░ рдХрдВрд╕реЛрд▓ рдореЗрдВ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ:

 componentWillUpdate componentDidUpdate componentWillUpdate componentDidUpdate 



рдкрд┐рдЫрд▓рд╛ рдорд╛рди 1 рдерд╛, рдФрд░ рдирдпрд╛ 2 рдерд╛, рдЗрд╕рд▓рд┐рдП рдПрдХ redraw рдЖрд╡рд╢реНрдпрдХ рдерд╛ред
рд╢реБрджреНрдз рдШрдЯрдХ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВред

рд╢реБрджреНрдз рдШрдЯрдХ рд╕рдВрд╕реНрдХрд░рдг v15.5 рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди ( change detection ) рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред extend React.PureComponent рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдкрдХреЛ shouldComponentUpdate рд▓рд┐рдП shouldComponentUpdate рдЬреАрд╡рди рдЪрдХреНрд░ рд╡рд┐рдзрд┐ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдирд╣реАрдВ рд╣реИ: рдкрд░рд┐рд╡рд░реНрддрди рдЯреНрд░реИрдХрд┐рдВрдЧ рд╕реНрд╡рдпрдВ рджреНрд╡рд╛рд░рд╛ рд╣реЛрддреА рд╣реИред

TestC рдШрдЯрдХ рдореЗрдВ рдПрдХ PureComponent рдЬреЛрдбрд╝реЗрдВред

 import React from 'react'; class TestC extends React.PureComponent { constructor(props) { super(props); this.state = { count: 0 } } componentWillUpdate(nextProps, nextState) { console.log('componentWillUpdate') } componentDidUpdate(prevProps, prevState) { console.log('componentDidUpdate') } /*shouldComponentUpdate(nextProps, nextState) { if (this.state.count === nextState.count) { return false } return true }*/ render() { return ( <div> { this.state.count } <button onClick = { () => this.setState({ count: 1 }) }> Click Me </button> </div > ); } } export default TestC; 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ shouldComponentUpdate ред рд╣рдореЗрдВ рдЕрдм рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ: рд╕рднреА рдХрд╛рд░реНрдп React.PureComponent рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдирдП рд╕рдорд╛рдзрд╛рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рд░рд┐рдмреВрдЯ рдХрд░рдирд╛, рдФрд░ рдХрдИ рдмрд╛рд░ Click Me рдмрдЯрди рдкрд░ Click Me , рд╣рдореЗрдВ рдорд┐рд▓рддрд╛ рд╣реИ:





рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХрдВрд╕реЛрд▓ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ component*Update рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рджрд┐рдЦрд╛рдИ рджреАред

рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рдмрд╛рдж рдХрд┐ ES6 рдХреЗ рдШрдЯрдХ рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд░реАрдбреНрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд░рд┐рдПрдХреНрдЯ рдореЗрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╣реИ, рд╣рдо рдШрдЯрдХ рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред рдЙрдирдХреЗ рд╕рд╛рде рд╕рдорд╛рди рдкрд░рд┐рдгрд╛рдо рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ?

рд╕рдорд╛рд░реЛрд╣ рдХреЗ рдШрдЯрдХ


рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдкреНрдпреЛрд░ рдХрдВрдкреЛрдиреЗрдВрдЯ рдФрд░ shouldComponentUpdate рдЬреАрд╡рди рдЪрдХреНрд░ shouldComponentUpdate рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХреИрд╕реЗ рдХрд░реЗрдВред рдХреЛрдИ рднреА рддрд░реНрдХ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ рдХрд┐ рд╡рд░реНрдЧ рдШрдЯрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдореБрдЦреНрдп рдШрдЯрдХ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдШрдЯрдХреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

 function TestC(props) { return ( <div> I am a functional component </div> ) } 

рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдШрдЯрдХ, рд╡рд░реНрдЧ рдШрдЯрдХреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдХреЛрдИ рд░рд╛рдЬреНрдп рдирд╣реАрдВ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдм рдЬреЛ рдЙрдкрдпреЛрдЧ useState рд╣реБрдХ useState , рдЗрд╕рдХреЗ рд╕рд╛рде рддрд░реНрдХ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ), рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдо рдЙрдирдХреЗ рдкреБрдирд░реНрд╡рд┐рдХрд╛рд╕ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рд╣рдордиреЗ рдЬрд┐рди рдЬреАрд╡рди рдЪрдХреНрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛, рд╡реЗ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИрдВред рдпрджрд┐ рд╣рдо рдлрдВрдХреНрд╢рди рдШрдЯрдХреЛрдВ рдореЗрдВ рдЬреАрд╡рди рдЪрдХреНрд░ рдХреЗ рд╣реБрдХ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд░реЗрдВрдбрд░рд░ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдЬреЛ рд░рд┐рдПрдХреНрдЯ рдХреЛ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП shouldComponentUpdate рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред (рд╢рд╛рдпрдж рд▓реЗрдЦрдХ рдиреЗ рдЕрдВрддрд┐рдо рд╡рд╛рдХреНрдп рдореЗрдВ рдПрдХ рддрдереНрдпрд╛рддреНрдордХ рдЧрд▓рддреА рдХреА рд╣реИред - рд▓рдЧрднрдЧред рдПрдбред) рдФрд░, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╣рдо extend React.PureComponent рдХрд╛ extend React.PureComponent рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред

рд╣рдо рдЕрдкрдиреЗ рдШрдЯрдХ рд╡рд░реНрдЧ ES6 TestC рдХреЛ рдПрдХ рдШрдЯрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВред

 import React from 'react'; const TestC = (props) => { console.log(`Rendering TestC :` props) return ( <div> {props.count} </div> ) } export default TestC; // App.js <TestC count={5} /> 

рдХрдВрд╕реЛрд▓ рдореЗрдВ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо Rendering TestC :5 рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рджреЗрдЦрддреЗ рд╣реИрдВред



DevTools рдЦреЛрд▓реЗрдВ рдФрд░ React рдЯреИрдм рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред рдпрд╣рд╛рдВ рд╣рдо TestC рдШрдЯрдХ рдХреЗ рдЧреБрдгреЛрдВ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗред TestC рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ, рдФрд░ рджрд╛рдИрдВ рдУрд░ TestC рдХреЗ рд╕рднреА рдЧреБрдг рдФрд░ рдорд╛рди рд╡рд╛рд▓реЗ рдХрд╛рдЙрдВрдЯрд░ рдЧреБрдг рдЦреБрд▓реЗрдВрдЧреЗред рд╣рдо рдХреЗрд╡рд▓ 5 рдХреЗ рд╡рд░реНрддрдорд╛рди рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдХрд╛рдЙрдВрдЯрд░ рджреЗрдЦрддреЗ рд╣реИрдВред

рдорд╛рди рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдирдВрдмрд░ 5 рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдЗрдирдкреБрдЯ рд╡рд┐рдВрдбреЛ рджрд┐рдЦрд╛рдИ рджреЗрдЧреАред



рдпрджрд┐ рд╣рдо рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдорд╛рди рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ рдФрд░ Enter рджрдмрд╛рддреЗ рд╣реИрдВ, рддреЛ рдШрдЯрдХ рдХреЗ рдЧреБрдг рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рджрд░реНрдЬ рдХрд┐рдП рдЧрдП рдорд╛рди рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдмрджрд▓ рдЬрд╛рдПрдВрдЧреЗред 45 рдкрд░ рдорд╛рди рд▓реАрдЬрд┐рдПред



рдХрдВрд╕реЛрд▓ рдЯреИрдм рдкрд░ рдЬрд╛рдПрдВред



TestC рдШрдЯрдХ рдлрд┐рд░ рд╕реЗ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдХреНрдпреЛрдВрдХрд┐ 5 рдХрд╛ рдкрд┐рдЫрд▓рд╛ рдорд╛рди рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдмрджрд▓ рдЧрдпрд╛ - 45. рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЯреИрдм рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ рдФрд░ рдорд╛рди рдХреЛ 45 рдореЗрдВ рдмрджрд▓реЗрдВ, рдлрд┐рд░ рдХрдВрд╕реЛрд▓ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВред



рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдШрдЯрдХ рдлрд┐рд░ рд╕реЗ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдкрд┐рдЫрд▓реЗ рдФрд░ рдирдП рдореВрд▓реНрдп рд╕рдорд╛рди рд╣реИрдВред :(

рд░реЗрдВрдбрд░рд░ рдХреИрд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░реЗрдВ?

рд╕рдорд╛рдзрд╛рди: React.memo ()


React.memo() React v16.6 рдореЗрдВ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдПрдХ рдирдпрд╛ рдлреАрдЪрд░ рд╣реИред рдЗрд╕рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рд╕рд┐рджреНрдзрд╛рдВрдд React.PureComponent рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ React.PureComponent : рдШрдЯрдХ-рдХрд╛рд░реНрдпреЛрдВ рдХреЗ React.PureComponent рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред рдХрдХреНрд╖рд╛ рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП React.memo(...) рдлрд╝рдВрдХреНрд╢рди рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП React.PureComponent ред

React.memo (...) рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдВ?
рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ред рдХрд╣реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдШрдЯрдХ рдХрд╛рд░реНрдп рд╣реИред

 const Funcomponent = ()=> { return ( <div> Hiya!! I am a Funtional component </div> ) } 

рд╣рдореЗрдВ рдХреЗрд╡рд▓ React.memo рдлрд╝рдВрдХреНрд╢рди рдХреЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ FuncComponent рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

 const Funcomponent = ()=> { return ( <div> Hiya!! I am a Funtional component </div> ) } const MemodFuncComponent = React.memo(FunComponent) 

React.memo рдиреЗ MemodFuncComponent рдХреЛ purified MemodFuncComponent ред рдпрд╣ рд╡рд╣ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдЬреЗрдПрд╕рдПрдХреНрд╕ рдорд╛рд░реНрдХрдЕрдк рдореЗрдВ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░реЗрдВрдЧреЗред рдЬрдм рдПрдХ рдШрдЯрдХ рдХреЗ рдЧреБрдг рдФрд░ рд╕реНрдерд┐рддрд┐ рдмрджрд▓рддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдШрдЯрдХ рдХреЗ рдкрд┐рдЫрд▓реЗ рдФрд░ рд╡рд░реНрддрдорд╛рди рдЧреБрдгреЛрдВ рдФрд░ рд░рд╛рдЬреНрдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рддреА рд╣реИред рдФрд░ рдХреЗрд╡рд▓ рдЕрдЧрд░ рд╡реЗ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдШрдЯрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЗрд╕реЗ TestC рдлрд╝рдВрдХреНрд╢рди рдШрдЯрдХ рдкрд░ рд▓рд╛рдЧреВ рдХрд░реЗрдВред

 let TestC = (props) => { console.log('Rendering TestC :', props) return ( <div> { props.count } </> ) } TestC = React.memo(TestC); 

рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЦреЛрд▓реЗрдВ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВред DevTools рдЦреЛрд▓реЗрдВ рдФрд░ React рдЯреИрдм рдкрд░ рдЬрд╛рдПрдВред <Memo(TestC)> рдЪрдпрди рдХрд░реЗрдВред

рдпрджрд┐ рджрд╛рдИрдВ рдУрд░ рдмреНрд▓реЙрдХ рдореЗрдВ рд╣рдо рдХрд╛рдЙрдВрдЯрд░ рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ 89 рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВ, рддреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред



рдпрджрд┐ рд╣рдо рдореВрд▓реНрдп рдХреЛ рдкрд┐рдЫрд▓реЗ рдПрдХ, 89 рдореЗрдВ рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВ, рддреЛ ...



рдХреЛрдИ рдирд┐рд╡рд╛рд░рдг рдирд╣реАрдВ рд╣реЛрдЧрд╛!

React.memo (...) рдХреА рдЬрдп! :)

рд╣рдорд╛рд░реЗ рдкрд╣рд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ React.memo(...) рдХрд╛ рдЙрдкрдпреЛрдЧ React.memo(...) рдмрд┐рдирд╛, TestC рдШрдЯрдХ рдлрд╝рдВрдХреНрд╢рди рддрдм рднреА рдлрд┐рд░ рд╕реЗ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдм рдкрд┐рдЫрд▓рд╛ рдорд╛рди рд╕рдорд╛рди рдПрдХ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред рдЕрдм, React.memo(...) рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╣рдо рдШрдЯрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдкреНрд░рддрд┐рдкрд╛рджрди рд╕реЗ рдмрдЪ рд╕рдХрддреЗ рд╣реИрдВред

рдирд┐рд╖реНрдХрд░реНрд╖


  • рдЪрд▓реЛ рд╕реВрдЪреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдирд╛?
  • React.PureComponent - рд╕рд┐рд▓реНрд╡рд░;
  • React.memo(...) - рд╕реЛрдирд╛;
  • React.PureComponent ES6 рд╡рд░реНрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ;
  • React.memo(...) рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ;
  • React.PureComponent ES6 рд╡рд░реНрдЧреЛрдВ рдХреЗ React.PureComponent рдЕрдиреБрдХреВрд▓рди рдХрд░рддрд╛ рд╣реИ;
  • React.memo(...) рдлрдВрдХреНрд╢рди React.memo(...) рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ;
  • рд╕реБрд╡рд┐рдзрд╛ рдЕрдиреБрдХреВрд▓рди рдПрдХ рднрдпрд╛рдирдХ рд╡рд┐рдЪрд╛рд░ рд╣реИ;
  • React рдлрд┐рд░ рдХрднреА рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд▓реЗрдЦ рдпрд╛ рдХрд┐рд╕реА рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА, рдкрд░рд┐рд╡рд░реНрддрди рдпрд╛ рдЖрдкрддреНрддрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдкреНрд░рд╢реНрди рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рдЯрд┐рдкреНрдкрдгреА, рдИрдореЗрд▓ рдпрд╛ рдирд┐рдЬреА рд╕рдВрджреЗрд╢ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдВрдХреЛрдЪ рди рдХрд░реЗрдВред

рдзрдиреНрдпрд╡рд╛рдж!

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


All Articles