рдХреНрдпрд╛ рдпрд╣ Redux рдХреЗ рдмрд┐рдирд╛ рд╕рдВрднрд╡ рд╣реИ?

рдЖрдЬ рдЖрдк рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕реНрдерд╛рди рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ / рд░рд┐рдбрдХреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдорд╣рд╛рди рд╣реИ, рдХреЛрдИ рд╕рд╡рд╛рд▓ рдирд╣реАрдВ рдкреВрдЫрд╛ рдЧрдпрд╛ред Redux рдХреЗ рд▓рд┐рдП рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдпрд╣ рд╕рдВрднрд╡ рд╣реИред рдпрджрд┐ рдЖрдк рдереЛрдбрд╝рд╛ рд╕рд╛ Google рдХрд░рддреЗ рд╣реИрдВ, рддреЛ Habr├й рдкрд░ рдПрдХ рдареЛрд╕ рд▓реЗрдЦ рд╣реИ , рдЬрд╣рд╛рдВ рд▓реЗрдЦрдХ рдПрдХ рд╣реА рд╕рд╡рд╛рд▓ рдкреВрдЫрддрд╛ рд╣реИред рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг (рдЯреЙрдбрд▓рд┐рд╕реНрдЯ) рдХреЗ рд╕рд╛рде рдПрдХ рд▓реЗрдЦ рдореЗрдВ, рдЗрд╕ .upateViews () рд╡рд┐рдзрд┐ рдХреЛ рдЕрдХреНрд╕рд░ (рд╕рд╛рдд рд╕реЗ рдЖрда рдмрд╛рд░) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд▓рдЧрддрд╛ рд╣реИред

рдпрд╣рд╛рдВ рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рдЕрд╡рд▓реЛрдХрдиреАрдп рдореЙрдбрд▓ рд╣реИ, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдпреЛрдЧреНрдп рд╣реИ, рдЕрд╡рд▓реЛрдХрдиреАрдп рд╣реИ, рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рд╣реИ рдЬреЛ рдПрдХ рдореЙрдбрд▓ рдмрдирд╛рдирд╛ рд╣реИред

рдореЙрдбрд▓ рдмрдирд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдбрд┐рдЬрд╛рдЗрди (рд╡рд╛рд╕реНрддреБрдХрд▓рд╛) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрдж:

рд╕реВрдЪрдХрд╛рдВрдХ - рдХрдЪреНрдЪрд╛ рдбреЗрдЯрд╛
рдЗрддрд┐рд╣рд╛рд╕ - рд╕рд░рдгреА [рдореЙрдбрд▓]
рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ - рдореЙрдбрд▓
рджреГрд╢реНрдп - рддреНрд░реБрдЯрд┐рдпрд╛рдВ, рдлреЛрдХрд╕, рдЭрдВрдбреЗ

index.jsx - рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдХреНрд░реАрди рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЧреНрд░рд╛рдо рдПрдВрдЯреНрд░реА рдкреЙрдЗрдВрдЯред рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рд╕рднреА рдШрдЯрдХреЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреА рд╣реИ, рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░рд╢реНрди рдмрдирд╛рддреА рд╣реИ, рдирдП рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдШрдЯрдХреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рддреИрдпрд╛рд░ рдХрд░рддреА рд╣реИред

// index.jsx <History> <Observer> <HeaderView /> <MainView /> </Observer> </History> 

рдХрдИ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдореЙрдбрд▓ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Observer.jsx рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреЗрдЯреНрдпрд╛ рдПрдХ рдСрдлрд░ рдлреЙрд░реНрдо рднрд░рддрд╛ рд╣реИ рдФрд░ рдкреЗрдЬ рд╣реЗрдбрд░ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдХрд╛ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рджреЗрдЦрддрд╛ рд╣реИред рдСрдмреНрдЬрд╝рд░реНрд╡рд░ рдореЙрдбрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдПрдкреАрдЖрдИ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ: рдЪрд╛рдЗрд▓реНрдб рдШрдЯрдХреЛрдВ рдХреЛ рдСрдирдореЙрдбреЗрд▓рдЪреЗрдВрдЬ (рдХреНрд╖реЗрддреНрд░, рдореВрд▓реНрдп)ред

History.jsx рдореЙрдбрд▓ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХрд╛ рдПрдХ рдвреЗрд░ рд╣реИ, рдЬрд╣рд╛рдВ рдПрдкреА: рдХрдорд┐рдЯ рдФрд░ рд░реЛрд▓рдмреИрдХред

Model.js рд╡рд╣ рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреЗрди рд╕реЗ рджрд░реНрдЬ рдХрд░ рд╕рдХрддрд╛ рд╣реИ - рдЕрд░реНрдерд╛рдд, рд╕рдмрд╕реЗ рдореВрд▓реНрдпрд╡рд╛рдиред рдореЙрдбрд▓ рдореЗрдВ рдЕрдиреНрдп рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдореЙрдбрд▓ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдШрдЯрдХ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдирд┐рдпрдорд┐рдд рдЬреЗрдПрд╕ рд╡рд░реНрдЧ рд╣реИред

 class Model { constructor(other = {}) {} // copy constructor (and default too) isEqual(other) {} // operator == less(other) {} // operator< swap(other) {} hash() {} fieldNameConstrains() {} //see below please } 

рдХреЙрдкреА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдХрдо рд╕реЗ рдХрдо рдЗрддрд┐рд╣рд╛рд╕ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЗрд╕реНрдХреНрд╡рд▓ рд╡рд┐рдзрд┐ рдкреЙрдкрдЕрдк-рдЕрдирд╕реИрд▓реЗрдб-рдЪреЗрдВрдЬреЗрд╕ рдХреЗ рд▓рд┐рдП рд╣реИ (рдЬреЛ рд░рд╛рдЬреНрдп рдореЗрдВ рдзреНрд╡рдЬ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ)ред FieldNameConstrains рд╡рд┐рдзрд┐ рдЖрд╢реНрд░рд┐рдд рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИред

рдореЛрдЯреЗ рддреМрд░ рдкрд░, рдЕрдЧрд░ рдЖрд╢реНрд░рд┐рдд рдХреНрд╖реЗрддреНрд░ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рд▓рдЧрд╛рддрд╛рд░ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред

 class Model { // constrains // distance <== velocity * time velocityConstrains(newVelocity) { this.velocity = newVelocity; this.distance = this.velocity * this.time; } timeConstrains(newTime) { тАж } distanceConstrains(newDistance) { this.distance = newDistance; this.time = this.distance / this.velocity; } } 

рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЕрдиреБрднрд╡ рд╕реЗ, model.field.onchange рдЬреИрд╕реА рдХреЛрдИ рдЪреАрдЬрд╝ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХрднреА-рдХрднреА рдЖрдкрдХреЛ рдХреЙрдкреА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдСрдиреНрдЪреЗрдВрдЬ рдШрдЯрдирд╛рдУрдВ рдХреА рдмрд┐рд▓реНрдХреБрд▓ рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред

View.jsx

 class View extends React.Component { state = { errors: {}, focus: {}, тАж } render() { тАж <input value={this.props.model.title} onChange={e => this.props.onModelChange('title', e.target.value)} /> тАж } } 

рдорд╛рдиреНрдпрдХрд░рдгред рдореЙрдбрд▓ рдореЗрдВ рд╕рддреНрдпрд╛рдкрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рджреЗрдЦрдиреЗ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рджреГрд╢реНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рд╕реНрдХреНрд░реАрди рд╣реИ рдФрд░ рдпрд╣ рдирд╣реАрдВ рдХрд┐ рдкреВрд░реЗ рдореЙрдбрд▓ рдХреЛ рд╕реНрдХреНрд░реАрди рдкрд░ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рд╡рд┐рдзреЗрдп рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╣реИрдВред рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рджреЛ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╣реИрдВ: 1) рд╣рдо рдлреЙрд░реНрдо рдореЗрдВ рд╕рднреА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдкрд╛рддреЗ рд╣реИрдВ рдпрд╛ 2) рд╣рдо рдкрд╣рд▓реА рддреНрд░реБрдЯрд┐ рдкрд╛рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП

 class View extends React.Component { onClickSaveButton() { const mapper = { title: () => model.title.length && !maxLenValidator(model.title, 25), price: () => !(model.price % 40 == 0), url: () => !urlValidator(model.url), тАж } const errors = map(mapper, (validator, key) => { return validator() ? key : undefined; }).filter(Boolean); } //       

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

рдЙрддреНрдкрд╛рджрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЕрдм рдПрдХ рд╕рд╛рд▓ рдХреЗ рд▓рд┐рдП рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдХрддрд╛рдИ рдХрд░ рд░рд╣рд╛ рд╣реИ - рдпрд╣ рдмреИрдирд░ рд╕рд╣рд┐рдд рд╡рд┐рдЬреНрдЮрд╛рдкрди рдЕрднрд┐рдпрд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИред рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рд░реВрдк - рдПрдХ рдореЙрдбрд▓ рд╕реЗ рд╕реНрдХреНрд░реАрди рддрдХ, рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрдИ рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рдЖрдк рдпрд╣ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдмреИрдХрдПрдВрдб рдиреЗрд╕реНрдЯреЗрдб рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рднреЗрдЬрдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реИ, рдЖрдкрдХреЛ рд╢рд░реНрдореАрд▓реА рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдХреЗрд╡рд▓ рдлреНрд▓реИрдЯ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рджреГрд╢реНрдп рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЖрдЗрдХреНрд╡рд▓ рдореЙрдбрд▓ рд╡рд┐рдзрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред рдмрд░реНрддрдиреЛрдВ рдореЗрдВ рдХрд╣реАрдВ.рдЬреИрд╕реЗ рд╡рд╣рд╛рдБ isEqual рдФрд░ isEqualArray рддрд░реАрдХреЗ рд╣реИрдВ:

  function isEqual(left, right) { return left.isEqual(right); } isEqualArray(v1, v2) { if (v1.length !== v2.length) { return false } for (var k = 0; k != v1.length; k++) { if (!isEqual(v1[k], v2[k])) { return false; } } return true; } 

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

рд╕рдВрджрд░реНрдн:

тЖТ рдЯрд╛рдЗрдореНрд╕
тЖТ рджреЛ

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


All Articles