рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐
рдирдорд╕реНрдХрд╛рд░ рдкреНрд░рд┐рдп рдкрд╛рдардХ!
рдХреБрдЫ рд╕рдордп (рд▓рдЧрднрдЧ рдПрдХ рд╡рд░реНрд╖ рдкрд╣рд▓реЗ), рдореБрдЭреЗ рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, ReactJS рдореЗрдВ рдШрдЯрдХреЛрдВ рдХреЛ рд╕рд╢рд░реНрдд рд░реВрдк рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рд╕рд╛рде рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдкрд╣рд▓реА рдмрд╛рдд рдореИрдВрдиреЗ рддреИрдпрд╛рд░ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдФрд░ "рд╕рд░реНрд╡реЛрддреНрддрдо рдкреНрд░рдерд╛рдУрдВ" рдХреА рддрд▓рд╛рд╢ рд╢реБрд░реВ рдХреАред "
рд░рд┐рдПрдХреНрдЯ рдореЗрдВ рднреВрдорд┐рдХрд╛ рдЖрдзрд╛рд░рд┐рдд рдкреНрд░рд╛рдзрд┐рдХрд░рдг " рд▓реЗрдЦ
рдЙрдЪреНрдЪ-рдЖрджреЗрд╢ рдШрдЯрдХреЛрдВ (рдПрдЪрдУрд╕реА) рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реБрдЖред рд▓реЗрдХрд┐рди, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореБрдЭреЗ рдРрд╕рд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдорд┐рд▓рд╛, рдЬреЛ рдореБрдЭреЗ рд╕рдВрддреБрд╖реНрдЯ рдХрд░реЗред
рдЬрд╛рд╣рд┐рд░ рд╣реИ, рд╕рдм рдХреЗ рдмрд╛рдж, рд╡рд╣ рдХреБрдЫ рдпрд╛рдж рдХрд┐рдпрд╛ ...... рдпрд╛ рд╕рдВрджрд░реНрднреЛрдВ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдирд╣реАрдВ рдерд╛ред рд▓реЗрдЦрди рдХреЗ рд╕рдордп, рдореБрдЭреЗ рд╕реНрдЯреИрдХрдУрд╡рд░рдлреНрд▓реЛ рдореЗрдВ рдПрдХ рдЕрджреНрднреБрдд
рдЙрддреНрддрд░ рдорд┐рд▓рд╛ ред рдореИрдВ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рдорд╛рди рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реБрдЖред
рдЙрд╕ рд╕рдордп рдореИрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд░рд┐рдбреНрдпреВрдХреНрд╕-рдХрдиреЗрдХреНрдЯ (рдПрдирдкреАрдПрдо рдореЙрдбреНрдпреВрд▓) рд╕реЗ рдереЛрдбрд╝рд╛ рдкрд░рд┐рдЪрд┐рдд рдерд╛, рдФрд░ рдХрдиреЗрдХреНрдЯ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рдЬрд╛рд╡рдЯ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдореИрдВ рдмрд╣реБрдд рдЭреБрдХрд╛ рд╣реБрдЖ рдерд╛ред рдХрдиреЗрдХреНрдЯ рдбрд┐рд╡рд╛рдЗрд╕ рдХрд╛ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг
рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛
рд╣реИ ред
рд╕рдорд╛рдзрд╛рди рдХрд╛ рд╡рд░реНрдгрди
рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдШрдЯрдХ рдХреЛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо рдЬрд╛рдирдХрд╛рд░реА рдХреА рдХреНрдпрд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╢рд░реНрдд рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ (рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ, рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рд╣реИ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдирдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░)ред рд╣рдо рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рдПрдХ
рдЖрд╡рд╢реНрдпрдХрддрд╛ (рдпрд╛ рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛) рдХрд╣рддреЗ рд╣реИрдВред рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕рдВрддреБрд╖реНрдЯ рд╣реЛ рдЧрдИ рд╣реИ, рд╣рдо
рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛
рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреЗ рдПрдХ
рд╕реЗрдЯ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реЛ рд╕рдХрддреЗ
рд╣реИрдВ -
рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ ред рдпрд╣реА рд╣реИ, рдпрд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ:
function isSatisfied(requirement, credentials) { if (...) { return false; } return true; }
рдЕрдм рд╣рдордиреЗ рдХрдореЛрдмреЗрд╢ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреА рд╕реНрдерд┐рддрд┐ рдкрд░ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ?
1. рд╣рдо рдорд╛рдереЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
const requirement = {...}; class App extends Component { render() { const {credentials} = this.props; return isSatisfied(requirement, credentials) && <TargetComponent>; } }
2. рд╣рдо рдереЛрдбрд╝рд╛ рдЖрдЧреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд▓рдХреНрд╖реНрдп рдШрдЯрдХ рдХреЛ рджреВрд╕рд░реЗ рдореЗрдВ рд▓рдкреЗрдЯ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрд╛ рд╕рддреНрдпрд╛рдкрди рдХрд░реЗрдЧрд╛:
const requirement = {...}; class ProtectedTargetComponent extends Component { render() { const {credentials} = this.props; return ( isSatisfied(requirement, credentials) ? <TargetComponent {...this.props}> {this.props.children} </TargetComponent> : null ); } } class App extends Component { render() { const {credentials} = this.props; return <ProtectedTargetComponent/>; } }
рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд▓рдХреНрд╖реНрдп рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд░рдг рд▓рд┐рдЦрдирд╛ рдмрд╣реБрдд рд╣реА рдбрд░рд╛рд╡рдирд╛ рд╣реИред рд╣рдо рдЗрд╕реЗ рдХреИрд╕реЗ рд╕рд░рд▓ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ?
3. рд╣рдо HOC рддрдВрддреНрд░ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ ("рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд░рд┐рдбреНрдпреВрдХреНрд╕-рдХрдиреЗрдХреНрдЯ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рд╕рд╛рджреГрд╢реНрдп рджреНрд╡рд╛рд░рд╛"):
function protect(requirement, WrappedComponent) { return class extends Component { render() { const { credentials } = this.props; return ( isSatisfied(requirement, credentials) ? <WrappedComponent {...this.props}> {this.props.children} </WrappedComponent> : null ); } } } ... const requireAdmin = {...}; const AdminButton = protect(requireAdmin, Button); ... class App extends Component { render() { const {credentials} = this.props; return ( ... <AdminButton credentials={credentials}> Add user </AdminButton> ... ); } }
рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмреЗрд╣рддрд░, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдордирд╣реВрд╕ - рдЖрдкрдХреЛ рдШрдЯрдХреЛрдВ рдХреЗ рдкреВрд░реЗ рдкреЗрдбрд╝ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓реНрд╕ рдлреЗрдВрдХрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рд╕реЗ рдХреНрдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рдпрд╣ рдорд╛рдирдирд╛ тАЛтАЛрддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рд╕рд╛рдЦ рдкреВрд░реЗ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рд╡рд╕реНрддреБ рд╣реИред рдлрд┐рд░ рдлрд┐рд░ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд░рд┐рдбреНрдпреВрдХреНрд╕-рдХрдиреЗрдХреНрдЯ рдмрдЪрд╛рд╡ рдХреЗ рд▓рд┐рдП рдЖрддрд╛ рд╣реИред рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдЙрдкрдХрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд▓реЗрдЦ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдкрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреБрдЫ рд░рд┐рдПрдХреНрдЯрдЬреЗрдПрд╕
рд╕рдВрджрд░реНрднреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛
рд╣реИ ред
4. рд╕рдВрджрд░реНрдн рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдЕрдВрддрд┐рдо рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:
const { Provider, Consumer } = React.createContext(); function protect(requirement, WrappedComponent) { return class extends Component { render() { return ( <Consumer> { credentials => isSatisfied(requirement, credentials) ? <WrappedComponent {...this.props}> {this.props.children} </WrappedComponent> : null } </Consumer> ); } } } ... const requireAdmin = {...}; const AdminButton = protect(requireAdmin, Button); ... class App extends Component { render() { const { credentials } = this.props; return ( <Provider value={credentials}> ... <AdminButton> Add user </AdminButton> ... </Provider> ); } }
рдЕрдВрддрднрд╛рд╖рдг
рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдореЗрдВ рд╣реА рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╖рдпрд╛рдВрддрд░ рдерд╛ред рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдПрдХ рдореЙрдбреНрдпреВрд▓ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (
github ,
npm ), рдЬреЛ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рди рд╣реИ (GADUB рдореЗрдВ README.md рджреЗрдЦреЗрдВ рдФрд░ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ
рдбреЗрдореЛ рдХрд░реЗрдВ)ред
рдХреЗрд╡рд▓ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдореИрдВ рдбреЗрдореЛ рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рдПрдирдкреАрдПрдо рдкреИрдХреЗрдЬ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд╡рд╣рд╛рдВ рдореЙрдбреНрдпреВрд▓ рдХреЛрдб рдбрд╛рд▓рдирд╛ рдкрдбрд╝рд╛ред рд▓реЗрдХрд┐рди
рдПрдирдкреАрдПрдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдореЙрдбреНрдпреВрд▓
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдЖрд░рдмреАрдПрд╕реА-рдЧрд╛рд░реНрдб рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рдХреНрд░реЛрдо 69.0.3497.100)ред рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдмрд┐рд▓реНрдб рдореЗрдердб рдореЗрдВ рд╣реИ - рдореИрдВрдиреЗ рдкреИрдХреЗрдЬ рдХреЛ рдХреЙрдкреА рдХрд┐рдпрд╛ред json рдФрд░ webpack.config.prod.js рдПрдХ рд╕рдорд╛рди рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд╕рд╛рде
рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдлрд╛рдЗрд▓реЗрдВред
рдЪреВрдВрдХрд┐ рдореИрдВ рдлреНрд░рдВрдЯ-рдПрдВрдб рдбреЗрд╡рд▓рдкрд░ рдирд╣реАрдВ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдЕрднреА рднреА рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЕрдзреВрд░реЗ рдХрд╛рдо рд╣реИрдВ (рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рдХрдореА,
https://codesandbox.io рдореЗрдВ рдЕрдХреНрд╖рдорддрд╛ рдФрд░, рд╕рдВрднрд╡рддрдГ, рдЕрдиреНрдп рдЫреВрдЯреЗ рд╣реБрдП рдмрд┐рдВрджреБ)ред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЯрд┐рдкреНрдкрдгреА, рд╕реБрдЭрд╛рд╡ рдпрд╛ рдЕрдиреБрд░реЛрдз рд╣реИрдВ, рддреЛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ!
PPS: README.md рд╕рд╣рд┐рдд рд╡рд░реНрддрдиреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ, рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╕рдВрджреЗрд╢ рдпрд╛ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдХреЗ рд░реВрдк рдореЗрдВ рднреЗрдЬреЗрдВред