GetDerivedStateFromProps рдореЗрдВ prevProps рдХреА рдХрдореА рдХрд╛ рд╕рдорд╛рдзрд╛рди

рдирдорд╕реНрдХрд╛рд░ рджреЛрд╕реНрддреЛрдВ!


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


рд░рд┐рдПрдХреНрдЯрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рдирд╛рд░рд╛рдЬ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ рдбреЗрд╡рд▓рдкрд░реНрд╕ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ: рдареАрдХ рд╣реИ, рд╣рдордиреЗ рдЖрдкрдХреЛ рдкреНрд░реЙрдкрдкреНрд░реЙрдкреНрд╕ рдирд╣реАрдВ рджрд┐рдП рд╣реИрдВ, рдпрд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рдХреБрдЫ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЗрдВ, рдкреНрд░реЙрдкреНрд░реЙрдкреНрд╕ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдареАрдХ рд╣реИ, рдЖрдк рд╡рд╣рд╛рдВ рд░рд╣рддреЗ рд╣реИрдВ, рдмрд╕ рдЙрдиреНрд╣реЗрдВ рдПрдХ рд░рд╛рдЬреНрдп рдореЗрдВ рд░рдЦреЗрдВ, рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рд╡реЗ рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдЕрдкрдиреЗ рдЫреЛрдЯреЗ рдмреИрд╕рд╛рдЦреА рдмрдирд╛рддреЗ рд╣реИрдВред рдирдпрд╛ рдЕрдЪреНрдЫрд╛ рдХреЛрдбред рдпрд╣ рд╕рдм рдЖрд╕рд╛рди рд╣реИ, рдмреЗрд╢рдХ, рдЖрдк рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдорд╛рдл рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕ рддрдереНрдп рд╕реЗ рдирд╛рд░рд╛рдЬ рдерд╛ рдХрд┐ рдЕрдм рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣ рд╕рдВрджрд░реНрдн рдирд╣реАрдВ рд╣реИ, рдореЗрд░реЗ рдХрдорд░реЗ рдХреЛ рдИрдВрдЯ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рд╕реЗ рдХреБрдЫ рднреА рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗ рд░рд╣рд╛ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдореЗрд░реЗ рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреЛ рднреА рдирд╣реАрдВ рд╕реБрдирд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдПрдХ рдмрд╛рдд рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдпрд╣ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рд╕рднреА рдмреИрд╕рд╛рдЦрд┐рдпреЛрдВ рдХреЛ рдЫрд┐рдкрд╛рдПрдЧрд╛ рдФрд░ рдореЗрд░рд╛ рдХреЛрдб рдЕрдЬреАрдм рд▓рдЧреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдмреЛрдирд▓реЗрд╕ (рдФрд░ рдмреЛрдирд▓реЗрд╕?)ред


рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдореБрдЭреЗ рдШрдЯрдХ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ prevProps рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдореИрдВ рдпрд╣ рднреА рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рджрд┐рдЦреЗ, рдФрд░ рд╕реНрдерд┐рд░ getDerivedStateFromProps (рдпрд╣ рдПрдХ рдореВрд░реНрдЦ рд╣реИ!) рдореЗрдВ рдЗрд╕ рдЬрд╛рджреВ рдХреЗ рдмрд┐рдирд╛ рдЬреАрдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред рджреЛ рджрд┐рдиреЛрдВ рдХреА рдкреАрдбрд╝рд╛ рдФрд░ рдЖрддреНрдо-рд╕реБрдзрд╛рд░ рдФрд░ рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИ, рдореИрдВрдиреЗ рдПрдХ рдЪреВрд╣реЗ рдХреЛ рдЬрдиреНрдо рджрд┐рдпрд╛ред


рд╕реНрдерд╛рдкрдирд╛


npm install --save state-master 

рдХреЗ рдЙрдкрдпреЛрдЧ


рдмрд╕ рдПрдХ рд╣реА getDerivedStateFromProps рдФрд░ ComponentsDidUpdate рд▓рд┐рдЦреЗрдВ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдВрд╢реЛрдзрд┐рддред
рд╣рдо рдЕрдкрдиреЗ рдШрдЯрдХ рдХреЛ "withStateMaster" рдореЗрдВ рд▓рдкреЗрдЯрддреЗ рд╣реИрдВ, рд╡рд╣рд╛рдБ "рдкреНрд░реЙрдкрд░" рдХреА рдПрдХ рд╕реВрдЪреА рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдЖрдкрдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ


 import {Component} from 'react' import {withStateMaster, registerContext, unregisterContext} from 'state-master'; //  "",     const PROP_LIST = ['width', 'height', 'bgColor', 'fontSize', 'autoSize']; //   ,     const PROP_LIST = 'value'; //     const INITIAL_STATE = { width: 1000, height: 500 }; class ContainerComponent extends Component { static displayName = 'Container'; static getDerivedStateFromProps(data) { const { nextProps, prevProps, state, isInitial, changed, changedProps, isChanged, add, addIfChanged, isChangedAny, addIfChangedAny, isChangedAll, call, get } = data; //      ,   ,      PROPS_LIST //   ,       if (isInitial) { //   "name"    "value"     add('name', value); //   "name"       add('name'); } // changedProps  ,       if (changedProps.indexOf('value') !== -1) { add('value'); } //  true   prop -  if (isChanged('autoSize')) { add('autoSize'); } //  true   prop     (  true) if (isChanged('autoSize', true)) { add('autoSize', true); } // changed  true,     -  if (changed) { add('somethingChanged', true); } //  true,     -  //   ,     if (isChangedAny()) { add('somethingChanged', true); } //  true,      -  if (isChangedAny('bgColor', 'fontSize', ...)) { const {bgColor, fontSize} = nextProps; add('style', {bgColor, fontSize}); } //  true,      PROPS_LIST -  if (isChangedAll()) { add('allChanged', true); } //  true,      -  if (isChangedAll('width', 'height', ...)) { const {width, height} = nextProps; add('size', width + 'x' + height); //     //   ,   setTimeout(() => this.changeSomething(), 0); //   - ,        //       componentDidUpdate call(() => { this.initNewSizes(width, height); }); } //   "add",   prop -  addIfChanged('name', value); addIfChanged('name'); //   "add",  - prop   PROPS_LIST -  addIfChangedAny('name', value); addIfChangedAny('name'); //      null //   ,  ,     //    console.log(get()); //     "add",      //      ,       "add" return { size: nextProps.width + 'x' + nextProps.height } } constructor(props) { super(props); //  "registerContext",    this   getDerivedStateFromProps //     ,     "registerContext",       registerContext(this); } //      componentDidUpdate(data) { const { prevProps, prevState, snapshot, changedProps, changed, isChanged, isChangedAny, isChangedAll } = data; if (isChanged('value')) { const {value} = this.props; this.doSomeAction(value); } } componentWillUnmount() { //    ,  "registerContext"     unregisterContext(this); } render() { const {style, size} = this.state; return ( <div className="container" style={style}> Size is {size} </div> ) } } export const Container = withStateMaster(ContainerComponent, PROP_LIST, INITIAL_STATE); 

рдпрджрд┐ рдШрдЯрдХ рджреВрд╕рд░реЗ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ, рддреЛ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЛ рдкрд╛рд╕ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдорд╛рддрд╛-рдкрд┐рддрд╛ getDerivedStateFromProps рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдП


 export const Container = withStateMaster(ContainerComponent, PROP_LIST, null, ParentalComponent); 

рдпрд╣ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдореЗрд░рд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ (рд╣рд╛рд▓рд╛рдБрдХрд┐ рд╢рд╛рдпрдж рдореИрдВрдиреЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдирд╣реАрдВ рд╕рдордЭрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ)ред


рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рд░рд┐рдПрдХреНрдЯ рдХреЗ рдирдП рдХреИрдирди рдХрд╛ рд╡рд┐рд░реЛрдз рдХрд┐рдпрд╛, рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рджрд┐рди рдореИрдВ рдЦреБрдж рдХреЛ рд╡рд┐рдирдореНрд░ рдХрд░реВрдВ рдФрд░ рд╣рд░ рдЪреАрдЬ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреВрдВ рдЬреИрд╕рд╛ рдХрд┐ рдЙрд╕реЗ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред


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

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


All Articles