рдЕрдкрдиреЗ рдХрд╛рдо рдХреЗ рджреМрд░рд╛рди, рдореИрдВ рд╕рдордп-рд╕рдордп рдкрд░ рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдпрд╛ рдХрд┐ рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╣рдореЗрд╢рд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд╣реАрдВ рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд┐рд╢реЗрд╖ рдХреЙрд▓рдмреИрдХ рдореЗрдВ, рдкреНрд░реЙрдкреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреЗрдЯрд╛ рд╕рдВрдЪрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рддрдВрддреНрд░ рдХреИрд╕реЗ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЙрдирдХреЗ рдкреНрдпреЛрд░рдХреЙрдорд░реНрд╕ рдХреЛ рдЗрддрдиреА рдмрд╛рд░ рдХреНрдпреЛрдВ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╣рдо рд╕рдордЭреЗрдВрдЧреЗ рдХрд┐ рдХреЙрд▓рдмреИрдХ рдХреЛ рдХреИрд╕реЗ рд░рд┐рдПрдХреНрдЯ рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдШрдЯрдирд╛ рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдкрд░ рднреА рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рддреА рд╣реИред
рдЯреАрдПрд▓, рдбреЙ
- рдЬреЗрдПрд╕рдПрдХреНрд╕ рдФрд░ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рд╣рд╕реНрддрдХреНрд╖реЗрдк рди рдХрд░реЗрдВ - рдпрд╣ рдХреЛрдб рдХреА рдзрд╛рд░рдгрд╛ рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░реЗрдЧрд╛ред
- рдЫреЛрдЯреА рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд▓рд┐рдП, рдХреИрд╢ рд╣реИрдВрдбрд▓рд░ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП classProperties рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╛ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд▓рд┐рдП useCallback рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ - рдлрд┐рд░ рд╢реБрджреНрдз рдШрдЯрдХреЛрдВ рдХреЛ рд▓рдЧрд╛рддрд╛рд░ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХреЙрд▓рдмреИрдХ рдХреИрд╢рд┐рдВрдЧ рдХрд╛рдо рдореЗрдВ рдЖ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЬрдм рд╡реЗ рдкреНрдпреЛрд░рдХреЙрдореНрдкреЛрдиреЗрдВрдЯ рдХреЛ рдкрд╛рд╕ рдХрд┐рдП рдЬрд╛рдПрдВ, рддреЛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЕрдкрдбреЗрдЯрд┐рдВрдЧ рдЪрдХреНрд░ рди рд╣реЛред
- рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рдЖрдкрдХреЛ рдХреЙрд▓рдмреИрдХ рдореЗрдВ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдШрдЯрдирд╛ рдирд╣реАрдВ рдорд┐рд▓рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╕рд┐рдВрдереЗрдЯрд┐рдХ рдШрдЯрдирд╛ рд╣реИред рдпрджрд┐ рдЖрдк рд╡рд░реНрддрдорд╛рди рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕ рдИрд╡реЗрдВрдЯ рдХреЗ рдлрд╝реАрд▓реНрдб рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪ рдкрд╛рдПрдВрдЧреЗред рдпрджрд┐ рдЖрдкрдХреЛ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреНрд▓реЛрдЬрд░ рд╣реИрдВ, рддреЛ рдЙрди рдлрд╝реАрд▓реНрдб рдХреЛ рдХреИрд╢ рдХрд░реЗрдВ рдЬрд┐рдирдХреА рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рднрд╛рдЧ 1. рдШрдЯрдирд╛ рд╕рдВрдЪрд╛рд▓рдХреЛрдВ, рдХреИрд╢рд┐рдВрдЧ рдФрд░ рдХреЛрдб рдзрд╛рд░рдгрд╛
HTML рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд┐рдПрдХреНрдЯ рдХрд╛рдлреА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рдпрд╣ рдЙрди рдореВрд▓ рдЪреАрдЬрд╝реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рднреА рдбреЗрд╡рд▓рдкрд░ рдХреЛ рддрдм рдкрддрд╛ рдЪрд▓рддреА рд╣реИрдВ рдЬрдм рд╡реЗ рд░рд┐рдПрдХреНрдЯ рдореЗрдВ рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:
class MyComponent extends Component { render() { return <button onClick={() => console.log('Hello world!')}>Click me</button>; } }
рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИ? рдЗрд╕ рдХреЛрдб рд╕реЗ, рдпрд╣ рддреБрд░рдВрдд рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдкрд░ рдХреНрдпрд╛ рд╣реЛрдЧрд╛ред
рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдХреЛрдб рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ рдЬрд╛рдП?
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдПрдХ рдмрдЯрди рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╣рдореЗрдВ рдЙрди рд╕рднреА рдХреЛ рд▓реЛрдб рдФрд░ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдЯреАрдо рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВ ( user.team === 'search-team'
), рддреЛ рдЙрдиреНрд╣реЗрдВ рдЙрдореНрд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХреНрд░рдордмрджреНрдз рдХрд░реЗрдВред
class MyComponent extends Component { constructor(props) { super(props); this.state = { users: [] }; } render() { return ( <div> <ul> {this.state.users.map(user => ( <li>{user.name}</li> ))} </ul> <button onClick={() => { console.log('Hello world!'); window .fetch('/usersList') .then(result => result.json()) .then(data => { const users = data .filter(user => user.team === 'search-team') .sort((a, b) => { if (a.age > b.age) { return 1; } if (a.age < b.age) { return -1; } return 0; }); this.setState({ users: users, }); }); }} > Load users </button> </div> ); } }
рдпрд╣ рдХреЛрдб рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХрдард┐рди рд╣реИред рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХ рдХреЛрдб рдЙрд╕ рд▓реЗрдЖрдЙрдЯ рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреЗрдЦрддрд╛ рд╣реИред
рдЗрд╕рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛: рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреНрд▓рд╛рд╕ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рд╕реНрддрд░ рдкрд░ рд▓реЗ рдЬрд╛рдПрдВ:
class MyComponent extends Component { fetchUsers() {
рдпрд╣рд╛рдБ рд╣рдордиреЗ JSX рдХреЛрдб рд╕реЗ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХреЛ рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ред рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рдЗрд╕реЗ рд╕реБрд▓рдн рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдХреЙрд▓рдмреИрдХ рдХреЛ рдЗрд╕ рддрд░рд╣ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛: onClick={() => this.fetchUsers()}
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рд╡рд░реНрдЧ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╕рдордп, рд╣рдо рдПрдХ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдПрдХ рддреАрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
class MyComponent extends Component { fetchUsers = () => {
рдпрд╣ рд╣рдореЗрдВ рдХреЙрд▓рдмреИрдХ рдХреЛ onClick={this.fetchUsers}
рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛
рдЗрди рджреЛрдиреЛрдВ рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдХреНрдпрд╛ рдЕрдВрддрд░ рд╣реИ?
onClick={this.fetchUsers}
- рдпрд╣рд╛рдБ, рдкреНрд░реЙрдкреНрд╕ рдореЗрдВ рд░реЗрдВрдбрд░ рдлрдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд╣рд░ рдХреЙрд▓ рдХреЗ рд╕рд╛рде, button
рдХреЛ рд╣рдореЗрд╢рд╛ рдПрдХ рд╣реА рд▓рд┐рдВрдХ рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛ред
onClick={() => this.fetchUsers()}
, рдЬрдм рднреА рд░реЗрдВрдбрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрдХ рдирдП рдлрд╝рдВрдХреНрд╢рди () => this.fetchUsers()
рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ onClick
рдкреНрд░реЛрдк рдкрд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ nextProp.onClick
рдФрд░ prop.onClick
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ button
рдкрд░ button
рд╣рдореЗрд╢рд╛ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдШрдЯрдХ рд╕рд╛рдл рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдкреНрд░рддрд┐рдкрд╛рджрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЗрд╕рд╕реЗ рд╡рд┐рдХрд╛рд╕ рдХреЛ рдХреНрдпрд╛ рдЦрддрд░рд╛ рд╣реИ?
рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЖрдк рдиреЗрддреНрд░рд╣реАрди рд░реВрдк рд╕реЗ рдПрдХ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдХрдореА рдирд╣реАрдВ рджреЗрдЦреЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдШрдЯрдХ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рд╡рд░реНрдЪреБрдЕрд▓ рдбреЛрдо рдкрд┐рдЫрд▓реЗ рдПрдХ рд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдФрд░ рдЖрдкрдХреЗ рдбреЛрдо рдореЗрдВ рдХреЛрдИ рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрджрд┐ рдЖрдк рдШрдЯрдХреЛрдВ рдпрд╛ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреА рдмрдбрд╝реА рд╕реВрдЪреА рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдбреЗрдЯрд╛ рдкрд░ "рдмреНрд░реЗрдХ" рджреЗрдЦреЗрдВрдЧреЗред
рдпрд╣ рд╕рдордЭрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдХреЙрд▓рдмреИрдХ рдореЗрдВ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреИрд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?
рдЕрдХреНрд╕рд░ рдЯреНрд╡рд┐рдЯрд░ рдкрд░ рдпрд╛ рд╕реНрдЯреИрдХрдУрд╡рд░рдлрд╝реНрд▓реЛ рдкрд░ рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕реБрдЭрд╛рд╡ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ:
"рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдореБрджреНрджреЗ рд╣реИрдВ, рддреЛ PureComponent рдХреЗ рд╕рд╛рде рдШрдЯрдХ рд╕реЗ рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рдЖрдк рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЕрджреНрдпрддрди рдЫреЛрд░реЛрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрд╢рд╛ canComponentUpdate рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред"
рдпрджрд┐ рд╣рдо рдПрдХ рдШрдЯрдХ рдХреЛ рдкреНрдпреЛрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ shouldComponentUpdate
рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдХрд┐ рдкреНрд░реЙрдкреНрд╕ рдФрд░ рдиреЗрдХреНрд╕реНрдЯрдкреНрд░реЙрдкреНрд╕ рдХреЗ рдмреАрдЪ рдЙрдерд▓рд╛ рд╣реИред
рд╣рд░ рдмрд╛рд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдкрд╛рд╕ рдХрд░рдирд╛, рд╣рдо PureComponent
рд╕рднреА рдлрд╛рдпрджреЗ рдФрд░ рдЕрдиреБрдХреВрд▓рди рдЦреЛ рджреЗрддреЗ рд╣реИрдВред
рдЖрдЗрдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВред
рдПрдХ рдЗрдирдкреБрдЯ рдХрдВрдкреЛрдиреЗрдВрдЯ рдмрдирд╛рдПрдВ, рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЬрд╛рдирдХрд╛рд░реА рднреА рд╣реЛрдЧреА рдХрд┐ рдЗрд╕реЗ рдХрд┐рддрдиреА рдмрд╛рд░ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
class Input extends PureComponent { renderedCount = 0; render() { this.renderedCount++; return ( <div> <input onChange={this.props.onChange} /> <p>Input component was rerendered {this.renderedCount} times</p> </div> ); } }
рдЖрдЗрдП рджреЛ рдШрдЯрдХ рдмрдирд╛рдПрдВ рдЬреЛ рдЗрдирдкреБрдЯ рдХреЛ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗрдВрдЧреЗ:
class A extends Component { state = { value: '' }; onChange = e => { this.setState({ value: e.target.value }); }; render() { return ( <div> <Input onChange={this.onChange} /> <p>The value is: {this.state.value} </p> </div> ); } }
рдФрд░ рджреВрд╕рд░рд╛ рдПрдХ:
class B extends Component { state = { value: '' }; onChange(e) { this.setState({ value: e.target.value }); } render() { return ( <div> <Input onChange={e => this.onChange(e)} /> <p>The value is: {this.state.value} </p> </div> ); } }
рдЖрдк рдпрд╣рд╛рдБ рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рдЙрджрд╛рд╣рд░рдг рдЖрдЬрд╝рдорд╛ рд╕рдХрддреЗ рд╣реИрдВ: https://codesandbox.io/s/2vwz6kjjkr
рдпрд╣ рдЙрджрд╛рд╣рд░рдг рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рд░ PureComponent рдореЗрдВ рдПрдХ рдирдпрд╛ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдк PureComponent рдХреЗ рд╕рднреА рд▓рд╛рднреЛрдВ рдХреЛ рдХреИрд╕реЗ рдЦреЛ рд╕рдХрддреЗ рд╣реИрдВред
рднрд╛рдЧ 2. рдлрд╝рдВрдХреНрд╢рди рдШрдЯрдХреЛрдВ рдореЗрдВ рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
рд░рд┐рдПрдХреНрдЯ (16.8) рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рд░рд┐рдПрдХреНрдЯ рд╣реБрдХ рддрдВрддреНрд░ рдХреА рдШреЛрд╖рдгрд╛ рдХреА рдЧрдИ рдереА, рдЬреЛ рдЖрдкрдХреЛ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдЬреАрд╡рди рдЪрдХреНрд░ рдХреЗ рд╕рд╛рде рдкреВрд░реНрдг-рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдШрдЯрдХреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рд▓рдЧрднрдЧ рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдорд╛рдорд▓реЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЕрдм рддрдХ рдХреЗрд╡рд▓ рдХрд╡рд░ рдХрд┐рдП рдЧрдП рд╡рд░реНрдЧ рд╣реИрдВред
рд╣рдо рдЗрдирдкреБрдЯ рдШрдЯрдХ рдХреЗ рд╕рд╛рде рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╕рднреА рдШрдЯрдХреЛрдВ рдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рдП рдФрд░ рд░рд┐рдПрдХреНрдЯ-рд╣реБрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред
рдЗрдирдкреБрдЯ рдХреЛ рдЕрдкрдиреЗ рдЕрдВрджрд░ рд╣реА рдЬрд╛рдирдХрд╛рд░реА рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЗрд╕реЗ рдХрд┐рддрдиреА рдмрд╛рд░ рдмрджрд▓рд╛ рдЧрдпрд╛ рд╣реИред рдпрджрд┐ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдордиреЗ рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдПрдХ рдлрд╝реАрд▓реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, рдЬрд┐рд╕ рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдо рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдЪрд░ рдШреЛрд╖рд┐рдд рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдВрдЧреЗред
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдПрдХ рд╣реБрдХ рдЙрдкрдпреЛрдЧ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдбреЛрдо рдЯреНрд░реА рдореЗрдВ HtmlElement рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рднреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд┐рдпрдорд┐рдд рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рдШрдЯрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
import React, { useRef } from 'react'; export default function Input({ onChange }) { const componentRerenderedTimes = useRef(0); componentRerenderedTimes.current++; return ( <> <input onChange={onChange} /> <p>Input component was rerendered {componentRerenderedTimes.current} times</p> </> ); }
рд╣рдореЗрдВ "рд╕рд╛рдл" рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдШрдЯрдХ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдпрд╣ рддрднреА рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдШрдЯрдХ рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдкреНрд░реЙрдкрд░ рдмрджрд▓ рдЧрдпрд╛ рд╣реЛред
рдЗрд╕рдХреЗ рд▓рд┐рдП, рд╡рд┐рднрд┐рдиреНрди рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИрдВ рдЬреЛ рдПрдЪрдУрд╕реА рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореЗрдореЛ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд░рд┐рдПрдХреНрдЯ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рддреЗрдЬреА рд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
import React, { useRef, memo } from 'react'; export default memo(function Input({ onChange }) { const componentRerenderedTimes = useRef(0); componentRerenderedTimes.current++; return ( <> <input onChange={onChange} /> <p>Input component was rerendered {componentRerenderedTimes.current} times</p> </> ); });
рдЗрдирдкреБрдЯ рдШрдЯрдХ рддреИрдпрд╛рд░ рд╣реИ, рдЕрдм рдШрдЯрдХреЛрдВ рдП рдФрд░ рдмреА рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗрдВред
рдШрдЯрдХ рдмреА рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ:
import React, { useState } from 'react'; function B() { const [value, setValue] = useState(''); return ( <div> <Input onChange={e => setValue(e.target.value)} /> <p>The value is: {value} </p> </div> ); }
рдпрд╣рд╛рдВ рд╣рдордиреЗ useState
рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдШрдЯрдХ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде рд╕рд╣реЗрдЬрдиреЗ рдФрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдпрджрд┐ рдШрдЯрдХ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╣рдо рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреИрд╢ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рд╣рдо рдЗрд╕реЗ рдШрдЯрдХ рд╕реЗ рдирд╣реАрдВ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдШрдЯрдХ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд╣реЛрдЧрд╛ред
рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рд░рд┐рдПрдХреНрдЯ рдореЗрдВ рдХреИрд╢рд┐рдВрдЧ рдФрд░ useCallback
рд╣реБрдХ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ useCallback
рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЙрдкрдпреБрдХреНрдд useCallback
https://reactjs.org/docs/hooks-reference.html
рдЗрд╕ рд╣реБрдХ рдХреЛ рдХрдВрдкреЛрдиреЗрдВрдЯ A
рдЬреЛрдбрд╝реЗрдВ:
import React, { useState, useCallback } from 'react'; function A() { const [value, setValue] = useState(''); const onChange = useCallback(e => setValue(e.target.value), []); return ( <div> <Input onChange={onChange} /> <p>The value is: {value} </p> </div> ); }
рд╣рдордиреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреИрд╢ рдХрд┐рдпрд╛, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЗрдирдкреБрдЯ рдШрдЯрдХ рд╣рд░ рдмрд╛рд░ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ useCallback
рд╣реБрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?
рдпрд╣ рд╣реБрдХ рдПрдХ рдХреИрд╢реНрдб рдлрдВрдХреНрд╢рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ (рдпрд╛рдиреА рд▓рд┐рдВрдХ рд░реЗрдВрдбрд░ рд╕реЗ рд░реЗрдВрдбрд░ рдореЗрдВ рдирд╣реАрдВ рдмрджрд▓рддрд╛)ред
рдХреИрд╢ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рджреВрд╕рд░рд╛ рддрд░реНрдХ рдЗрд╕реЗ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдПрдХ рдЦрд╛рд▓реА рд╕рд░рдгреАред
рдпрд╣ рд╕рд░рдгреА рдЖрдкрдХреЛ рдлрд╝реАрд▓реНрдб рдХреА рдПрдХ рд╕реВрдЪреА рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рдЬрд┐рд╕реЗ рдмрджрд▓рддреЗ рд╕рдордп рдЖрдкрдХреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЕрд░реНрдерд╛рддред рдПрдХ рдирдпрд╛ рд▓рд┐рдВрдХ рд▓реМрдЯрд╛рдПрдВред
useCallback
рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓рдмреИрдХ рдФрд░ useCallback
рдХрд░рдиреЗ рдХреА рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдзрд┐ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ: рдпрд╣рд╛рдБ рдкрд░ useCallback
рдХрд░реЗрдВ: https://codesandbox.io/s/0y7wm3pp1w
рд╣рдореЗрдВ рдПрдХ рд╕рд░рдгреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ?
рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреИрд╢ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдПрдХ рдХреНрд▓реЛрдЬрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреБрдЫ рдореВрд▓реНрдп рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ:
import React, { useCallback } from 'react'; import ReactDOM from 'react-dom'; import './styles.css'; function App({ a, text }) { const onClick = useCallback(e => alert(a), [ ]); return <button onClick={onClick}>{text}</button>; } const rootElement = document.getElementById('root'); ReactDOM.render(<App text={'Click me'} a={1} />, rootElement);
рдпрд╣рд╛рдБ, рдПрдк рдШрдЯрдХ рдкреНрд░реЛрдк рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ a
ред рдпрджрд┐ рдЖрдк рдЙрджрд╛рд╣рд░рдг рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рд╕рдм рдХреБрдЫ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рд╣рдо рдЕрдВрдд рддрдХ рдирд╣реАрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:
setTimeout(() => ReactDOM.render(<App text={'Next A'} a={2} />, rootElement), 5000);
рдЯрд╛рдЗрдордЖрдЙрдЯ рд╢реБрд░реВ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЬрдм рдЖрдк рдЕрд▓рд░реНрдЯ рдореЗрдВ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ 1
рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдордиреЗ рдкрд┐рдЫрд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рд╣реЗрдЬ рд▓рд┐рдпрд╛ рд╣реИ, рдЬрд┐рд╕рдиреЗ a
рдЪрд░ рдХреЛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ a
ред рдФрд░ рдЪреВрдВрдХрд┐ a
рдЪрд░ рд╣реИ, рдЬреЛ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рд╣реИ, рдФрд░ рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реИ, рд╣рдореЗрдВ рдпрд╣ рддреНрд░реБрдЯрд┐ рдорд┐рд▓реАред рдпрджрд┐ рд╣рдо рдЯрд┐рдкреНрдкрдгреА /*a*/
рд╣рдЯрд╛рддреЗ рд╣реИрдВ, рддреЛ рдХреЛрдб рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рджреВрд╕рд░реЗ рд░реЗрдВрдбрд░ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдЧреА рдХрд┐ рд╕рд░рдгреА рдореЗрдВ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдбреЗрдЯрд╛ рдЕрд▓рдЧ рд╣реИ рдФрд░ рдПрдХ рдирдпрд╛ рдлрд╝рдВрдХреНрд╢рди рд▓реМрдЯрд╛рдПрдЧрд╛ред
рдЖрдк рдпрд╣рд╛рдБ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╕реНрд╡рдпрдВ рдЖрдЬрд╝рдорд╛ рд╕рдХрддреЗ рд╣реИрдВ: https://codesandbox.io/s/6vo8jny1ln
рд░рд┐рдПрдХреНрдЯ рдХрдИ рдХрд╛рд░реНрдп рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдбреЗрдЯрд╛ рдХреЛ рдпрд╛рдж рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреИрд╕реЗ useRef
, useCallback
рдФрд░ useMemo
ред
рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рдорд╛рди рдХреЛ рдпрд╛рдж рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдж рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рд╡реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ useCallback
рдХрд╛рдлреА рд╕рдорд╛рди useCallback
, рддреЛ рдлрд┐рд░ useRef
рдЖрдкрдХреЛ рди рдХреЗрд╡рд▓ DOM рддрддреНрд╡реЛрдВ рдХреЗ рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рдХреИрд╢ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреНрд╖реЗрддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред
рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдХреИрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ useRef
рдЕрд▓рдЧ рдШрдЯрдХ рдЕрдкрдбреЗрдЯ рдХреЗ рдмреАрдЪ рдбреЗрдЯрд╛ рдХреЛ рдХреИрд╢ рднреА рдХрд░рддрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдХреИрд╢ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд▓рд┐рдП useRef
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрд╡рд╛рдВрдЫрдиреАрдп рд╣реИред рдпрджрд┐ рд╣рдорд╛рд░рд╛ рдлрд╝рдВрдХреНрд╢рди рдХреНрд▓реЛрдЬрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдХрд┐рд╕реА рднреА рд░реЗрдВрдбрд░ рдореЗрдВ, рдмрдВрдж рдореВрд▓реНрдп рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рд╣рдорд╛рд░рд╛ рдХреИрд╢реНрдб рдлрд╝рдВрдХреНрд╢рди рдкреБрд░рд╛рдиреЗ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдЕрдкрдбреЗрдЯ рд▓реЙрдЬрд┐рдХ рд▓рд┐рдЦрдиреЗ рдпрд╛ рдХреЗрд╡рд▓ рдЙрдкрдпреЛрдЧ useCallback
рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдирд┐рд░реНрднрд░рддрд╛ рддрдВрддреНрд░ рдХреЗ рдХрд╛рд░рдг рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
https://codesandbox.io/s/p70pprpvvx рдпрд╣рд╛рдВ рдЖрдк рд╕рд╣реА useCallback
рд╕рд╛рде рдХрд╛рд░реНрдпреЛрдВ рдХреЗ useCallback
рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЧрд▓рдд рдХреЗ рд╕рд╛рде рдФрд░ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рдеред
рднрд╛рдЧ 3. рд╕рд┐рдиреНрдереЗрдЯрд┐рдХ рдШрдЯрдирд╛рдПрдБ
рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛ рд▓рд┐рдпрд╛ рд╣реИ рдХрд┐ рдЗрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ рдФрд░ рдХреЙрд▓рдмреИрдХ рдореЗрдВ рдХреНрд▓реЛрдЬрд░ рдХреЗ рд╕рд╛рде рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдПрдХ рдФрд░ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрддрд░ рд╣реИ:
рдиреЛрдЯ: рдЕрдм Input
, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдордиреЗ рдКрдкрд░ рдХрд╛рдо рдХрд┐рдпрд╛, рд╡рд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХреЙрд▓рдмреИрдХ рдХреЗ рд▓рд┐рдП рд╡рд┐рд▓рдВрдм рдпрд╛ рдереНрд░реЙрдЯрд▓рд┐рдВрдЧ рдкреИрдЯрд░реНрди рдХреЗ рдЕрдиреБрд╕рд╛рд░ рджреЗрд░реА рдХреЗ рд╕рд╛рде рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмрд╣рд╕, рдЦреЛрдЬ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ - рдЦреЛрдЬ рдХреЗрд╡рд▓ рддрдм рд╣реЛрдЧреА рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЯрд╛рдЗрдкрд┐рдВрдЧ рд╡рд░реНрдг рдмрдВрдж рдХрд░ рджреЗрдЧрд╛ред
рдПрдХ рдШрдЯрдХ рдмрдирд╛рдПрдВ рдЬреЛ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рд░рд╛рдЬреНрдп рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ:
function SearchInput() { const [value, setValue] = useState(''); const timerHandler = useRef(); return ( <> <input defaultValue={value} onChange={e => { clearTimeout(timerHandler.current); timerHandler.current = setTimeout(() => { setValue(e.target.value); }, 300);
рдпрд╣ рдХреЛрдб рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд░рд┐рдПрдХреНрдЯ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдЕрдкрдиреЗ рдЕрдВрджрд░ рд╕рдореНтАНрдорд┐рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рддрдерд╛рдХрдерд┐рдд рд╕рд┐рдВрдереЗрдЯрд┐рдХ рдШрдЯрдирд╛ рд╣рдорд╛рд░реЗ рдСрдирдХреЙрдиреНрдЧ рдХреЙрд▓рдмреИрдХ рдореЗрдВ рд╣реЛ рдЬрд╛рддреА рд╣реИ, рдЬреЛ рдХрд┐ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдп рдХреЗ рдмрд╛рдж "рдХреНрд▓рд┐рдпрд░" рд╣реЛрдЧреА (рдлрд╝реАрд▓реНрдб рд░рд┐рдХреНрдд рд╣реЛрдЧреА)ред рдкреНрд░рджрд░реНрд╢рди рдХрд╛рд░рдгреЛрдВ рд╕реЗ, рд░рд┐рдПрдХреНрдЯ рд╣рд░ рдмрд╛рд░ рдПрдХ рдирдпрд╛ рдмрдирд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╣реА рд╡рд╕реНрддреБ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реИред
рдЕрдЧрд░ рд╣рдореЗрдВ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдорд╛рди рд▓реЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдлрд╝реАрд▓реНрдб рдХреЛ рдХреИрд╢ рдХрд░реЗрдВ:
function SearchInput() { const [value, setValue] = useState(''); const timerHandler = useRef(); return ( <> <input defaultValue={value} onChange={e => { clearTimeout(timerHandler.current); const pendingValue = e.target.value; // cached! timerHandler.current = setTimeout(() => { setValue(pendingValue); }, 300);
рдЖрдк рдпрд╣рд╛рдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ: https://codesandbox.io/s/oj6p8opq0z
рдмрд╣реБрдд рд╣реА рджреБрд░реНрд▓рдн рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдШрдЯрдирд╛ рдХреЗ рдкреВрд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдмрдирд╛рдП рд░рдЦрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк event.persist()
рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдШрдЯрдирд╛рдУрдВ рдХреЗ рдШрдЯрдирд╛-рдкреВрд▓ рд╕реЗ рд╕рд┐рдВрдереЗрдЯрд┐рдХ рдШрдЯрдирд╛ рдХрд╛ рдпрд╣ рдЙрджрд╛рд╣рд░рдгред
рдирд┐рд╖реНрдХрд░реНрд╖:
рд░рд┐рдПрдХреНрдЯ рдЗрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ:
- рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╕рджрд╕реНрдпрддрд╛ рдФрд░ рд╕рджрд╕реНрдпрддрд╛ рд░рджреНрдж рдХрд░реЗрдВ (рдЕрдирдорд╛рдЙрдВрдЯ рдШрдЯрдХ рдХреЗ рд╕рд╛рде);
- рдХреЛрдб рдХреА рдзрд╛рд░рдгрд╛ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдПрдВ, рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рджрд╕реНрдпрддрд╛ рдЬреЗрдПрд╕рдПрдХреНрд╕ рдХреЛрдб рдореЗрдВ рдЯреНрд░реИрдХ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред
рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдХреБрдЫ рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИ:
- рдкреНрд░реЙрдкреНрд╕ рдореЗрдВ рдУрд╡рд░рд░рд╛рдЗрдбрд┐рдВрдЧ рдХреЙрд▓рдмреИрдХ;
- рд╕рд┐рдВрдереЗрдЯрд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рд╡рд░реНрддрдорд╛рди рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдмрд╛рдж рд╕рд╛рдлрд╝ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред
рдУрд╡рд░рд░рд╛рдЗрдбрд┐рдВрдЧ рдХреЙрд▓рдмреИрдХ рдЖрдорддреМрд░ рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ vDOM рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдпрд╛рдж рд░рдЦрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдЕрдиреБрдХреВрд▓рди рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ PureComponent
рд╕реЗ рдЗрдирд╣реЗрд░рд┐рдЯреЗрдВрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ PureComponent
рдпрд╛ memo
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ рдХреИрд╢рд┐рдВрдЧ рдХрд░рдиреЗ рд╕реЗ PureComponent
рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ рдкреНрдпреЛрд░рдХреЙрдорд░реНрд╕ рдпрд╛ рдореЗрдореЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдн рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред рдХреИрд╢рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП, рдЖрдк рдпрд╛ рддреЛ classProperties (рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ useCallback
рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЬрдм рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реЛрдВ)ред
рд╕рд╣реА рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдкрдХреЛ рдХрд┐рд╕реА рдШрдЯрдирд╛ рд╕реЗ рдбреЗрдЯрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЙрди рдлрд╝реАрд▓реНрдб рдХреЛ рднреА рдХреИрд╢ рдХрд░реЗрдВ рдЬрд┐рдирдХреА рдЖрдкрдХреЛ рдЬрд╝рд░реВрд░рдд рд╣реИред