React: рдХрдВрдкреЛрдиреЗрдВрдЯрдбрд┐рдбрдЕрдкрдбреЗрдЯ рдореЗрдВ рдбреЛрдо рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдирд╛

рдХреЛ рдирд┐рд░реНрдорд┐рдд 23 рд╕рд┐рддре░ 2016  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: facebook/react

рдирдорд╕реНрддреЗ, рдпрд╣ рдПрдХ рдкреНрд░рд╢реНрди рдХреА рддрд░рд╣ рд╣реИ, рдореИрдВ componentDidUpdate рдореЗрдВ рдбреЛрдо рд╣реЗрд░рдлреЗрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЪрд░реНрдЪрд╛ рдЦреЛрд▓рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдореИрдВ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд▓рдЧрдЗрди рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдБред рдЗрд╕реЗ рдХреБрдЫ DOM рдЧрдгрдирд╛рдПрдБ рдХрд░рдиреА рдкрдбрд╝рддреА рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ CSS рдЗрддрдирд╛ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд╣ рд╕рдм рдХреБрдЫ рдХрд╡рд░ рдХрд░ рд╕рдХреЗ рдЬреЛ рдЗрд╕ рдкреНрд▓рдЧрдЗрди рдХреЛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЙрд╕реА рдШрдЯрдХ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдХреБрдЫ рдЕрдиреНрдп рдбреАрдУрдПрдо рддрддреНрд╡ рдХреЗ getBoundingClientRect() рдХреЗ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреБрдЫ рд╕реАрдПрд╕рдПрд╕ рдЧреБрдгреЛрдВ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ред

рддреЛ рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 3 рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ:

1) getBoundingClientRect рдЧрдгрдирд╛ componentDidUpdate рдФрд░ рдкрд░рд┐рдХрд▓рд┐рдд рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде setState рдХреЙрд▓ рдХрд░реЗрдВред рдореИрдВ рдЕрдирдВрдд рд▓реВрдк рд╕реЗ рдбрд░рддрд╛ рд╣реВрдВ рдЬреЛ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдЬрд╛рдКрдВрдЧрд╛ред

2) рдЗрд╕реЗ 1 рдореЗрдВ рдкрд╕рдВрдж рдХрд░реЗрдВ) рдФрд░ shouldComponentUpdate рд╕рд╛рде рдереЛрдбрд╝рд╛ рдЦреЗрд▓реЗрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рдФрд░ рдкрдардиреАрдп рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкреНрд░рд╢реНрди рд╕рд╛рдордиреЗ рдЖрддреЗ рд╣реИрдВ рдЬреЛ рдирд┐рд╢реНрдЪрд┐рдд рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛрддреЗ рд╣реИрдВред

3) рдХрдВрдкреЛрдиреЗрдВрдЯрдбрд┐рдбрдЕрдкрдбреЗрдЯ рд╕реЗ рдбреЛрдо рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВред рдпрд╣ рд╡рд╣ рд╕рдорд╛рдзрд╛рди рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдЬрд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рд╣реИ, рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рд╕рд░рд▓, рд╕реНрдерд┐рд░ рд╣реИ рдФрд░ рдЗрд░рд╛рджрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдХрд┐рдирд╛рд░реЗ рдкрд░ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рджреЛрдмрд╛рд░рд╛ рдЬрд╛рдВрдЪрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдпрд╣ рдЪреАрдЬреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдареАрдХ рддрд░реАрдХрд╛ рд╣реИред рдХреНрдпрд╛ componentDidUpdate рдореЗрдВ DOM рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдирд╛ рдареАрдХ рд╣реИ? рдЗрд╕реЗ рд╣рд░ рдмрд╛рд░ render рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдореИрдВ рдЕрдкрдиреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдареАрдХ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдЧрд▓реЗ render рдореИрдВ рдлрд┐рд░ рд╕реЗ DOM рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реВрдВрдЧрд╛ред

рдпрд╣рд╛рдБ рдХреЛрдб рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ

componentDidMount() {
  this.recalculateIndent();
}

componentDidUpdate() {
  this.recalculateIndent();
}

recalculateIndent() {
  // calculate indent based on getBoundingClientRect of some DOM reference
  this.textareaRef.style.textIndent = `${indent}px`;
}

render() {
   return (
   ...
   <textarea ref={ref => this.textareaRef = ref}/>
   ...
   );
}

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

@jvorcak componentDidUpdate рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд░реЗрдВрдбрд░ рдХреЗ рдмрд╛рдж рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ DOM рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдЬрдЧрд╣ рд╣реИред рдбреЙрдХреНрд╕ рдХреЗ рдЕрдиреБрд╕рд╛рд░:

рдЬрдм рдШрдЯрдХ рдЕрджреНрдпрддрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ рддреЛ рдЗрд╕реЗ рдбреАрдУрдПрдо рдкрд░ рд╕рдВрдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рдЕрд╡рд╕рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рд╕рд╛рде рд╣реА, рд╣рдо рдХреЗрд╡рд▓ рдлреАрдЪрд░ рдЕрдиреБрд░реЛрдзреЛрдВ рдФрд░ рдмрдЧ рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛ рдЯреНрд░реИрдХрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╡рд╛рд▓реЛрдВ рдХреЛ рдХрд╣реАрдВ рдФрд░ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕реЗ рдЪрд░реНрдЪрд╛.рд░рд┐рдПрдХреНрдЯрдЬ.рдСрд░реНрдЧ рдпрд╛ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛред рдзрдиреНрдпрд╡рд╛рдж!

рд╕рднреА 3 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдареЛрд╕ рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рд╕рдорд╛рдзрд╛рди (рдШрдЯрдХ рдЬреАрд╡рдирдЪрдХреНрд░ рд╡рд┐рдзрд┐) рдЙрдЪрд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдбреЛрдо рд╣реЗрд░рдлреЗрд░ рдЧрд▓рдд рд╣реИред рд░рд╛рдЬреНрдп рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рдШрдЯрдХ рдлрд┐рд░ рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗрдВред рдореЗрд░реЗ рдЕрдВрддрд┐рдо рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдЙрджрд╛рд╣рд░рдг "рдЯреЗрдмрд▓ рдХреЗ рд▓рд┐рдП рдлрд┐рдХреНрд╕реНрдб рд╣реЗрдбрд░ + рдЯреЗрдмрд▓ рдмреЙрдбреА рдХреЗ рд▓рд┐рдП рд╡рд░реНрдЪреБрдЕрд▓ рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ", рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдЖрдкрдХреЛ рд╕рд╣реА рдкреНрд░рд╡рд╛рд╣ рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓реЗрдЧреАред

  1. рдХрдВрдкреЛрдиреЗрдВрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░: рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЕрд╡рд╕реНрдерд╛ рдорд╛рди: рдмреЙрдбреАрд╣рд╛рдЗрдЯ = 0 (рдпрд╛ рдЕрд╢рдХреНрдд, рдЬреИрд╕рд╛ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ)ред
  2. рдкрд╣рд▓реЗ рд░реЗрдВрдбрд░ рдХрд░реЗрдВ, рдЯреЗрдмрд▓ рд╣реЗрдбрд░ рд░реЗрдВрдбрд░ рдХрд░реЗрдВ рд▓реЗрдХрд┐рди рдЦрд╛рд▓реА рдЯреЗрдмрд▓ рдмреЙрдбреА (0 рдкрдВрдХреНрддрд┐рдпрд╛рдБ)ред
  3. рдХрдВрдкреЛрдиреЗрдВрдЯрдбрд┐рдбрдорд╛рдЙрдВрдЯ - рд╣реЗрдбрд░ рдФрд░ рдХрдВрдЯреЗрдирд░ рдбреЛрдо рдКрдВрдЪрд╛рдИ (+ рдХреБрдЫ рдЧрдгрдирд╛ ...) рдкрдврд╝реЗрдВ рдФрд░ рдмреЙрдбреАрд╣рд╛рдЗрдЯ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрд╕реНрдЯреЗрдЯ (рдкреБрдирдГ рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗрдВ)ред
  4. рджреВрд╕рд░рд╛ рд░реЗрдВрдбрд░, рдмреЙрдбреАрд╣рд╛рдЗрдЯ! == 0, рдЯреЗрдмрд▓ рдмреЙрдбреА рдХреЛ рд░реЗрдВрдбрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЕрдм, рдКрдВрдЪрд╛рдИ рдкреИрд░рд╛рдореАрдЯрд░ рдЬреНрдЮрд╛рдд рд╣реИ ( рдореИрдВ рдЗрд╕реЗ рдбреЛрдо рд╣реЗрд░рдлреЗрд░ рдХреЗ рдмрдЬрд╛рдп "рд╢реИрд▓реА" рдШрдЯрдХ рдкреНрд░реЛрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реЗрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ ), рдореИрдВ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдШрдЯрдХ рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реВрдВред
  5. "рдЖрдХрд╛рд░ рдмрджрд▓реЗрдВ" (рджрд╕реНрддрд╛рд╡реЗрдЬрд╝/рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЖрдХрд╛рд░ рдмрджрд▓рдиреЗ) рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдИрд╡реЗрдВрдЯ рд╢реНрд░реЛрддрд╛, рдХрдВрдкреЛрдиреЗрдВрдЯрдбрд┐рдбрдорд╛рдЙрдВрдЯ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ, рдХрдВрдкреЛрдиреЗрдВрдЯрд╡рд┐рд▓рдпреВрдирдорд╛рдЙрдВрдЯ рдореЗрдВ рдирд┐рдХрд╛рд▓реЗрдВред рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдореИрдВ рдХрдВрдкреЛрдиреЗрдВрдЯрдбрд┐рдбрдорд╛рдЙрдВрдЯ рдЬреИрд╕рд╛ рд╣реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВ - рдирдП рдбреЛрдо рдКрдВрдЪрд╛рдИ рдорд╛рди рдФрд░ рд╕реЗрдЯрд╕реНрдЯреЗрдЯ рдкрдврд╝реЗрдВред
  6. рд╣рд╛рде рд╕реЗ рдХреЛрдИ рдбреЛрдо рд╣реЗрд░рдлреЗрд░ рдирд╣реАрдВ рд╣реИ, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛рдо рдХрд░рддреА рд╣реИред

@jvorcak componentDidUpdate рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд░реЗрдВрдбрд░ рдХреЗ рдмрд╛рдж рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ DOM рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдЬрдЧрд╣ рд╣реИред рдбреЙрдХреНрд╕ рдХреЗ рдЕрдиреБрд╕рд╛рд░:

рдЬрдм рдШрдЯрдХ рдЕрджреНрдпрддрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ рддреЛ рдЗрд╕реЗ рдбреАрдУрдПрдо рдкрд░ рд╕рдВрдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рдЕрд╡рд╕рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рд╕рд╛рде рд╣реА, рд╣рдо рдХреЗрд╡рд▓ рдлреАрдЪрд░ рдЕрдиреБрд░реЛрдзреЛрдВ рдФрд░ рдмрдЧ рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛ рдЯреНрд░реИрдХрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╡рд╛рд▓реЛрдВ рдХреЛ рдХрд╣реАрдВ рдФрд░ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕реЗ рдЪрд░реНрдЪрд╛.рд░рд┐рдПрдХреНрдЯрдЬ.рдСрд░реНрдЧ рдпрд╛ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛред рдзрдиреНрдпрд╡рд╛рдж!

рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрдк рдПрдХ рдШрдЯрдХ рдХреЛ рджреВрд╕рд░реЗ рдореЗрдВ рдХреБрдЫ рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рдж рдЕрджреНрдпрддрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

DimitarChristoff picture DimitarChristoff  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

kocokolo picture kocokolo  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

varghesep picture varghesep  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

zpao picture zpao  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

hnordt picture hnordt  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ