
рдорд╛рдзреНрдпрдо рдкрд░ рдкрдврд╝реЗ рдЧрдП рд▓реЗрдЦреЛрдВ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рд╣реЛрдХрд░, рдореИрдВрдиреЗ рдЕрдкрдирд╛ рд▓реЗрдЦ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдФрд░ рдЖрдкрдХреЛ рдмрддрд╛рдпрд╛ рдХрд┐ рдЖрдкрдХреЗ рд░рд┐рдПрдХреНрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд╕рдмрд╕реЗ рдЖрдо рдЧрд▓рддрд┐рдпреЛрдВ рд╕реЗ рдХреИрд╕реЗ рдмрдЪреЗрдВ рдФрд░ рдЖрдкрдХреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИред
рд╕рднреА рдХреЛрдб рдИрдПрд╕ 6 рд╢реИрд▓реА рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рджреЛрд╣рд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдмреИрдмрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдФрд░ рдЕрдиреНрдп рд╣реИрдВ рдЬреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ?)ред
рдореИрдВрдиреЗ рдкреНрд░рддреНрдпреЗрдХ рддреНрд░реБрдЯрд┐ рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╕рдордЭрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдЗрд╕рд▓рд┐рдП, рдореЗрд░рд╛ рд▓реЗрдЦ рдЙрди рдпреБрд╡рд╛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдкрд░ рдЕрдзрд┐рдХ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИ рдЬреЛ рдЕрднреА рднреА рдирдП рдЬреНрдЮрд╛рди рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдПрдХ рдЕрдиреБрднрд╡реА рдбреЗрд╡рд▓рдкрд░ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдЕрдкрдиреЗ рд▓рд┐рдП рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рдЪреАрдЬреЗрдВ рдкрд╛ рд╕рдХрддрд╛ рд╣реИред
рдпрджрд┐ рдЖрдк рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдмрд┐рд▓реНрд▓реА рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред
рдкреНрд░рддреНрдпреЗрдХ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рд╕реЗ рдкрд╣рд▓реЗ рдХреЛрд╖реНрдардХ рдореЗрдВ, рдореИрдВрдиреЗ рдПрд╕реНрд▓рд┐рдВрдЯ рдирд┐рдпрдо рдХрд╛ рд▓рд┐рдВрдХ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ред рдЖрдк рдмрд╛рдж рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдЦреЛрдЬ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
(рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ / рдирд┐рд╖рд┐рджреНрдз-рдШрдЯрдХ-рд╕рд╣рд╛рд░рд╛)
рдкрд╣рд▓реА рдЖрдо рдЧрд▓рддреА рд╣реИ 'рд╕реНрдЯрд╛рдЗрд▓' рдФрд░ 'рдХреНрд▓рд╛рд╕рдиреЗрдо' рдХреЛ рдЕрдкрдиреЗ рдХрдВрдкреЛрдиреЗрдВрдЯ рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рд░рд╛ рджреЗрдирд╛ред рдЗрд╕рд╕реЗ рдмрдЪреЗрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЕрдкрдиреЗ рдШрдЯрдХреЛрдВ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓рддрд╛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ 'classnames' рдФрд░ рдЕрдкрдиреЗ рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рднрд┐рдиреНрдирддрд╛ рдЬреЛрдбрд╝рдиреЗ (рдпрджрд┐ рдЖрдк рд╕реАрдПрд╕рдПрд╕ рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ):
const { hasError, hasBorder } = this.props; const componentClasses = classnames({ 'your-component-main-class': true, 'your-component-main-class_with-error': hasError, 'your-component-main-class_with-border': hasBorder, });
(рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ / рдирд┐рд╖реЗрдз-рдкреНрд░реЛ-рдкреНрд░рдХрд╛рд░)
рдЕрдЧрд▓реА рддреНрд░реБрдЯрд┐ рд╕реВрдЪрдирд╛рддреНрдордХ рдкреНрд░реЛрдкреЗрдЗрдЯреНрд╕ рдирд╣реАрдВ рд╣реИред PropTypes.any, PropTypes.array рдФрд░ PropTypes.object рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВред рдЕрдкрдиреА рдкреНрд░реЙрдкреНрд╕ рдХрд╛ рдпрдерд╛рд╕рдВрднрд╡ рд╡рд░реНрдгрди рдХрд░реЗрдВред рдпрд╣ рдЖрдкрдХреЛ рднрд╡рд┐рд╖реНрдп рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреЗ рджрд╕реНрддрд╛рд╡реЗрдЬ рдЫреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рдФрд░ рдЖрдк (рдпрд╛ рдЕрдиреНрдп рдбреЗрд╡рд▓рдкрд░) рдЖрдкрдХреЛ рдХрдИ рдмрд╛рд░ рдзрдиреНрдпрд╡рд╛рдж рджреЗрдВрдЧреЗред
class MyComponent extends React.Component { static propTypes = { user: PropTypes.shape({ id: PropTypes.number, name: PropTypes.string, }), policies: PropTypes.arrayOf(PropTypes.shape({ id: PropTypes.number, type: PropTypes.string, value: PropTypes.string, }), } }
(рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ / рдирд┐рд╖рд┐рджреНрдз-рд╡рд┐рджреЗрд╢реА-рдкреНрд░реЛрдк-рдкреНрд░рдХрд╛рд░)
рдЪрд▓реЛ PropTypes рдХреЗ рд╕рд╛рде рдЬрд╛рд░реА рд░рдЦреЗрдВред рдХрд┐рд╕реА рдЕрдиреНрдп рдШрдЯрдХ рдХреЗ рдкреНрд░реЛрдкрдЯреАрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ:
import SomeComponent from './SomeComponent'; SomeComponent.propTypes;
рдПрдХ рдРрд╕реА рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ рдЬрд┐рд╕рдореЗрдВ рдЖрдк рдЕрдкрдиреЗ рд╡реИрд╢реНрд╡рд┐рдХ рдкреНрд░реЛрдкреЗрдЗрдЯреНрд╕ рдХреЛ рдХреНрд░рдо рдореЗрдВ рд░рдЦреЗрдВрдЧреЗ:
import { userShape, policiesArray } from '../common/global_prop_types';
рдпрд╣ рдмреЗрдмрд▓-рдкреНрд▓рдЧрдЗрди-рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдореЗрд╢рди-рд░рд┐рдПрдХреНрд╢рди- рдкреНрд░реЛ -рдкреНрд░реЙрдк-рдЯрд╛рдЗрдк рдкреНрд░реЙрдкрдЯреАрдЬрд╝ рдХреЛ рдкреНрд░реЛрдбрдХреНрд╢рди рдХреЛрдб рд╕реЗ рд╣рдЯрд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ рдФрд░ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдереЛрдбрд╝рд╛ рдЖрд╕рд╛рди рдмрдирд╛ рджреЗрдЧрд╛ред
(рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ / рдирд╣реАрдВ-рдПрдХреНрд╕реЗрд╕-рд╕реНрдЯреЗрдЯ-рдЗрди-рд╕реЗрдЯрд╕реНрдЯреЗрдЯ)
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддреНрд░реБрдЯрд┐ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ:
class MyComponent extends React.Component { state = { counter: 1, }; incrementCounter = () => this.setState({ counter: this.state.counter + 1 }); massIncrement = () => { // this code will lead to not what you expect this.incrementCounter(); this.incrementCounter(); } }
рдХреНрдпреЛрдВрдХрд┐ setState рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд░рд╛рдЬреНрдп рдХрд╛ рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░рд╛рдЬреНрдп рдХрд╛рд░реНрдп рд╕рдорд╛рди рд╣реЛрдЧрд╛ред
this.state.counter 1 рд╣реЛрдЧрд╛ рдФрд░ рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ:
incrementCounter = () => this.setState({ counter: 1 + 1 }); incrementCounter = () => this.setState({ counter: 1 + 1 });
рдЗрд╕рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рд╕реЗрдЯрд╕реНрдЯреИрдЯ рдХреЙрд▓рдмреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд░рд╛рдЬреНрдп рдХреЛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ:
incrementCounter = () => this.setState((prevState) => ({ counter: prevState.counter + 1 }));
(рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ / рдирд╣реАрдВ-рд╕рд░рдгреА-рд╕реВрдЪрдХрд╛рдВрдХ-рдХреБрдВрдЬреА)
рдпрд╣ рддреНрд░реБрдЯрд┐ рднреА рдмрд╣реБрдд рдЖрдо рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдзреНрдпрд╛рди рд╕реЗ рдкрдврд╝реЗрдВ рдФрд░ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╕рд╕реЗ рдмрдЪреЗрдВ:
users.map((user, index) => ( <UserComponent {...user} key={index} /> ));
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛, рдбреЛрдо рддрддреНрд╡ рдХреЗ рд▓рд┐рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░реЛрдк рдХреБрдВрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдШрдЯрдХ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдЦреЛрдЬрдиреЗ рдФрд░ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ (рд╕рдм рдХреБрдЫ, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЗрд╕реЗ рдЙрджреНрджреЗрд╢реНрдп рдкрд░ рд╕рд░рд▓реАрдХреГрдд рдХрд┐рдпрд╛ рд╣реИ)ред
рдпрджрд┐ рдЖрдк рд╕рд░рдгреА рдХреЗ рдмреАрдЪ рдореЗрдВ рдПрдХ рдирдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ? рдПрдХ рдирдП рдЬреЛрдбрд╝реЗ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рд░рд┐рдПрдХреНрдЯ рдХреЛ рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдХреЙрдорд░реНрд╕ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЕрджреНрд╡рд┐рддреАрдп рдХреБрдВрдЬрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рддрд░реАрдХрд╛ рд╣реИ рд╡рд╣ рдЖрдИрдбреА рдЬреЛ рдЖрдк рдЕрдкрдиреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:
users.map((user) => ( <UserComponent {...user} key={user.id} /> ));
(рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ / рдирд╣реАрдВ-рдорд╛рдЙрдВрдЯ-рд╕реЗрдЯ-рд░рд╛рдЬреНрдп), (рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ / рдирд╣реАрдВ-рдХрд┐рдпрд╛-рдЕрдкрдбреЗрдЯ-рд╕реЗрдЯ-рд░рд╛рдЬреНрдп)
рдпрд╣ рддреНрд░реБрдЯрд┐ рдореЗрд░реЗ рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рднреА рдмрд╣реБрдд рдЖрдо рд╣реИред рдпрджрд┐ рдЖрдк рдХрдВрдкреЛрдиреЗрдВрдЯрдбрд╛рдпрдбрдбреЗрдЯ рд╡рд┐рдзрд┐ рдореЗрдВ рд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдПрдХ рдЕрдирдВрдд рд░реА-рд░реЗрдВрдбрд░ рд▓реВрдк рдорд┐рд▓рддрд╛ рд╣реИред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рддрдм рдкреБрди: рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдПрдХ рдЪреЗрдХ рд╢реБрд░реВ рдХрд░рддреА рд╣реИ рдЬрдм рдШрдЯрдХ рд░рд╛рдЬреНрдп рдпрд╛ рдкреНрд░реЙрдкреНрд╕ рдмрджрд▓рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк DOM рдореЗрдВ рдорд╛рдЙрдВрдЯ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╕реНрдЯреЗрдЯ рдмрджрд▓рддреЗ рд╣реИрдВ рдпрд╛ рдкрд╣рд▓реЗ рд╣реА рдЕрдкрдбреЗрдЯ рд╣реЛ рдЪреБрдХреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдмрд╛рд░-рдмрд╛рд░ рдЪреЗрдХ рдЪрд▓рд╛рдПрдВрдЧреЗ ...
рдХрдВрдкреЛрдиреЗрдВрдЯрдбрд┐рдорд╛рдЙрдВрдЯ рдореЗрдВ рд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╕рдордп, рдЖрдк рдШрдЯрдХ рдХреЛ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рд░реЗрдВрдбрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдбреАрдУрдПрдо рдореЗрдВ рдШрдЯрдХ рдХреЗ рдорд╛рдЙрдВрдЯ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рдмрд╛рд░ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдпрджрд┐ рдЖрдкрдХреЛ рдШрдЯрдХ рдХреЛ рдорд╛рдЙрдВрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдбреЗрдЯрд╛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдХрдХреНрд╖рд╛ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ:
class MyComponent extends React.Component { componentDidMount() { this.veryImportantDataThatCanBeStoredOnlyAfterMount = 'I'll be back!'; } veryImportantDataThatCanBeStoredOnlyAfterMount = void 0; render() { return <div /> } }
(рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ / рдирд╣реАрдВ-рдкреНрд░рддреНрдпрдХреНрд╖-рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди-рдЕрд╡рд╕реНрдерд╛)
рд░рд╛рдЬреНрдп рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рдПрдХ рдмрд╣реБрдд рдмрдбрд╝реА рдЧрд▓рддреА рд╣реИред рдПрдХ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рд░рд╛рдЬреНрдп рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рд╕реЗ рдЕрд╡рд╛рдВрдЫрдиреАрдп рдХреАрдбрд╝реЗ рдкреИрджрд╛ рд╣реЛрдВрдЧреЗ рдФрд░, рдмрдбрд╝реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВред рдореЗрд░реА рдирд┐рдЬреА рд░рд╛рдп рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдЬреАрдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реИ, рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдФрд░ рдЖрдк рдЙрдиреНрд╣реЗрдВ Redux / MobX / рдХрд┐рд╕реА рднреА рд░рд╛рдЬреНрдп рдкреНрд░рдмрдВрдзрди рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рдбреАрдк рдХреНрд▓реЛрди рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓реЙрдХреЗрдЯ рд╕реЗ рдХреНрд▓реЛрди рд╕реНрдерд┐рддрд┐ рддрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдХреНрд▓реЛрди рдХреЛ рдореНрдпреВрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдирдП JS рдлрд╝реАрдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг :
updateStateWrong = () => this.state.imRambo = true; updateStateRight = () => { const clonedState = cloneDeep(this.state); clonedState.imAGoodMan = true; this.setState(clonedState); } updateWithImmutabelJS = () => { const newState = this.state.data.set('iUseImmutableStructure', true); this.setState(data: newState); } updateWithDestructuring = () => this.setState({ ...this.state, iUseDestructuring: true });
(рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ / рдкрд╕рдВрдж-рд╕реНрдЯреЗрдЯрд▓реЗрд╕-рдлрдВрдХреНрд╢рди)
рдпрд╣ рдирд┐рдпрдо рддреНрд░реБрдЯрд┐ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЖрдкрдХреЗ рдХреЛрдб рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдЕрдзрд┐рдХ рд╕реБрдзрд╛рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдлрд┐рд░ рднреА рдЖрдкрдХреЛ рдЗрд╕ рдирд┐рдпрдо рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред рдпрджрд┐ рдЖрдкрдХрд╛ рдШрдЯрдХ рд░рд╛рдЬреНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдПрдХ рд╕реНрдЯреЗрдЯрд▓реЗрд╕ рдШрдЯрдХ рдмрдирд╛рдПрдВ (рдореИрдВ 'рд╢реБрджреНрдз рдШрдЯрдХ' рд╢рдмреНрдж рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ):
class MyComponentWithoutState extends React.Component { render() { return <div>I like to write a lot of unneeded code</div> } } const MyPureComponent = (props) => <div>Less code === less support</div>
(рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ / рдкреНрд░рд╕реНрддрд╛рд╡-рдкреНрд░рдХрд╛рд░)
рдпрджрд┐ рдЖрдкрдХрд╛ рдШрдЯрдХ рдкреНрд░реЙрдкреНрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рддреЛ рд╣рдореЗрд╢рд╛ рдкреНрд░реЙрдкреНрд╕ рдЯрд╛рдЗрдк рдЪреЗрдХрд┐рдВрдЧ (рдкреНрд░реЛрдкреЗрдкреНрдЯреНрд╕) рдЬреЛрдбрд╝реЗрдВред рдЗрд╕реЗ рдЕрдкрдиреЗ рдХреЛрдб рдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЛрдЪреЗрдВред рдПрдХ рдмрд╛рд░ рд╕реЗ рдЕрдзрд┐рдХ рдЖрдк рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдЗрд╕ (рдФрд░ рд╢рд╛рдпрдж рдореЗрд░реЗ рд▓рд┐рдП :)) рдХреЗ рд▓рд┐рдП 'рдзрдиреНрдпрд╡рд╛рдж' рдХрд╣реЗрдВрдЧреЗред PropTypes рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдФрд░ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ рдХрд┐ рдЖрдкрдХрд╛ рдШрдЯрдХ рдХреНрдпрд╛ рдкреНрд░рд╕реНрддреБрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдЙрд╕реЗ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдПред
MyPureComponent.propTypes = { id: PropTypes.number.isRequired, // And I know that without id component will not render at all, and this is good. }
(рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ / jsx-no-bind)
рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд╛рдорд╛рдиреНрдп рдФрд░ рдмрдбрд╝реА рдЧрд▓рддреА рдЬреЛ рдореИрдВрдиреЗ рдХрдИ рдмрд╛рд░ рдХреЛрдб рдореЗрдВ рджреЗрдЦреАред Jsx рдореЗрдВ рдмрд╛рдЗрдВрдб рдФрд░ рдПрд░реЛ рдлрдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВред рдХрднреА рдирд╣реАрдВред рдЕрдзрд┐рдХред
рдирд░рдХ рдореЗрдВ рд╕рдмрд╕реЗ рдЧрд░реНрдо рд╕реНрдерд╛рди рдЙрд╕ рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЗрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ JSX рдореЗрдВ .bind (рдпрд╣) рд▓рд┐рдЦрддрд╛ рд╣реИред
рд╣рд░ рдмрд╛рд░ рдПрдХ рдШрдЯрдХ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЖрдкрдХрд╛ рдлрд╝рдВрдХреНрд╢рди рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдпрд╣ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдмрд╣реБрдд рдзреАрдорд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рдХреЛ рдЕрдзрд┐рдХ рдмрд╛рд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛)ред .Bind (рдпрд╣) рдХреЗ рдмрдЬрд╛рдп, рдЖрдк рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдПрд░реЛ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
class RightWayToCallFunctionsInRender extends React.Component { handleDivClick = (event) => event; render() { return <div onClick={this.handleDivClick} /> } } const handleDivClick = (event) => event; const AndInPureComponent = () => { return <div onClick={handleDivClick} /> }
(рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ / jsx-no-target-blank)
рд╕реБрд░рдХреНрд╖рд╛ рдмрдЧ рдпрд╣ рдореБрдЭреЗ рдмрд╣реБрдд рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд▓реЛрдЧ рдЕрдм рднреА рдпрд╣ рдЧрд▓рддреА рдХрд░рддреЗ рд╣реИрдВред рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧреЛрдВ рдиреЗ 2017 рдореЗрдВ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд▓реЗрдЦ рд▓рд┐рдЦреЗред
рдпрджрд┐ рдЖрдк рд▓рдХреНрд╖реНрдп = '_ blank' рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд▓рд┐рдВрдХ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ rel = 'noreferrer noopener' рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВред рдмрд╣реБрдд рд╕рд░рд▓:
<a href="https://example.com" target="_blank" rel="noreferrer noopener" />
рдЖрдкрдХрд╛ рдзрдиреНрдпрд╡рд╛рдж
рдпрд╣ рд╕рдм рдореИрдВ рдЖрдкрдХреЛ рдЗрд╕ рд▓реЗрдЦ рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдмрддрд╛рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдореИрдВ рдмрд╣реБрдд рдЖрднрд╛рд░реА рд░рд╣реВрдВрдЧрд╛ рдпрджрд┐ рдЖрдк, рдореЗрд░реЗ рдкрд╛рдардХ, рдореБрдЭреЗ рдЕрдкрдиреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдпрд╛ рдЯрд┐рдкреНрдкрдгреА рджреЗрдВ рдФрд░ рдЗрд╕ рдЖрд▓реЗрдЦ рдореЗрдВ рдмрддрд╛рдИ рдЧрдИ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдкрдиреА рд░рд╛рдп рд╕рд╛рдЭрд╛ рдХрд░реЗрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рдореБрдЭреЗ рдХреЛрдб рдореЗрдВ рдореЗрд░реА рдФрд░ рдЖрдкрдХреА рдЧрд▓рддрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрди рд╕рднреА рдЪреАрдЬреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдмрддрд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╕рдордЭрддреЗ рд╣реИрдВред рдлрд┐рд░ рд╕реЗ рд╢реБрдХреНрд░рд┐рдпрд╛!