React: рдмрдЧрд╝рд▓ рдореЗрдВ рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░рдирд╛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 13 рдорд╛рд░реНрдЪ 2015  ┬╖  136рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: facebook/react

рдпрд╣ рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рд╕реНрдЯреЛрд░/рдиреЗрдЯрд╡рд░реНрдХ/рд╕рдВрд╕рд╛рдзрди рд╕реЗ рд╕реНрдЯреЗрдЯрд▓реЗрд╕ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдпрд╛рдж рдХрд┐рдП рдЧрдП) рдбреЗрдЯрд╛ рдХреЗ рдмрдЧрд╝рд▓ рдореЗрдВ рдбреЗрдЯрд╛ рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдПрдкреАрдЖрдИ рд╣реИ, рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░реЙрдкреНрд╕/рд╕реНрдЯреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред

type RecordOfObservables = { [key:string]: Observable<mixed> };

class Foo {

  observe(): RecordOfObservables {
    return {
      myContent: xhr(this.props.url)
    };
  }

  render() {
    var myContent : ?string = this.data.myContent;
    return <div>{myContent}</div>;
  }

}

рдирд┐рд░реАрдХреНрд╖рдг () рдХрдВрдкреЛрдиреЗрдВрдЯрд╡рд┐рд▓рдорд╛рдЙрдВрдЯ / рдХрдВрдкреЛрдиреЗрдВрдЯрд╡рд┐рд▓рдЕрдкрдбреЗрдЯ рдХреЗ рдмрд╛рдж рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗред

рд░рд┐рдХреЙрд░реНрдб рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдХреБрдВрдЬреА/рдорд╛рди рдХреЗ рд▓рд┐рдПред рдореВрд▓реНрдп рдореЗрдВ рдирдореВрджрд╛рд░ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдВред

subscription = observable.subscribe({ onNext: handleNext });

рд╣рдо рдСрдирдиреЗрдХреНрд╕реНрдЯ рдХреЛ рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рд╕реЗ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рд╣рдо рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ:

this.data[key] = nextValue;

рдЕрдиреНрдпрдерд╛ рд╣рдо рдЗрд╕реЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд░реЗрдВрдбрд░ рдХреЗ рд▓рд┐рдП рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВред (рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕реЗ рд╢реВрдиреНрдп рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВ?)

рдлрд┐рд░ рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рдЖрдп рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗрдВред

рд╣рд░ рдмрд╛рд░ рдСрдирдиреЗрдХреНрд╕реНрдЯ рдХрд╛ рдЖрд╣реНрд╡рд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рдо рдПрдХ рдирдпрд╛ "рдпрд╣ред рдбреЗрдЯрд╛ [рдХреБрдВрдЬреА]" рд╢реЗрдбреНрдпреВрд▓ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдЗрд╕ рдШрдЯрдХ рдкрд░ рдПрдХ рдордЬрдмреВрд░ рдЕрджреНрдпрддрди рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рдПрдХрдорд╛рддреНрд░ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИ, рддреЛ рдирд┐рд░реАрдХреНрд╖рдг рдХреЛ рдкреБрди: рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдШрдЯрдХрд╡рд┐рд▓рдЕрдкрдбреЗрдЯ -> рд░реЗрдВрдбрд░ -> рдХреЙрдореНрдкреЛрдиреЗрдВрдЯрдбрд┐рдбрдЕрдкрдбреЗрдЯ)ред

рдпрджрд┐ рдкреНрд░реЙрдкреНрд╕ / рд╕реНрдЯреЗрдЯ рдмрджрд▓ рдЧрдпрд╛ рд╣реИ (рдпрд╛рдиреА рд░рд┐рд╕реАрд╡рдкреНрд░реЙрдкреНрд╕ рдпрд╛ рд╕реЗрдЯрд╕реНрдЯреЗрдЯ рд╕реЗ рдЕрдкрдбреЗрдЯ), рддреЛ рдирд┐рд░реАрдХреНрд╖рдг () рдХреЛ рдлрд┐рд░ рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╕рд╛рдордВрдЬрд╕реНрдп рдХреЗ рджреМрд░рд╛рди)ред

рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рд╣рдо рдирдП рд░рд┐рдХреЙрд░реНрдб рдкрд░ рд▓реВрдк рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╕рднреА рдирдП рд╡реЗрдзрд╢рд╛рд▓рд╛рдУрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддреЗ рд╣реИрдВред

рдЙрд╕рдХреЗ рдмрд╛рдж, рдкрд┐рдЫрд▓реЗ рд╡реЗрдзрд╢рд╛рд▓рд╛рдУрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВред

subscription.dispose();

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

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

рдпрджрд┐ рдирдИ рд╕рджрд╕реНрдпрддрд╛ рддреБрд░рдВрдд onNext рдХреЙрд▓ рдирд╣реАрдВ рдХрд░рддреА рд╣реИ, рддреЛ рд╣рдо рдкрд┐рдЫрд▓реЗ рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВрдЧреЗред

рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдореЗрд░рд╛ this.props.url рдмрджрд▓рддрд╛ рд╣реИ, рдФрд░ рдореИрдВ рдПрдХ рдирдП URL рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗ рд░рд╣рд╛ рд╣реВрдВ, рддреЛ myContent рдкрд┐рдЫрд▓реЗ url рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рддрдм рддрдХ рджрд┐рдЦрд╛рддрд╛ рд░рд╣реЗрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдЕрдЧрд▓рд╛ url рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд▓реЛрдб рди рд╣реЛ рдЬрд╛рдПред

рдЗрд╕рдореЗрдВ <img /> рдЯреИрдЧ рдХреЗ рд╕рдорд╛рди рд╢рдмреНрджрд╛рд░реНрде рд╣реИред рд╣рдордиреЗ рджреЗрдЦрд╛ рд╣реИ рдХрд┐, рдЬрдмрдХрд┐ рдпрд╣ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╡рд┐рд╕рдВрдЧрддрд┐рдпреЛрдВ рдХреЛ рдЬрдиреНрдо рджреЗ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдПрдХ рдХрд╛рдлреА рд╕рдордЭрджрд╛рд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реЛрдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЗрд╕реЗ рд╕реНрдкрд┐рдирд░ рджрд┐рдЦрд╛рдирд╛ рдЖрд╕рд╛рди рд╣реИред

рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдбреЗрдЯрд╛ рдХреИрд╢ рдирд╣реАрдВ рд╣реИ рддреЛ рддреБрд░рдВрдд "рд╢реВрдиреНрдп" рдорд╛рди рднреЗрдЬрдирд╛ рд╕рд░реНрд╡реЛрддреНрддрдо рдЕрднреНрдпрд╛рд╕ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рдпреВрдЖрд░рдПрд▓ (рдпрд╛ рдЖрдИрдбреА) рдФрд░ рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рджреЛрдиреЛрдВ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред

class Foo {

  observe() {
    return {
      user: loadUser(this.props.userID)
    };
  }

  render() {
    if (this.data.user.id !== this.props.userID) {
      // Ensure that we never show inconsistent userID / user.name combinations.
      return <Spinner />;
    }
    return <div>Hello, {this.data.user.name} [{this.props.userID}]!</div>;
  }

}

рд╣рдореЗрдВ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рдХреЗ рдЖрд░рдПрдХреНрд╕рдЬреЗрдПрд╕ рдЕрдиреБрдмрдВрдз рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдо рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЕрдзрд┐рдХ рд╣реИ рдФрд░ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдмрд╛рд░ @jhusain рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдореЗрдВ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЙрд╕ рдЕрдиреБрдмрдВрдз рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдВрдЧреЗред

var subscription = observable.subscribe({ onNext, onError, onCompleted });
subscription.dispose();

рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рд╣рдо рдЗрди рдШрдЯрдирд╛рдУрдВ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рд╡рд╛рд▓реЗ рдЕрдзрд┐рдХ рдЬреАрд╡рди-рдЪрдХреНрд░ рд╣реБрдХ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

рдиреЛрдЯ: рдпрд╣ рдЕрд╡рдзрд╛рд░рдгрд╛ рдмрдЧрд╝рд▓ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ "рд╡реНрдпрд╡рд╣рд╛рд░" рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ - рдареАрдХ рдкреНрд░реЙрдкреНрд╕ рдХреА рддрд░рд╣ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЗрди рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдзрд╛рд░рдгрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрдзрд┐рднрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИред рдпрд╣ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдбреЗрдЯрд╛ рдХреЛ рдХреЗрд╡рд▓ рдмрд╛рдж рдореЗрдВ рдкреБрдирдГ рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдлреЗрдВрдХ рджреЗрдирд╛ред рдпрд╣ рдЖрд░рд╛рдо рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИред

Component API Big Picture

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

рдЕрдЧрд░ рдХреЛрдИ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рдореИрдВрдиреЗ рдЙрдЪреНрдЪ рдСрд░реНрдбрд░ рдШрдЯрдХ рдХреЗ рд░реВрдк рдореЗрдВ observe рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЧреВрдВрдЧрд╛ рдкреЙрд▓реАрдлрд┐рд▓ рдмрдирд╛рдпрд╛ рд╣реИ:

import React, { Component } from 'react';

export default function polyfillObserve(ComposedComponent, observe) {
  const Enhancer = class extends Component {
    constructor(props, context) {
      super(props, context);

      this.subscriptions = {};
      this.state = { data: {} };

      this.resubscribe(props, context);
    }

    componentWillReceiveProps(props, context) {
      this.resubscribe(props, context);
    }

    componentWillUnmount() {
      this.unsubscribe();
    }

    resubscribe(props, context) {
      const newObservables = observe(props, context);
      const newSubscriptions = {};

      for (let key in newObservables) {
        newSubscriptions[key] = newObservables[key].subscribe({
          onNext: (value) => {
            this.state.data[key] = value;
            this.setState({ data: this.state.data });
          },
          onError: () => {},
          onCompleted: () => {}
        });
      }

      this.unsubscribe();
      this.subscriptions = newSubscriptions;
    }

    unsubscribe() {
      for (let key in this.subscriptions) {
        if (this.subscriptions.hasOwnProperty(key)) {
          this.subscriptions[key].dispose();
        }
      }

      this.subscriptions = {};
    }

    render() {
      return <ComposedComponent {...this.props} data={this.state.data} />;
    }
  };

  Enhancer.propTypes = ComposedComponent.propTypes;
  Enhancer.contextTypes = ComposedComponent.contextTypes;

  return Enhancer;
}

рдЙрдкрдпреЛрдЧ:

// can't put this on component but this is good enough for playing
function observe(props, context) {
  return {
    yourStuff: observeYourStuff(props)
  };
}

class YourComponent extends Component {
  render() {
    // Note: this.props.data, not this.data
    return <div>{this.props.data.yourStuff}</div>;
  }
}

export default polyfillObserve(YourComponent, observe);

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

undefined рд╕рдВрднрд╡рддрдГ data рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдорд╛рди рд╣реИ рдЬрдм рддрдХ рдХрд┐ рджреЗрдЦрдиреЗ рдпреЛрдЧреНрдп onNext рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкрдирд╛ рдкрд╣рд▓рд╛ рдорд╛рди рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд░рд┐рд▓реЗ рдореЗрдВ рд╣рдо null (рдбреЗрдЯрд╛ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ) рдФрд░ undefined (рдЕрднреА рддрдХ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рд╣реБрдЖ) рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрд░реНрде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░рд╛ рдЖрджрд░реНрд╢ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдбреЗрдЯрд╛ рдорд╛рди undefined рд╣реЛрдЧрд╛ред рд╡рд┐рдХрд▓реНрдк рдПрдХ рдирдИ рд╡рд┐рдзрд┐ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП getInitialData , рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдирд╛рд╡рд╢реНрдпрдХ/рдУрд╡рд░рдХрд┐рд▓ рд╣реИред

рдпрд╣ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕реНрдерд┐рд░ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдореИрдВ рдХреБрдВрдЬреА/рдореВрд▓реНрдп рдкреНрд░рдгрд╛рд▓реА рд╕реЗ рдЗрддрдирд╛ рдЦреБрд╢ рдирд╣реАрдВ рд╣реВрдВ, рдЙрдирдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрд╕рдВрднрд╡ рд╣реИред
рдХреНрдпреЛрдВ рдирд╣реАрдВ observe рдПрдХ рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рд▓реМрдЯрд╛рдПрдВ рдФрд░ this.data рдХреЗ рд▓рд┐рдП рд╣рд▓ рдХрд┐рдП рдЧрдП рдорд╛рди рдХреЛ рд╕реЗрдЯ/рдорд░реНрдЬ рдХрд░реЗрдВ:

class Foo {

  observe() {
    return (
      loadUser(this.props.userID)
        .map(user => { user })
  }

  render() {
    if (this.data.user.id !== this.props.userID) {
      // Ensure that we never show inconsistent userID / user.name combinations.
      return <Spinner />;
    }
    return <div>Hello, {this.data.user.name} [{this.props.userID}]!</div>;
  }

}

рдФрд░ рдПрдХрд╛рдзрд┐рдХ рд▓рд╛рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреБрдЫ рдРрд╕рд╛:

class Foo {

  observe() {
    return (
     combineLatest(
      loadUser(this.props.userID),
      loadSomethingElse(this.props.somethingElseId),
      (user, somethingElse) => ({ user, somethingElse})
     )
  }

  render() {
    ..
  }

}

рдпрд╣ рд╢рд╛рдпрдж рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рд╡рд░реНрдмреЛрдЬрд╝ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╕реНрдерд┐рд░ рдкреНрд░рдХрд╛рд░ рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:

interface Comp<T> {
  observe(): Observable<T>;
  data: T;
}

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ observe рдХреЛ рдлрд┐рд░ рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЬрдм рдкреНрд░реЙрдкреНрд╕/рд╕реНрдЯреЗрдЯ рдЪреЗрдВрдЬ рд╣реЛрддрд╛ рд╣реИ рддреЛ рд╣рдо 'рдкреНрд░реЙрдкреНрд╕' 'рд╕реНрдЯреЗрдЯ' рдХреЛ рдПрдХ рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХреНрд╕реЗрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

class Foo {

  observe(propsStream) {
    return (
      propsStream
        .flatMap(({ userID }) => loadUser(userId))
        .map(user => { user })
    );
  }

  render() {
    if (this.data.user.id !== this.props.userID) {
      // Ensure that we never show inconsistent userID / user.name combinations.
      return <Spinner />;
    }
    return <div>Hello, {this.data.user.name} [{this.props.userID}]!</div>;
  }
}

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

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдлреНрд▓рдХреНрд╕ рд╕реНрдЯреЛрд░ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

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

class Foo extends React.Component {
  data : { user : User, content : string };
  observe() /* implied as { user : Observable<User>, content : Observable<string> } */ {
  }
}

рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрдерд┐рддрд┐ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓реНрд╕ рдкрд░ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИред рдЗрд╕реЗ рдЗрд╕рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рд╣реИред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЖрд╡реЗрджрди рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд┐рдзрд┐ рдмреЗрдХрд╛рд░ рд╣реИред рдлреНрд░реЗрдорд╡рд░реНрдХ рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рдкреБрдирдГ рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рд╣реИред

cc @ericvicenti

рдХрдо рд╕реЗ рдХрдо рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, observe рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ $ data observe рдХреЗ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдХрдо рд╕реЗ рдХрдо рдЬрдм рддрдХ https://github.com/ рдЬреИрд╕рд╛ рдХреБрдЫ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рдореИрдВ рдЗрд╕реЗ рд░рд┐рдПрдХреНрдЯ рдбреАрдПрдирдбреА рдХреЗ рдЕрдЧрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдЬрд╛рд╣рд┐рд░ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рд░рд┐рдПрдХреНрдЯ 0.14 рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреА рд╣реЛрдЧреАред
рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдореИрдВ рдЙрд╕ рд╕рдордп рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдЪреНрдЪ-рдЖрджреЗрд╢ рдШрдЯрдХ рдХреЗ рд╕рд╛рде "рдкреЙрд▓реАрдлрд┐рд▓" рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдЬреЛ ref рдЙрджрд╛рд╣рд░рдг рдкрд░ this.data рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ .. рд╣рд╛рд▓рд╛рдВрдХрд┐ рдмрд╣реБрдд рдкрд╛рдЧрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдХреНрдпрд╛ рд╡рд╛рджреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛? рдлрд┐рд░ рдкрд╣рд▓реЗ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкреВрд░реЗ рдХрдВрдкреЛрдиреЗрдВрдЯ рдЯреНрд░реА рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░реЙрдорд┐рд╕ рдЯреНрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ! рдпрд╣ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рд░рд┐рдПрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред

рдЗрд╕реЗ рдкреНрд░рдердо рд╢реНрд░реЗрдгреА API рдмрдирд╛рдиреЗ рдХреЗ рдХреНрдпрд╛ рд▓рд╛рдн рд╣реИрдВ? рдпрд╣ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ "рдЙрдЪреНрдЪ-рдХреНрд░рдо рдШрдЯрдХ" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕реЗ рдкреНрд░рдердо рд╢реНрд░реЗрдгреА API рдмрдирд╛рдиреЗ рдХреЗ рдХреНрдпрд╛ рд▓рд╛рдн рд╣реИрдВ? рдпрд╣ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ "рдЙрдЪреНрдЪ-рдХреНрд░рдо рдШрдЯрдХ" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

5 рд╕рдмреНрд╕рдХреНрд░рд┐рдкреНрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 5 рдПрдЪрдУрд╕реА рдореЗрдВ рд▓рдкреЗрдЯрдирд╛ рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдмреЛрдЭрд┐рд▓ рдФрд░ рд╕рдордЭрдиреЗ рдореЗрдВ рдХрдард┐рди рд╣реИред componentWillReceiveProps рдХреЛ рд╕рдордЭрдирд╛ рднреА рдЧреИрд░-рддреБрдЪреНрдЫ рд╣реИред рдпрд╣ рджреЛрдиреЛрдВ рдХреЛ рдареАрдХ рдХрд░рддрд╛ рд╣реИред

рдореИрдВ, рдПрдХ рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдирдП рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рдЕрдзрд┐рдкрддрд┐ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рдХрд░рддрд╛ рд╣реВрдВред

рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ https://github.com/chenglou/react-state-stream рдХреЛ рд░рд┐рдПрдХреНрдЯ рдХреЗ рд╡реЗрдирд┐рд▓рд╛ рдПрдкреАрдЖрдИ рдХреЗ рдХрд░реАрдм рд▓рд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ

рдХреНрдпрд╛ рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдПрдЪрдУрд╕реА рдирд╣реАрдВ рд▓реЗрдЧрд╛? рдЖрдкрдХреЗ рдорд╛рдзреНрдпрдо рдкреЛрд╕реНрдЯ рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЖрдк stores рд╕реЗ рдЕрдзрд┐рдХ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддреЗ рд╣реИрдВред

stores.forEach(store =>
  store.addChangeListener(this.handleStoresChanged)
);

@aaronshaf рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдХрднреА-рдХрднреА рдпрд╣ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд░рд╛рдЬреНрдп рд╕реНрд░реЛрдд рд╣реЛрддреЗ рд╣реИрдВ, рди рдХрд┐ рдХреЗрд╡рд▓ "рдХрдИ рд╕реНрдЯреЛрд░"ред рд▓реЗрдХрд┐рди рдореИрдВ рд░рд┐рдПрдХреНрдЯ рдЯреАрдо рдХреА рдУрд░ рд╕реЗ рдХреБрдЫ рдирд╣реАрдВ рдХрд╣ рд╕рдХрддрд╛, рдЖрдЗрдП рд╕реБрдирддреЗ рд╣реИрдВ @sebmarkbage рдХреНрдпрд╛ рдХрд╣рддреЗ рд╣реИрдВред

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

( @vjeux рдиреЗ рдореБрдЭрд╕реЗ рдХрд╣рд╛ рдерд╛ рдХрд┐ рдореБрдЭреЗ рдЭрдВрдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП! рдЗрд╕рд▓рд┐рдП рдореИрдВ рдпрд╣рд╛рдВ рд╣реВрдВред)

рдореЗрд░рд╛ рдорддрд▓рдм рдЕрдкрдиреЗ рдХрд╛рдо рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╣реБрдХ рд░рд┐рдПрдХреНрдЯ рдиреЗрдХреНрд╕рд╕ рдореЗрдВ getNexusBindings рд╣реБрдХ рдХреЗ рд╕рдорд╛рди рд╣реИред рдЖрдк рдЬреАрд╡рдирдЪрдХреНрд░ рд╣реБрдХ (рдЬреЛ рд╕рд╣рд╛рд░рд╛ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдШрдЯрдХ рд╕реНрддрд░ рдкрд░ рдбреЗрдЯрд╛ рдбрд┐рдкреНрд╕ рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рдПрдкреАрдЖрдИ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

class UserDetails {
  getNexusBindings(props) {
    return {
      // binding to data in the datacenter
      posts: [this.getNexus().remote, `users/${this.props.userId}/posts`],
      // binding to data in the local flux
      mySession: [this.getNexus().local, `session`],
    }
  }
}

рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЛ componentDidMount рдФрд░ componentWillReceiveProps рджреМрд░рд╛рди рд▓рд╛рдЧреВ/рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдмрд╛рдж рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЕрдЧрд▓реА рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдкрд┐рдЫрд▓реЗ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддреА рд╣реИ; рд╣рдЯрд╛рдП рдЧрдП рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЛ рдЕрдирд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛрдбрд╝реЗ рдЧрдП рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЛ рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдиреЗрдХреНрд╕рд╕ рдлреНрд▓рдХреНрд╕ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдлрд╝реЗрдЪрд┐рдВрдЧ/рдЕрджреНрдпрддрди рддрдВрддреНрд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ рд╣реА рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдЖрдк рдпрд╛ рддреЛ рд╕реНрдерд╛рдиреАрдп рдбреЗрдЯрд╛ (рдкрд╛рд░рдВрдкрд░рд┐рдХ рд╕реНрдерд╛рдиреАрдп рд╕реНрдЯреЛрд░) рдпрд╛ рд░рд┐рдореЛрдЯ рдбреЗрдЯрд╛ (рдЬреАрдИрдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдФрд░ рд╡реЗрдмрд╕рд╛рдЗрдЯреНрд╕/рдкреЙрд▓реАрдлрд┐рд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреИрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ) рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рд╕реА рдЕрдиреНрдп рд╡рд┐рдВрдбреЛ (рдкреЛрд╕реНрдЯрд╡рд┐рдВрдбреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рдпрд╛ рд╡реЗрдмрд╡рд░реНрдХрд░/рд╕рд░реНрд╡рд┐рд╕рд╡рд░реНрдХрд░ рд╕реЗ рдбреЗрдЯрд╛ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЕрднреА рднреА рдЗрд╕рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рдЙрдкрдпреЛрдЧ рдХреЗрд╕ рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИред

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

рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЕрдЪреНрдЫреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╕рд╛рде рднреА рдЖрддрд╛ рд╣реИ: рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рд░реЗрдВрдбрд░рд┐рдВрдЧ рд╕рдордп рдкрд░ рдбреЗрдЯрд╛ рдкреНрд░реАрдлрд╝реЗрдЪрд┐рдВрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдареАрдХ рдЙрд╕реА рдЬреАрд╡рдирдЪрдХреНрд░ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореВрд▓ рд░реВрдк рд╕реЗ, рд░реВрдЯ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдХрд░ рдФрд░ рд╡рд╣рд╛рдВ рд╕реЗ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд░реВрдк рд╕реЗ, рд░рд┐рдПрдХреНрдЯ рдиреЗрдХреНрд╕рд╕ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЛ рдкреВрд░реНрд╡-рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдШрдЯрдХ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╕рднреА рдШрдЯрдХреЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдП рдЬрд╛рдиреЗ рддрдХ рд╡рдВрд╢рдЬ рдХреЗ рд╕рд╛рде рдЬрд╛рд░реА рд░рд╣рддрд╛ рд╣реИред

@aaronshaf @gaearon рдЗрд╕реЗ рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдмрдирд╛рдиреЗ рдХрд╛ рд▓рд╛рдн рдпрд╣ рд╣реИ:

1) рдпрд╣ рдкреНрд░реЙрдкреНрд╕ рдиреЗрдорд╕реНрдкреЗрд╕ рдкрд░ рдирд╣реАрдВ рдЦрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдЪреНрдЪ-рдХреНрд░рдо рд╡рд╛рд▓реЗ рдШрдЯрдХ рдХреЛ рдЖрдкрдХреЗ рдкреНрд░реЙрдкреНрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ data рдЬреИрд╕реЗ рдирд╛рдо рдХрд╛ рджрд╛рд╡рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдХрдИ рдЙрдЪреНрдЪ рдХреНрд░рдо рдХреЗ рдШрдЯрдХреЛрдВ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдЕрдзрд┐рдХ рдирд╛рдо рдЦрд╛ рд░рд╣реА рд╣реИ рдФрд░ рдЕрдм рдЖрдкрдХреЛ рдЙрди рдирд╛рдореЛрдВ рдХреЛ рдЕрджреНрд╡рд┐рддреАрдп рд░рдЦрдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЦреЛрдЬрдирд╛ рд╣реЛрдЧрд╛ред рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрдк рдХреБрдЫ рдРрд╕реА рд░рдЪрдирд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрдирд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИ рдФрд░ рдЕрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдирд╛рдо рдХрд╛ рд╡рд┐рд░реЛрдз рд╣реИ?

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

2) рд╣рдореЗрдВ рдЕрдВрддрд┐рдо рдореВрд▓реНрдп рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП state рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред data рдЕрд╡рдзрд╛рд░рдгрд╛ рдЗрд╕ рдЕрд░реНрде рдореЗрдВ props рдХреЗ рд╕рдорд╛рди рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рдПрдХ рд╕рдВрд╕реНрдорд░рдг рд╣реИред рдпрджрд┐ рд╣рдореЗрдВ рд╕реНрдореГрддрд┐ рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддреЛ рд╣рдо рдЗрд╕реЗ рдХрд┐рд╕реА рднреА рд╕рдордп рдмрд╛рд╣рд░ рдлреЗрдВрдХрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЕрдирдВрдд рд╕реНрдХреНрд░реЙрд▓ рдореЗрдВ рд╣рдо рдЕрджреГрд╢реНрдп рд╕рдмрдЯреНрд░реА рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рд╛рдл рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@RickWong рд╣рд╛рдВ, рд╡рд╛рджреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдХрд╛рдлреА рддреБрдЪреНрдЫ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ

рдП) рдЙрдиреНрд╣реЗрдВ рдврд╛рдВрдЪреЗ рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд░рджреНрдж рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣рдо рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рджреЗрд░ рд╕реЗ рдХрд┐рдП рдЧрдП рд╕рдорд╛рдзрд╛рди рдХреЛ рдирдЬрд╝рд░рдЕрдВрджрд╛рдЬ рдХрд░реЗрдВред рдЗрд╕ рдмреАрдЪ, рд╡рд╛рджрд╛ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдорд╣рдВрдЧреЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдкрд░ рдХрд╛рдпрдо рд╣реИред рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдЯрд╛рдЗрдорд░/рдиреЗрдЯрд╡рд░реНрдХ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛/рд░рджреНрдж/рд╕рджрд╕реНрдпрддрд╛/рд░рджреНрдж рдХрд░рдиреЗ рдХреА рдХрдард┐рди рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЖрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдФрд░ рдпрджрд┐ рдЖрдк рд╡рд╛рджреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╡реЗ рд░реВрдЯ рдкрд░ рд░рджреНрдж рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ рдФрд░ рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдмрд╕ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдпрд╛ рд╕рдордп рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд╕рд╛рдзрдиред рдпрд╣ рдмрдбрд╝реЗ рдбреЗрд╕реНрдХрдЯреЙрдк рдкреЗрдЬреЛрдВ (рдЬреИрд╕реЗ facebook.com) рдпрд╛ рд╕реНрдореГрддрд┐ рдмрд╛рдзрд┐рдд рд╡рд╛рддрд╛рд╡рд░рдг (рдЬреИрд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдореВрд▓) рдореЗрдВ рд╡рд┐рд▓рдВрдмрддрд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдРрдкреНрд╕ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рд╣рд╛рдирд┐рдХрд╛рд░рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдмреА) рдЖрдк рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рдЦреБрдж рдХреЛ рдмрдВрдж рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрджрд┐ рд╡рд╣ рдбреЗрдЯрд╛ рд╕рдордп рдХреЗ рд╕рд╛рде рдмрджрд▓рддрд╛ рд╣реИ, рддреЛ рдЖрдк рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдЕрдорд╛рдиреНрдп рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЖрдк рдПрдХ рдЕрд╕рдВрдЧрдд рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред рдпрд╣ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдирд╣реАрдВ рд╣реИред рдПрдХрд▓ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рд░реЗрдВрдбрд░ рдХреЗ рд▓рд┐рдП рдЬреЛ рдареАрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдЖрдкрдХреЛ рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЖрдк UI рдореЗрдВ рдирдП рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдЯреНрд░реАрдо рдХрд░ рд╕рдХреЗрдВ рдФрд░ рдкреБрд░рд╛рдиреЗ рдбреЗрдЯрд╛ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЕрдкрдбреЗрдЯ рд╣реЛ рд╕рдХреЗрдВред

рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рдПрдкреАрдЖрдИ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдкрдХреЛ рдЬрд░реВрд░рдд рдкрдбрд╝рдиреЗ рдкрд░ рдЗрди рдореБрджреНрджреЛрдВ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЙрдХ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

@elierotenberg рдореЗрдВ рдЪрд┐рдВрд░рд╛рдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рд╕рдорд╛рди рд▓рдЧрддрд╛ рд╣реИред рдПрдХ рд╣реА рддрд░рд╣ рдХреЗ рд▓рд╛рднред рдХреНрдпрд╛ рдЖрдк рдореЗрд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕реАрдорд╛рдПрдБ рджреЗрдЦрддреЗ рд╣реИрдВ? рдпрд╛рдиреА рд╡рд╣рд╛рдБ рдХреБрдЫ рдпрд╛рдж рдЖ рд░рд╣реА рд╣реИ, рдХрд┐ рд░рд┐рдПрдХреНрдЯ рдиреЗрдХреНрд╕рд╕ рд╣реИ, рдЬрд┐рд╕реЗ рдЖрдк рдЗрд╕рдХреЗ рдКрдкрд░ рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ? рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рд╕реНрд╡рдпрдВ рдХреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рд╕реЗ рдмрд╛рд╣рд░ рди рдирд┐рдХрд╛рд▓реЗрдВред :)

рд╕рд░реНрд╡рд░-рд░реЗрдВрдбрд░рд┐рдВрдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╣рдо рдЕрдВрддрд┐рдо рд░реЗрдВрдбрд░рдЯреЙрд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рддрдм рддрдХ рд╕реНрдердЧрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓/рд╡рд╛рджрд╛ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рд╣рд▓ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░реВрдк рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрдиреНрдпрдерд╛, рд╣рдо рдЕрднреА рднреА рд░рд┐рдПрдХреНрдЯ рдХреЗ рдмрд╛рд╣рд░ рд╕рднреА рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдбреЗрдЯрд╛ рд▓рд╛рдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИрдВ, рдпрд╣ рдЬрд╛рдиреЗ рдмрд┐рдирд╛ рдХрд┐ рдХреМрди рд╕реЗ рдШрдЯрдХ рдкреГрд╖реНрда рдкрд░ рд╣реЛрдВрдЧреЗред

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рд░рд┐рдПрдХреНрдЯ-рдиреЗрдХреНрд╕рд╕ рд░реЗрдВрдбрд░ рдЯреНрд░реА рдХреЛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдШрдЯрдХ рдХреЗ рднреАрддрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд▓реЛрдбрд┐рдВрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рд╣рд╛рдВ, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдЧрдардмрдВрдзрди рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрд▓рдЧ рдХрд░рддрд╛ рд╣реИ:
1) getNexusBindings рдХреЗ рд░реВрдк рдореЗрдВ рдмрд╛рдзреНрдпрдХрд╛рд░реА рдШреЛрд╖рдгрд╛ (рдЬреЛ рдПрдХ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ, рд╕рд╛рдЗрдб-рдЗрдлреЗрдХреНрдЯ рдореБрдХреНрдд рдЬреАрд╡рдирдЪрдХреНрд░ рд╡рд┐рдзрд┐ рд╣реИ, рд░реЗрдВрдбрд░ рдХреЗ рд╕рдорд╛рди - рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХрд╛ рдирд╛рдо рд░реЗрдВрдбрд░рдбрд┐рдкреЗрдВрдбреЗрдВрд╕реА рд╣реБрдЖ рдХрд░рддрд╛ рдерд╛ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдпрд╣ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ),
2) рдмрд╛рдзреНрдпрдХрд╛рд░реА рд╕рджрд╕реНрдпрддрд╛/рдЕрджреНрдпрддрди applyNexusBindings рдХреЗ рд░реВрдк рдореЗрдВ (рдЬреЛ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реИ рдФрд░ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд┐рдЫрд▓реЗ рдиреЗрдХреНрд╕рд╕ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЛ рдЕрд▓рдЧ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕реА рдирдИ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЛ рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдХрд┐рди рд▓реЛрдЧреЛрдВ рдХреЛ рдЕрдирд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП)
3) рдкреНрд░реАрдлрд╝реЗрдЪрд┐рдВрдЧ рдХреЛ prefetchNexusBindings рдХреЗ рд░реВрдк рдореЗрдВ рдмрд╛рдзреНрдп рдХрд░рдирд╛ (рдЬреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реИ рдФрд░ "рдкреНрд░рд╛рд░рдВрднрд┐рдХ" (рдЗрд╕рдХрд╛ рдЬреЛ рднреА рдЕрд░реНрде рд╣реЛ) рдорд╛рди рддреИрдпрд╛рд░ рд╣реЛрдиреЗ рдкрд░ рд╣рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ)

ReactNexus.prefetchApp(ReactElement) рдПрдХ Promise(String html, Object serializableData) $ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдпрд╣ рд╣реБрдХ рд░рд┐рдПрдХреНрдЯ рдЯреНрд░реА рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рдирдХрд▓ рдХрд░рддрд╛ рд╣реИ ( instantiateReactComponent рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рдФрд░ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд░реВрдк рд╕реЗ рдШрдЯрдХреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг/рдкреНрд░реАрдлрд╝реЗрдЪ/рд░реЗрдВрдбрд░ рдХрд░рддрд╛ рд╣реИред рдЬрдм рдкреВрд░рд╛ рдШрдЯрдХ рдкреЗрдбрд╝ 'рддреИрдпрд╛рд░' рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЕрдВрдд рдореЗрдВ рдпрд╣ React.renderToString рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдЬрд╛рдирдХрд░ рдХрд┐ рд╕рднреА рдбреЗрдЯрд╛ рддреИрдпрд╛рд░ рд╣реИ (рдореЙрдбреНрдпреВрд▓реЛ рддреНрд░реБрдЯрд┐рдпрд╛рдВ)ред рдПрдХ рдмрд╛рд░ рд╣рд▓ рд╣реЛ рдЬрд╛рдиреЗ рдкрд░, рдЗрд╕ рд╡рд╛рджреЗ рдХрд╛ рдореВрд▓реНрдп рд╕рд░реНрд╡рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░, рдирд┐рдпрдорд┐рдд React.render() рдЬреАрд╡рдирдЪрдХреНрд░ рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдЕрдЧрд░ рдХреЛрдИ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рдореИрдВрдиреЗ рдЙрдЪреНрдЪ рдСрд░реНрдбрд░ рдШрдЯрдХ рдХреЗ рд░реВрдк рдореЗрдВ observe рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЧреВрдВрдЧрд╛ рдкреЙрд▓реАрдлрд┐рд▓ рдмрдирд╛рдпрд╛ рд╣реИ:

import React, { Component } from 'react';

export default function polyfillObserve(ComposedComponent, observe) {
  const Enhancer = class extends Component {
    constructor(props, context) {
      super(props, context);

      this.subscriptions = {};
      this.state = { data: {} };

      this.resubscribe(props, context);
    }

    componentWillReceiveProps(props, context) {
      this.resubscribe(props, context);
    }

    componentWillUnmount() {
      this.unsubscribe();
    }

    resubscribe(props, context) {
      const newObservables = observe(props, context);
      const newSubscriptions = {};

      for (let key in newObservables) {
        newSubscriptions[key] = newObservables[key].subscribe({
          onNext: (value) => {
            this.state.data[key] = value;
            this.setState({ data: this.state.data });
          },
          onError: () => {},
          onCompleted: () => {}
        });
      }

      this.unsubscribe();
      this.subscriptions = newSubscriptions;
    }

    unsubscribe() {
      for (let key in this.subscriptions) {
        if (this.subscriptions.hasOwnProperty(key)) {
          this.subscriptions[key].dispose();
        }
      }

      this.subscriptions = {};
    }

    render() {
      return <ComposedComponent {...this.props} data={this.state.data} />;
    }
  };

  Enhancer.propTypes = ComposedComponent.propTypes;
  Enhancer.contextTypes = ComposedComponent.contextTypes;

  return Enhancer;
}

рдЙрдкрдпреЛрдЧ:

// can't put this on component but this is good enough for playing
function observe(props, context) {
  return {
    yourStuff: observeYourStuff(props)
  };
}

class YourComponent extends Component {
  render() {
    // Note: this.props.data, not this.data
    return <div>{this.props.data.yourStuff}</div>;
  }
}

export default polyfillObserve(YourComponent, observe);

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

рдПрдХ рддрд░рдл рдХреЗ рд░реВрдк рдореЗрдВ рдзрд╛рд░рд╛рдПрдВ рдХреНрдпреЛрдВ рдирд╣реАрдВ? рдореЗрд░реЗ рдкрд╛рд╕ рджреМрдбрд╝ рдореЗрдВ рдХреЛрдИ рдШреЛрдбрд╝рд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ; рд╡реЗрдм рд╕реНрдЯреНрд░реАрдо рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИ, рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдиреЛрдб рд╣реИ

рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рджреЛ: https://github.com/cujojs/most рдФрд░ https://github.com/caolan/highland

@jquense рдИрд╕реАрдПрдордПрд╕реНрдХреНрд░рд┐рдкреНрдЯ 7 (+) рдореЗрдВ рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ рд╕рдХреНрд░рд┐рдп рдХрд╛рдо рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдпрд╣ рд╕рд╛рджрд╛ рдЬреЗрдПрд╕ рдмрди рдЬрд╛рдПрдЧрд╛ред https://github.com/jhusain/asyncgenerator (рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдкреБрд░рд╛рдирд╛ рд╣реИред)

рд╣рдо RxJS рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдирд╣реАрдВ рд▓реЗрдВрдЧреЗред рдПрдкреАрдЖрдИ рдЖрд░рдПрдХреНрд╕рдЬреЗрдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рд╕реНрд╡рдпрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЫреЛрдЯрд╛ рд╣реИред RxJS рд╕рдХреНрд░рд┐рдп ECMAScript рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рдмрд╕реЗ рдХрд░реАрдм рд╣реИред

рдЕрдзрд┐рдХрд╛рдВрд╢.рдЬреЗрдПрд╕ рднреА рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд▓рдЧрддрд╛ рд╣реИред

рдмреЗрдХрди рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рдмрд┐рдирд╛ рдмреЗрдХрди.рдЬреЗрдПрд╕ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд▓рдЧрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Bacon.Event рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╕реНрдЯреНрд░реАрдо рдПрдкреАрдЖрдИ рдмрд╣реБрдд рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рд╣реИрдВ рдФрд░ рдЗрд╕ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИрдВред

рдХреНрдпрд╛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ "рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ" рд╡рд┐рдХрд▓реНрдк рд╣реИ? рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рд░реЗрдВрдбрд░рд┐рдВрдЧ рд╕реЗ рдкрд╣рд▓реЗ рд╕рднреА рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓реНрд╕ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд░реНрд╡рд░ рдкрд░ рдЖрдк рдЙрдиреНрд╣реЗрдВ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рддрд╛рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдХрдВрдкреЛрдиреЗрдВрдЯ рдХрд╛ рд░реЗрдВрдбрд░ () рд╣реЛ рдкреВрд░реНрдг , рдЖрдВрд╢рд┐рдХ рдирд╣реАрдВред

[parent] await observe(). full render(). -> [foreach child] await observe(). full render().

рдЕрдкрдиреЗ рд╕рднреА рдЕрдиреНрд╡реЗрд╖рдгреЛрдВ рдореЗрдВ рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдпрд╣ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рд░рд┐рдПрдХреНрдЯ рдореЗрдВ рдЧрд╛рдпрдм рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЬреАрд╡рдирдЪрдХреНрд░ рд╣реБрдХ рд╣реИред

рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдпрд╣ рдмрддрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ рдХрд┐ рд░рд┐рдПрдХреНрдЯ рдиреЗрдХреНрд╕рд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреЛрд╕реНрдЯ рдореЗрдВ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ:

рдЗрд╕реНрдореЛрд░реНрдлрд┐рдХ рдРрдкреНрд╕ рдиреЗ рд░рд┐рдПрдХреНрдЯ рдиреЗрдХреНрд╕рд╕ рдХреЗ рд╕рд╛рде рд╕рд╣реА рдХрд┐рдпрд╛

рдХреЛрд░ рдкреНрд░реАрдлрд╝реЗрдЪрд┐рдВрдЧ рд░реВрдЯреАрди рдХрд╛ рдЖрд░реЗрдЦ рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

React Nexus

рд╣рдо RxJS рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдирд╣реАрдВ рд▓реЗрдВрдЧреЗред рдПрдкреАрдЖрдИ рдЖрд░рдПрдХреНрд╕рдЬреЗрдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рд╕реНрд╡рдпрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЫреЛрдЯрд╛ рд╣реИред RxJS рд╕рдХреНрд░рд┐рдп ECMAScript рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рдмрд╕реЗ рдХрд░реАрдм рд╣реИред

:+1: рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдмрдбрд╝реА рдЪрд┐рдВрддрд╛ рдХрд╛ рд╡рд┐рд╖рдп рд╣реИ, рдХрд╣рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдХрд░, рд╡рд╛рджреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЬрд╣рд╛рдВ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдмреЗрд╣рдж рдХрдард┐рди рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдЖрдк рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдиреНрдпрдерд╛ рдЖрдк рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХ рддрдВрддреНрд░ рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ lib рдкрд░ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред рдореВрд░реНрдд рд░реВрдк рд╕реЗ ... рд╡рд╛рджреЗ рдХреА рджреБрдирд┐рдпрд╛ рд╕реЗ рдЕрдЪреНрдЫреА рдЪреАрдЬреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдП + рдЯреЗрд╕реНрдЯ рд╕реВрдЯ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рднреА рдХрдо рд╕реЗ рдХрдо .then рдХреА рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЖрд╢реНрд╡рд╛рд╕рди рдерд╛, рдЬреЛ рд╡рд╛рджрд╛ рдЗрдВрдЯрд░рдСрдк рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдпрдХ рдерд╛ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╡реЗ рдереЗ рдорд╛рдирдХреАрдХреГрддред

рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдмрдбрд╝реА рдЪрд┐рдВрддрд╛ рдХрд╛ рд╡рд┐рд╖рдп рд╣реИ, рдХрд╣рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдирд╛, рд╡рд╛рджреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдирд╛, рдЬрд╣рд╛рдВ рдЦреБрдж рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдмреЗрд╣рдж рдХрдард┐рди рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдЖрдк рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдиреНрдпрдерд╛ рдЖрдк рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХ рддрдВрддреНрд░ рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ lib рдкрд░ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред

рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣рдорддред рд╢реБрдХреНрд░ рд╣реИ рдХрд┐ рд╡реЗрдзрд╢рд╛рд▓рд╛рдУрдВ рдХрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд░рд▓ рдЕрдиреБрдмрдВрдз рд╣реИ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ then рдЬреИрд╕реА рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡рд┐рдзрд┐рдпрд╛рдВ рднреА рдирд╣реАрдВ рд╣реИрдВ,

рд╡реЗ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ (рдФрд░ рдзреАрдореЗ) рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рд╕рдорд┐рддрд┐ рдЬреЛрд░ рджреЗрдХрд░ рдХрд╣рддреА рд╣реИ рдХрд┐ next рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рд╡рд╛рджреЗ рдЬреИрд╕реЗ рд╕реВрдХреНрд╖реНрдо рдХрд╛рд░реНрдп рдХреЛ рд╢реЗрдбреНрдпреВрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрд╣ рдХреБрдЫ рдмрд╣реБрдд рдкрд░реЗрд╢рд╛рди рдХрд░реЗрдЧрд╛ рдкреИрдЯрд░реНрди рдЗрд╕ рддрдереНрдп рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдХрд┐ рдЕрдЧрд▓рд╛ рдЖрд░рдПрдХреНрд╕рдЬреЗрдПрд╕ рдореЗрдВ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╣реИ: /

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдлреНрд▓рдХреНрд╕ рд╕реНрдЯреЛрд░ рдкреИрдЯрд░реНрди рдкреНрд░рддрд┐-рдХреБрдВрдЬреА рдЖрдзрд╛рд░ рдкрд░ рд╡реЗрдзрд╢рд╛рд▓рд╛рдУрдВ рдХрд╛ рдирдХреНрд╢рд╛ рд░рдЦрдирд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЙрдирдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдлрд┐рд░ рдЬрдм рд╕рднреА рдХреА рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдП рддреЛ рдЙрдиреНрд╣реЗрдВ рд╕рд╛рдл рдХрд░реЗрдВред

рдЗрд╕ рддрд░рд╣ рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреА рдЪреАрдЬреЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: MyStore.get(this.props.someID) рдФрд░ рд╣рдореЗрд╢рд╛ рд╡рд╣реА рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рд╡рд╛рдкрд╕ рдкрд╛рдПрдВред

рдЗрд╕ рддрд░рд╣ рдЖрдк рдЪреАрдЬреЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ: MyStore.get(this.props.someID) рдФрд░ рд╣рдореЗрд╢рд╛ рд╡рд╣реА рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рд╡рд╛рдкрд╕ рдкрд╛рдПрдВред

this.props.key (рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдЧрдпрд╛) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ? рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдРрд╕реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ <... key={child.id} .. /> рд╕рд╛рде рдкрд╛рд╕ рдХрд░ рдЪреБрдХреЗ рд╣реИрдВред

рдЗрд╕ рддрд░рд╣ рдЖрдк рдЪреАрдЬреЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ: MyStore.get(this.props.someID) рдФрд░ рд╣рдореЗрд╢рд╛ рд╡рд╣реА рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рд╡рд╛рдкрд╕ рдкрд╛рдПрдВред

рдпрд╣реА рд╡рд╣ рдкреИрдЯрд░реНрди рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдореИрдВ рд░рд┐рдПрдХреНрдЯ рдиреЗрдХреНрд╕рд╕ рдХреЗ рд▓рд┐рдП рднреА рдХрд░рддрд╛ рд╣реВрдВред рд╕реНрдЯреЛрд░#рдСрдмреНрдЬрд░реНрд╡ рдПрдХ рдореЗрдореЛрдЗрдЬреНрдб, рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдСрдмреНрдЬрд░реНрд╡рд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИ; рдЬрдм рд╕рднреА рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЯрд┐рдХ рдХреЗ рд▓рд┐рдП рдЪрд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рд╕рд╛рдл рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ (рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдмреИрдХрдПрдВрдб-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдлрд╛рдИ рддрдВрддреНрд░ рд╕рд╣рд┐рдд, рдЬреИрд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ "рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ" рд╕рдВрджреЗрд╢ рдпрд╛ рдЬреЛ рдХреБрдЫ рднреА рднреЗрдЬрдирд╛)ред

@sebmarkbage @gaearon v0.14 рдореЗрдВ рд╕рд░реНрд╡рд░ рдкрд░ рдХрд╛рдо рдХреИрд╕реЗ рджреЗрдЦреЗрдВрдЧреЗ?
рдХреНрдпрд╛ рдпрд╣ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдиреЗрдХреНрд╕рд╕ (рд▓реЗрдХрд┐рди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛) рдХреЗ рд╕рдорд╛рди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рднреА рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдареАрдХ рд╕реЗ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛?

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

@gaearon : рдЖрдИрдПрдордУ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдШрдЯрдХ рд╕рд░реНрд╡рд░ рдкрд░ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рд▓рд┐рдП "рддреИрдпрд╛рд░" рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкрд╣рд▓реЗ рджреЗрдЦреЗ рдЧрдП рдореВрд▓реНрдп рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реЛрдВред

рд╣рд╛рдБ, :+1: рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рд▓рд┐рдПред рдЗрд╕ рдмреАрдЪ @andreypopp рджреНрд╡рд╛рд░рд╛ react-async рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ "рд╣реИрдХ" рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП fibers рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд░рд┐рдПрдХреНрдЯ рдЖрдЙрдЯ-рдСрдл-рдж-рдмреЙрдХреНрд╕ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░ рд╕рдХреЗред

Async рд░реЗрдВрдбрд░рд┐рдВрдЧ рдПрдХ рдРрд╕реА рдЪреАрдЬрд╝ рд╣реИ рдЬрд┐рд╕рдХрд╛ рд╣рдо рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИред рд▓реА

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдЗрд╕реЗ 0.14 рдореЗрдВ рдирд╣реАрдВ рдмрдирд╛ рдкрд╛рдПрдВрдЧреЗред рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдФрд░ рд░рд┐рдлреНрд▓реЗрдХреНрдЯрд░ рдХреА рдЬрд░реВрд░рдд рдХреЗ рд▓рд┐рдП рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдбрд┐рдЬрд╛рдЗрдиред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЖрдВрддрд░рд┐рдХ рдореЗрдВ рд╡рд╛рд╕реНрддреБрд╢рд┐рд▓реНрдк рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдФрд░ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВред

рдореЗрд░реЗ рдкрд╛рд╕ @gaearon re: React -streaming-state рдЬреИрд╕рд╛ рд╣реА рд╡рд┐рдЪрд╛рд░ рдерд╛ред рд╕рд╛рдЗрдб рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдиреНрдп рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдХреНрдпрд╛ data рд╕реЗ рдмреЗрд╣рддрд░ рдирд╛рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, observed рдЗрд╕реЗ рд╡рд┐рдзрд┐ рд╕реЗ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдВрдмрджреНрдз рдХрд░реЗрдЧрд╛ред

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

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╡реЗрдзрд╢рд╛рд▓рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ, рдпрд╣ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдП

react-async рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╕рдордп рдореИрдВ рдЗрд╕реА рддрд░рд╣ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, README рджреЗрдЦреЗрдВред

рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рд╕рдореЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп / рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд╣рдЪрд╛рди рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реВрдВ, рдареАрдХ рдЙрд╕реА рддрд░рд╣ рдЬреИрд╕реЗ рд░рд┐рдПрдХреНрдЯ key рдкреНрд░реЛрдк рдФрд░ рд╕реНрдЯреЗрдЯрдлреБрд▓ рдШрдЯрдХреЛрдВ рдХреЗ рд╕рд╛рде рдХрд░рддрд╛ рд╣реИред

рдЬрдм рдирд╛рдорд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ id рдмрджрд▓рддрд╛ рд╣реИ рддреЛ React Async рдкреБрд░рд╛рдиреЗ рдкреНрд░реЛрд╕реЗрд╕ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЛ рд░реЛрдХ рджреЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдирдпрд╛ рдкреНрд░рд╛рд░рдВрдн рдХрд░рддрд╛ рд╣реИред

рдПрдкреАрдЖрдИ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

import React from 'react';
import Async from 'react-async';

function defineFetchProcess(url) {
  return {
    id: url,
    start() {
      return fetch(url)
    }
  }
}

function MyComponentProcesses(props) {
  return {
    user: defineFetchProcess(`/api/user?user${props.userID}`)
  }
}

@Async(MyComponentProcesses)
class MyComponent extends React.Component {

  render() {
    let {user} = this.props
    ...
  }
}

рдкреНрд░рдХреНрд░рд┐рдпрд╛ API рдЕрдм ES6 Promise API рдХрд╛ рд╡рд╛рдХреНрдп-рд░рдЪрдирд╛ рдФрд░ рдирд╛рдо-рд╡рд╛рд░ рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╢рдмреНрджрд╛рд░реНрде рдХреА рджреГрд╖реНрдЯрд┐ рд╕реЗ рдпрд╣ process.then(onNext, onError) рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд▓рд╛рдЗрд╡ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдХреЙрд▓ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╡рд╛рджреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреЗрдЯрд╛ рд▓рд╛рдиреЗ рдХреЗ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп (?) рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдИрдорд╛рдирджрд╛рд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдм рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рднреНрд░рдо рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдЗрд╕реЗ рдмрджрд▓рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред

рдореИрдВ рд╢рд╛рдпрдж рдЧрд▓рдд рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд (рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ) рдПрдкреАрдЖрдИ рдХреЛ рдпреВрдЬрд░рд▓реИрдВрдб рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрддреА рд╣реИ, рд╡рд╣ рдЬреАрд╡рдирдЪрдХреНрд░ рд╣реБрдХ рдХреА рдХрдореА рд╣реИ рдЬреЛ componentWillUpdate рддрд░рд╣ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рд╕реЗ рдареАрдХ рдкрд╣рд▓реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдирдП props рдФрд░ state рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рд╣реИред

рдПрдХ рдмрд╛рдд рдЬрд┐рд╕ рдкрд░ рдЕрднреА рддрдХ рдЪрд░реНрдЪрд╛ рдирд╣реАрдВ рд╣реБрдИ рд╣реИ рд╡рд╣ рд╣реИ onError рдХреЙрд▓рдмреИрдХ рдХрд╛ рдкреНрд░рдмрдВрдзрдиред рдпрджрд┐ рдХреЛрдИ рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдЬрд╛рдирдХрд╛рд░реА рдШрдЯрдХ рдХреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдЙрдкрд▓рдмреНрдз рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдЪреВрдВрдХрд┐ рд░рд┐рдПрдХреНрдЯ рд╡рд╛рд╕реНрддрд╡рд┐рдХ subscribe(callbacks) рдХреЙрд▓ рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЙрд╕ рдХреЙрд▓рдмреИрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рдирдХреАрдХреГрдд рд╡рд┐рдзрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛рдкрди рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рджреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВред рдкрд╣рд▓рд╛ рдпрд╣ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ this.data рдХреЗ рд╕рдорд╛рди рд╢реАрд░реНрд╖-рд╕реНрддрд░реАрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрд░ рд░рдЦрд╛ рдЬрд╛рдПред рдпрд╣ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рднрд╛рд░реА рд╣рд╛рде рд▓рдЧрддрд╛ рд╣реИ, рдФрд░ рдЖрдЧреЗ рдШрдЯрдХ рдХреЗ рдирд╛рдорд╕реНрдерд╛рди рдХреЛ рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред
рджреВрд╕рд░рд╛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ onError рдХреЙрд▓рдмреИрдХ рдХреЛ рдЬреАрд╡рдирдЪрдХреНрд░-рдИрд╢ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рдЕрдЧрд░ рдореИрдВ рдЕрдкрдиреЗ рд╡реЗрдзрд╢рд╛рд▓рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХрд╕реНрдЯрдо рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рддреЛ рдореИрдВ рдХреБрдЫ рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рдерд╛

onObserveError(key, error) {
  // do something with the error
  this.state.errors[key] = error;
  this.setState({ errors: this.state.errors });
}

рдпрд╣ рд╡реИрд╕рд╛ рд╣реА рд╣реИ рдЬреИрд╕рд╛ рд╣рдордиреЗ Parse+React рдХреЗ рдЖрдЧрд╛рдореА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдореЗрдВ рдХрд┐рдпрд╛ рд╣реИред рд╣рдордиреЗ рдЕрдкрдиреА рдЗрдЪреНрдЫрд┐рдд рдПрдкреАрдЖрдИ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рд╕реНрд╡рдпрдВ рдХреА рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдмрдирд╛рдИред рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдПрдХ рдирд┐рдЬреА {рдирд╛рдо => рддреНрд░реБрдЯрд┐} рдорд╛рдирдЪрд┐рддреНрд░ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдШрдЯрдХреЛрдВ рдореЗрдВ рдПрдХ рд╢реАрд░реНрд╖-рд╕реНрддрд░реАрдп рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡рд┐рдзрд┐ рд╣реЛрддреА рд╣реИ, queryErrors() , рдЬреЛ рдорд╛рдирдЪрд┐рддреНрд░ рдХрд╛ рдПрдХ рдХреНрд▓реЛрди рд▓реМрдЯрд╛рддреА рд╣реИ рдпрджрд┐ рд╡рд╣ рдЦрд╛рд▓реА рдирд╣реАрдВ рд╣реИ, рдФрд░ null рдЕрдиреНрдпрдерд╛ (рдПрдХ рд╕рд╛рдзрд╛рд░рдг if (this.queryErrors()) рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ред

рдмреЗрд╢рдХ, рдирдП рдЖрд░рдХреНрд╖рд┐рдд рддрд░реАрдХреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рднреА рдПрдХ рдореБрд╢реНрдХрд┐рд▓ рдХрд╛рдо рд╣реИ; рдореИрдВ рджрд┐рдЦрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдкреНрд░рддрд┐рдкрд╛рджрди рдХрд░рддреЗ рд╕рдордп рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдпрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЪрд╛рд╣рд┐рдПред

@andrewimm рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рддреНрд░реБрдЯрд┐ рдкреНрд░рд╕рд╛рд░ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдлреАрдб рдХрд░рдирд╛ рд╣реИ рдЬреЛ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЛ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдЗрд╕реЗ рддреНрд░реБрдЯрд┐ рд╕реАрдорд╛ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред https://github.com/facebook/react/issues/2928

рдЗрд╕реЗ рдлреЗрдВрдХрдиреЗ рдФрд░ рдЗрдирд╛рдпрдд рд╕реЗ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рднреА рд╕рдВрднрд╛рд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЬреИрд╕реЗ рдЕрдЧрд░ render() рд╡рд┐рдзрд┐ рдлреЗрдВрдХрддрд╛ рд╣реИред рдпрд╣ рдХрд╛рдлреА рдЕрдзрд┐рдХ рдХрд╛рдо рд╣реИ рдФрд░ рдЗрд╕реЗ рдареАрдХ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рдХреБрдЫ рд╕рдордп рд▓рдЧреЗрдЧрд╛ рд▓реЗрдХрд┐рди рд╡рд┐рдЪрд╛рд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЛ рдПрдХреАрдХреГрдд рдХрд░рдирд╛ рдерд╛ред

рдореИрдВ рддрд░реНрдХ рджреВрдВрдЧрд╛ рдХрд┐ рдЗрд╕реЗ рдЙрдЪрд┐рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рд╣рд░ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ 1 рдпрд╛ 2 рдкреНрд░рдореБрдЦ рдПрдХреАрдХрд░рдг рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдПрд╕рд┐рдВрдХ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдиреЗрдХреНрд╕рд╕ рдЬреИрд╕реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕рдордиреНрд╡рдпрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдпрд╣ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд╕рдлрд╛рдИ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ ....

рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрдЭрд╛рдП рдЧрдП рддрд░реАрдХреЗ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ
рдЗрд╕реЗ рдврд╛рдВрдЪреЗ рдореЗрдВ рд╣реА рдкрдХрд╛рдирд╛

рдордВрдЧрд▓рд╡рд╛рд░ рдХреЛ, рдЕрдкреНрд░реИрд▓ 21, 2015, рд░рд╛рдд 11:38 рдЕрдкрд░рд╛рд╣реНрди рд░реЛрдбреЛрд▓реНрдлреЛ рд╣реИрдирд╕реЗрди рд╕реВрдЪрдирд╛рдПрдВ @github.com
рд▓рд┐рдЦрд╛ рдерд╛:

рдореИрдВ рддрд░реНрдХ рджреВрдВрдЧрд╛ рдХрд┐ рдЗрд╕реЗ рдЙрдЪрд┐рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рд╣рд░ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ 1 рдпрд╛ 2 рдХреБрдВрдЬреА
рдПрдХреАрдХрд░рдг рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдПрд╕рд┐рдВрдХ рдЬреИрд╕реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕рдордиреНрд╡рдпрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдЧрдардмрдВрдзрди рддреЛ рдпрд╣ рдЙрдЪрд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд╕рдлрд╛рдИ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ....

-
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ рдпрд╛ рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/facebook/react/issues/3398#issuecomment -95048028ред

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

рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡реЗрдзрд╢рд╛рд▓рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдПрдкреАрдЖрдИ рдмрдирд╛рдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИред

рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдХреЛрдб рдХреЛ рдХрдареЛрд░рддрд╛ рд╕реЗ рди рдЖрдВрдХреЗрдВ, рдпрд╣ рдПрдХ рд╕рдкреНрддрд╛рд╣ рдХреЗ рдЕрдВрдд рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:

  • рдордЬрд╝рд╛
  • рд╕рд╣рдорддрд┐
  • рдЬреЗрдПрд╕-рд╕реАрдПрд╕рдкреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
  • рдЕрд╡рд▓реЛрдХрди рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

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

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

рдкреНрд░рддрд┐-рдШрдЯрдХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд░рд┐рдПрдХреНрдЯ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдХреА рд╕рдм рдХреБрдЫ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдВрднрд╡ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдо рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЗ рд╡реИрд╢реНрд╡рд┐рдХ рдЗрдВрдЬреЗрдХреНрд╢рди рдирд╣реАрдВ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкреВрд░реЗ рдкрд░реНрдпрд╛рд╡рд░рдг рдореЗрдВ рдШрдЯрдХ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд░рд┐рдПрдХреНрдЯ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдмрдиреЗ рдврд╛рдВрдЪреЗ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╣рдо рдХреМрди рд╕реЗ рд╣реБрдХ рдпрд╛рдж рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

рдЕрд░реЗ,

рдИрдорд╛рдирджрд╛рд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЬрдмрдХрд┐ рдирдП рд╣реБрдХ рдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛ рджрд┐рдпрд╛ рд╣реЛрдЧрд╛, рд╣рдо рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЙрдирдХреЗ рдмрд┐рдирд╛ рдмрдЧрд╝рд▓ рдореЗрдВ рдбреЗрдЯрд╛ рд▓реЛрдбрд┐рдВрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ react-async рдФрд░ react-nexus ред

рдпрджрд┐ рдХреБрдЫ рднреА рд╣реЛ, рддреЛ рд░рд┐рдПрдХреНрдЯ рдШрдЯрдХреЛрдВ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдФрд░ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╕реЗ рдПрдХ рдорд╛рдЙрдВрдЯреЗрдб рд░рд┐рдПрдХреНрдЯ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рдмрд╛рд╣рд░ рдЬреАрд╡рдирдЪрдХреНрд░ рдХреЛ рдорджрдж рдорд┐рд▓реЗрдЧреАред react-nexus рдореИрдВ рдЖрдВрддрд░рд┐рдХ instanciateReactComponent рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ componentWillMount , componentWillUnmount , рдЖрджрд┐ рдХреЛ рд╕реНрд╡рдпрдВ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рдореИрдВ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рднрдВрдЧреБрд░ рдорд╛рдирддрд╛ рд╣реВрдВ (рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ instanciateReactComponents рдЙрди рдЖрдВрддрд░рд┐рдХ рдЗрдирд╡реЗрд░рд┐рдПрдВрдЯ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд░рд┐рдПрдХреНрдЯ рдХреЗ рдЕрдЧрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВ?)

рд╕реНрдЯреЗрдЯрд▓реЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрд╕рд┐рдВрдХ рдбреЗрдЯрд╛ _is_ рд╕реНрдЯреЗрдЯрдлреБрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреБрдЫ рдШрдЯрдХреЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд▓рдВрдмрд┐рдд/рдкреВрд░реНрдг/рд╡рд┐рдлрд▓ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИред рдЬрдм рд╣рдо рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреЗ рдРрдкреНрд╕ рдореЗрдВ react-nexus рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЙрдЪреНрдЪ-рдХреНрд░рдо рд╡рд╛рд▓реЗ рдШрдЯрдХ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдбреЗрдЯрд╛ рд▓рд╛рдиреЗ рдХрд╛ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдиреЗ рдмрдЪреНрдЪреЛрдВ рдХреЗ рдШрдЯрдХреЛрдВ рдХреЛ рдкреНрд░реЙрдкреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВред рдЖрдВрддрд░рд┐рдХ рдШрдЯрдХ рдЗрд╕ рдкреНрд░рдХрд╛рд░ "рд╕реНрдЯреЗрдЯрд▓реЗрд╕" (рдЬреЛ рд╡рд╛рдВрдЫрдиреАрдп рд╣реИ) рд╣реИ, рдФрд░ рдмрд╛рд╣рд░реА рдШрдЯрдХ "рд╕реНрдЯреЗрдЯрдлреБрд▓" рд╣реИ (рдЬреЛ рд╡рд╛рдВрдЫрдиреАрдп рднреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд▓реЛрдбрд┐рдВрдЧ рд╕реНрдкрд┐рдирд░ рдпрд╛ рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП)ред

рдЖрдк рдХрд┐рди рдЕрдиреНрдп рдПрдХреАрдХрд░рдг рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрдВрдЧреЗ?

рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @ANDREYPOPP рдиреЗ рд╕рд╣реА рд╕рд╡рд╛рд▓ рдкреВрдЫрд╛ рд╣реИред рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдореЗрдВ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЬреАрд╡рдирдЪрдХреНрд░ рд╣реБрдХ рдпреВрдЬрд░рд▓реИрдВрдб рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдмрд╕реЗ рдЫреЛрдЯрд╛ рдиреНрдпреВрдирддрдо рдПрдкреАрдЖрдИ рдкрд░рд┐рд╡рд░реНрддрди рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдмрд╛рдХреА рд╕реЗрдЯрд┐рдВрдЧ рдФрд░ рдЯреНрд░рд┐рдЧрд░рд┐рдВрдЧ рдмрд▓ рдЙрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЬреЛ рднреА рдЗрдирдкреБрдЯ рд╕реНрдЯреНрд░реАрдо/рдПрдорд┐рдЯрд░/рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ data рдмрджрд▓рддреЗ рд╣реИрдВред рдЬрдм рддрдХ рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдФрд░ рд╡рд┐рд╢реЗрд╖ рдпрд╛рдж рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ (рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдВрднрд╡)?

рдореИрдВ рдпрд╣рд╛рдВ рдмрдбрд╝реА рдЪрд░реНрдЪрд╛ рдореЗрдВ рдирд╣реАрдВ рдкрдбрд╝ рд░рд╣рд╛ рд╣реВрдВред
рд▓реЗрдХрд┐рди @sebmarkbage рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реБрдХ рдореЗрдВ рд╕реЗ рдПрдХ рдореБрдЭреЗ рдХреБрдЫ рдРрд╕рд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡реЗрдзрд╢рд╛рд▓рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░рдиреЗ рдкрд░ рд╣реА рдЖрд╡рд╢реНрдпрдХ рд╣реЛред

  • рдПрдХ рд╣реБрдХ рдЬреЛ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рджреЗрдЦрдиреЗ рдпреЛрдЧреНрдп _before_ рджреНрд╡рд╛рд░рд╛ рдзрдХреНрдХрд╛ рджрд┐рдП рдЧрдП рдорд╛рдиреЛрдВ рд╕реЗ рдирд┐рдкрдЯ рд╕рдХрддрд╛ рд╣реИ, рд╡реЗ рдбреЗрдЯрд╛ рдкрд░ рд╕реЗрдЯ рд╣реЛрддреЗ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡реЗрдзрд╢рд╛рд▓рд╛рдУрдВ рдХреЗ рд╕рд╛рде, рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ .map . рд╣реЛрдЧрд╛

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

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд┐рдЫрд▓реА рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдХрд╣ рд░рд╣реА рд╣реИрдВ рдХрд┐ рд╕рдмрд╕реЗ рдЫреЛрдЯрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдмрд┐рдВрджреБ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ "рдХрдиреЗрдХреНрдЯ" рдФрд░ "рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ" рдЬреАрд╡рдирдЪрдХреНрд░ рд╣реБрдХ рд╣реИ - рдЬреЛ рдПрдХ рдШрдЯрдХ рдХреЛ рдПрд╕рд┐рдВрдХ рдбреЗрдЯрд╛ рд╕рдВрд▓рдЧреНрди рдХрд░рдирд╛ рдФрд░ рдЙрди рд╕рджрд╕реНрдпрддрд╛рдУрдВ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ?

рддрдм рд╡реЗрдзрд╢рд╛рд▓рд╛рдУрдВ рдХреЛ рдЙрд╕ (рдЕрдВрджрд░ рдпрд╛ рдмрд╛рд╣рд░ рдХреЛрд░) рдкрд░ рдХрд╛рдлреА рддреБрдЪреНрдЫ рд░реВрдк рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛ - рд▓реЗрдХрд┐рди рдЙрди рдЬреАрд╡рдирдЪрдХреНрд░ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рд╕реЗ рд╡реНрдпрд╛рдкрдХ рдЕрдкреАрд▓ рд╣реЛрддреА рд╣реИ?

рдХреНрдпрд╛ рдпрд╣ рдПрдХ рдЙрдЪрд┐рдд рд╕рд╛рд░рд╛рдВрд╢ рд╣реИ?

рдореИрдВ рдЕрднреА рднреА рдЖрд╢реНрд╡рд╕реНрдд рдирд╣реАрдВ рд╣реВрдВ рдХрд┐ рдЗрд╕реЗ рд░рд┐рдПрдХреНрдЯ рдореЗрдВ рд╣реА рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореИрдВ рдпрд╣ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЗрдЪреНрдЫреБрдХ рд╣реВрдВ рдХрд┐ рд░рд┐рдПрдХреНрдЯ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд┐рдПрдХреНрдЯ рдХреЛ рдХреЛрдИ рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реБрдХ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд▓реЗрдХрд┐рди рдПрдХ рдкрд▓ рдХреЗ рд▓рд┐рдП, рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдо observe() рдХреЗ рд╕рд╛рде рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рдХреБрдЫ рд╡рд┐рдЪрд╛рд░:

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ this.props , this.state , this.context рдФрд░ рдЕрдм this.data , рд╕рднреА render() рдореЗрдВ рдирдП рдбреЗрдЯрд╛ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рд╕реНрд░реЛрдд рд╣реИрдВред рдпрд╣ рдореБрдЭреЗ рдЕрддреНрдпрдзрд┐рдХ рд▓рдЧрддрд╛ рд╣реИред рдХреНрдпрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрдЯреЗрдЯ рдХреЛ рдХрдВрдкреЛрдиреЗрдВрдЯ рд╕реНрдЯреЗрдЯ рд╕реЗ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ? рдпрд╣ рд░рд╛рдЬреНрдп рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЗ рдХреБрдЫ рдореБрджреНрджреЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдФрд░ рдЕрд▓рдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдирдпрд╛ рдЗрдирдкреБрдЯ рдкреЗрд╢ рдХрд░рдиреЗ рдХреА рд▓рд╛рдЧрдд рд▓рд╛рдн рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИред рдпрджрд┐ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ this.state рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдШрдЯрдХ рд╕реНрдерд┐рддрд┐ рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реЛ, рддреЛ рдХреНрдпреЛрдВ рди this.data рдореЗрдВ рдлрд╝реАрд▓реНрдб рдХреЛ this.props рдпрд╛ this.context $ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рджрд┐рдпрд╛ рдЬрд╛рдП?

this.data рдирд╛рдо рдмрд╣реБрдд рд╕рд╛рдорд╛рдиреНрдп рд╣реИред рд╕рд╣рд╛рд░рд╛ рдбреЗрдЯрд╛ рд╣реИ, рд░рд╛рдЬреНрдп рдбреЗрдЯрд╛ рд╣реИ, рдФрд░ рдХреЛрдИ рднреА рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдбреЗрдЯрд╛ рд╣реИред рдирд╛рдо рдХреЛрдИ рдЕрд░реНрде рдирд╣реАрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдФрд░ рдореМрдЬреВрджрд╛ рдЕрд░реНрдереЛрдВ рдХреЛ рдЙрд▓рдЭрд╛рддрд╛ рд╣реИред рдореИрдВ this.observed рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдирд╛рдо рдХреЛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ рдЬрд┐рд╕рдХрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рдорддрд▓рдм рд╣реЛрдЧрд╛ред рддреЛ +1 рд╕реЗ @matthewwithanm рдХреА рдЯрд┐рдкреНрдкрдгреА:

data рд╕реЗ рдмреЗрд╣рддрд░ рдХреЛрдИ рдирд╛рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, observed рдЗрд╕реЗ рд╡рд┐рдзрд┐ рд╕реЗ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдВрдмрджреНрдз рдХрд░реЗрдЧрд╛ред

рдЕрдЧрд░ рд╣рдо рд╕рд░реНрд╡рд░ рдкрд░ observe() рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реБрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рдХрд┐рд╕реА рднреА рдореЗрдореЛрд░реА рд▓реАрдХ рдХреЛ рд╕рд╛рдл рдХрд░ рджреЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЕрдирдорд╛рдЙрдВрдЯрд┐рдВрдЧ рдХрднреА рдирд╣реАрдВ рд╣реЛрдЧреАред

рдпрджрд┐ рд╣рдо observe() рдХреЛ рд╣рд░ рдмрд╛рд░ props рдпрд╛ state рдкрд░рд┐рд╡рд░реНрддрди (рдФрд░ context observe ) рдЧрд▓рддреА рд╕реЗ рдорд╣рдВрдЧрд╛ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ред рдпрд╣ рдЧрд░реНрдо рд░рд╛рд╕реНрддреЗ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдмрди рдЬрд╛рддрд╛ рд╣реИред рдореБрдЭреЗ рд░рд┐рдПрдХреНрдЯ рдиреЗрдХреНрд╕рд╕ рд╕реЗ рдпрд╣ рдкрд╕рдВрдж рд╣реИ:

рдЕрдЧрд▓реЗ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдкрд┐рдЫрд▓реЗ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рд╕реЗ рднрд┐рдиреНрди рд╣реИрдВ; рд╣рдЯрд╛рдП рдЧрдП рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЛ рдЕрдирд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛрдбрд╝реЗ рдЧрдП рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЛ рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реЛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд░рд╛рдЬреНрдп рдШрдЯрдХреЛрдВ рдХреЛ рдЬрдЯрд┐рд▓ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдореИрдВ рдЗрд╕реЗ рдЕрдкрдиреЗ рдШрдЯрдХреЛрдВ рдореЗрдВ рдХрдо рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЗрд╕реЗ рдКрдкрд░ рдЙрдард╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐, @fisherwebdev рджреНрд╡рд╛рд░рд╛ рдЙрдард╛рдИ рдЧрдИ рдЪрд┐рдВрддрд╛рдУрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛ (рдЬрд┐рд╕рд╕реЗ рдореИрдВ рдЕрднреА рд╕рд╣рдордд рд╣реВрдВ), рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реИ рдХрд┐ observe рдХреЛ state рдкрд░ рдирд┐рд░реНрднрд░ рд░рд╣рдиреЗ рджреЗрдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред рд░рд╛рдЬреНрдп рд╕рд╣рд╛рд░рд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдордирд╛рдпрд╛ рд░рд╛рдЬреНрдп _рдФрд░_ рд╕рд╣рд╛рд░рд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ.. рдХреНрдпрд╛ рдпрд╣ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ? рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп observe(props) рд╣реЛрдЧрд╛ред

рдореБрдЭреЗ рдпрд╣ рднреА рдкрддрд╛ рдЪрд▓ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдирд┐рд░реАрдХреНрд╖рдг state рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреНрдпрд╛рджрд╛рддрд░ рдЗрд╕рд▓рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ @gaearon рдмрддрд╛рддреЗ рд╣реИрдВ, рд░рд╛рдЬреНрдп рдХреЛ рдПрдХ рд╕реНрддрд░ рд╕реЗ рдКрдкрд░ рдЙрдард╛рдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИ, рдЬреЛ рдЪрд┐рдВрддрд╛рдУрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╕рд╛рдл рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реИред рдЬрдм observe рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ state рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдШрдЯрдХ рдХреЗ рднреАрддрд░ рдЕрджреНрдпрддрдиреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХрд╛ рддрд░реНрдХ рдХрд╛рдлреА рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ; рдЬрдм рдпрд╣ рдХреЗрд╡рд▓ props рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ componentDidMount / componentWillReceiveProps рдореЗрдВ рдХрд╛рдВрдЯрд╛ рд░рд╣рд┐рдд рд╣реИрдВрдбрд▓рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрде рдореЗрдВ рдХрдо рдХреЛрдб рдПрдХ рд╕рд░рд▓ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдЪрдХреНрд░ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдЕрдкрдбреЗрдЯ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рднреА рдХрдо рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕рджрд╕реНрдпрддрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЯреНрд░рд┐рдЧрд░ рдХрд░рддреЗ рд╣реИрдВред

рдЕрд╡рд▓реЛрдХрди рдХреЗ рд▓рд┐рдП +1 (рдкреНрд░реЙрдкреНрд╕)

рд╣рдо рд░рд╛рдЬреНрдп рдХреЗ рд╕рд╛рде рдЬрд┐рддрдирд╛ рдХрдо рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдВрдЧреЗ, IMO рдЙрддрдирд╛ рд╣реА рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред

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

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рд╣рд░ рдХреЛрдИ рд╕рд╣реА рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдХрд┐ рд╣рдо рд╕рд╣реА рджрд┐рд╢рд╛ рдореЗрдВ рдЬрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд░рд╛рдЬреНрдп рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдореЗрдВ рдЧрд▓рддреА рд╕реЗ "рдпрд╣ рдПрдХ рдПрдВрдЯреАрдкреИрдЯрд░реНрди" рдЬреИрд╕рд╛ рдХреБрдЫ рдвреВрдВрдврдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдмрд╕ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдореИрдВ flatMap рдвреВрдВрдв рд░рд╣рд╛ рдерд╛ред рдореИрдВрдиреЗ рдЦреБрдж рдХреЛ рднреНрд░рдорд┐рдд рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдпрд╣ рд╕рдВрджреЗрд╢реЛрдВ рдХреА рд╕рд░рдгреА рдХреЛ рд╕рдорддрд▓ рдХрд░ рджреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЙрдЪреНрдЪ рд╕реНрддрд░ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ (рд╕рдВрджреЗрд╢ рджреЗрдЦрдиреЗ рдпреЛрдЧреНрдп)ред

рдХреНрдпрд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдПрдкреАрдЖрдИ рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЛ рд╕рдВрднрд╛рд▓реЗрдЧрд╛ рдЬрд╣рд╛рдВ рдПрдХ рдбреЗрдЯрд╛ рдлрд╝реАрд▓реНрдб рдХрд╛ рдкрд░рд┐рдгрд╛рдо рджреВрд╕рд░реЗ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИ? рдпрд╛рдиреА рдЖрдк рдкрд╣рд▓реЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдореИрдк рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдирдореВрджрд╛рд░ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ:

observe(props, context) {
  if (!props.params.threadID) {
    return {};
  }

  const observeThread = ThreadStore.observeGetByID(
    {id: props.params.threadID}
  );
  return {
    thread: observeThread,
    messages: observeThread.map(thread => {
      return MessageStore.observeGetByIDs({ids: thread.messageIDs});
    })
  };
}

рдореИрдВ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╡реЗрдзрд╢рд╛рд▓рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдирдпрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЧрд▓рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реВрдВред рд╡рд╛рджрд╛-рднреВрдорд┐ рдореЗрдВ рдпрд╣ рдмреЗрд╣рдж рд╕рд░рд▓ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ then рд╕реЗ рдПрдХ рд╡рд╛рджрд╛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рд╕реЗ рдмрд╛рдж рдореЗрдВ then рдПрд╕ рдЙрд╕ рд╡рд╛рджреЗ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реЛрдЧрд╛ред

рдореИрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рд╕рдордЭ рдирд╣реАрдВ рдкрд╛ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕реЗ this.state рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдирдХреИрдкреНрд╕реБрд▓реЗрдЯреЗрдб рд╕реНрдЯреЗрдЯ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд░рд┐рдПрдХреНрдЯ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдмрдирд╛ рджреЗрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╡рд╣ рднреА рдмрд╕ рдЗрддрдирд╛ рд╣реА рд╣реИред рдпрджрд┐ рдПрдирдХреИрдкреНрд╕реБрд▓реЗрдЯреЗрдб рдЕрд╡рд╕реНрдерд╛ рдирд╣реАрдВ рд╣реЛрддреА, рддреЛ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдореЗрдореЛрдЗрдЬреНрдб рддрддреНрдХрд╛рд▓ рдореЛрдб рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреАред рдпрджрд┐ рдЖрдк рд╕рднреА "рд╕реНрдЯреЛрд░" рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рд╛рдБ, рдЖрдкрдХреЛ рд░рд╛рдЬреНрдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╣ рдирд╣реАрдВ рд╣реИ рдЬреЛ рд░рд┐рдПрдХреНрдЯ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдХрд░рддреЗ рд╣реИрдВред

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдИ рдкреИрдЯрд░реНрди рд╣реИрдВ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рд░реИрдкрд░ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рд╕реНрдЯреЛрд░ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдкрдХрд╛ рджреЗрдЦрд╛ рдЧрдпрд╛ рдбреЗрдЯрд╛ рд╣рдореЗрд╢рд╛ рд░рд╛рдЬреНрдп рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд░реВрдк рд╕реЗред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдирд┐рд░реАрдХреНрд╖рдг рдореЗрдВ рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рд░рд╣рдирд╛ рдХреЛрдИ рдмреБрд░реА рдЖрджрдд рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП

observe() {
  return { items: Items.getPagedItems({ pageIndex: this.state.currentPage }) };
}

рднрд▓реЗ рд╣реА observe state рдкрд░ рдирд┐рд░реНрднрд░ рди рд╣реЛ, рдлрд┐рд░ рднреА рдпрд╣ props рдФрд░ context рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░реЗрдЧрд╛ред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЕрдЧрд░ рдпрд╣ context рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рдерд╛, рддрдм рднреА рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╕рдВрдХреЗрдд рд╣реЛрдЧрд╛ рдЬреЛ context рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рдШрдЯрдХ рдХреЗ рдкреНрд░реЛрдк рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕реЗ observe рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

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

рдпрд╣ observe рд╣реБрдХ рд░рд┐рдПрдХреНрдЯ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕ рдЕрд░реНрде рдореЗрдВ рдХрд┐ рд░рд╛рдЬреНрдп рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓реНрд╕ рдореЗрдВ рдХреИрдкреНрдЪрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдпрд╣ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдбрд┐рдЬрд╛рдЗрди рд▓рдХреНрд╖реНрдп рд╣реИ рдХрд┐ рдХреНрд▓реЛрдЬрд░ рдФрд░ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░реЛрдВ рдореЗрдВ рдлрдВрд╕рдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рд╛рдл рдЕрд▓рдЧ рд░рд╛рдЬреНрдп-рдкреЗрдбрд╝ рд╣реИ рдЬрд┐рд╕реЗ рдЬрдореЗ рд╣реБрдП рдФрд░ рдкреБрдирд░реНрдЬреАрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рд╢реНрд░рдорд┐рдХреЛрдВ рдореЗрдВ рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЬреЛ рдореБрдЭреЗ рдореЗрд░реЗ рдЕрдВрддрд┐рдо рдмрд┐рдВрджреБ рдкрд░ рд▓рд╛рддрд╛ рд╣реИ ...

рд╣рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕реЗ рдореВрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП _need_ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдореВрд▓ "рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ" рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдорд╛рдЙрдВрдЯрдХрдВрдкреЛрдиреЗрдВрдЯ/рдкреНрд░рд╛рдкреНрдд рдХреЙрдореНрдкреЛрдиреЗрдВрдЯ рдерд╛ рдФрд░ рдЖрдк рдЗрд╕рдХреЗ рдКрдкрд░ рдЕрдкрдиреА рд╕рдВрдкреВрд░реНрдг рд╕рдордЧреНрд░ рдШрдЯрдХ рдкреНрд░рдгрд╛рд▓реА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧреЛрдВ рдиреЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдмрд╛рд╕реНрдЯреНрд░рдХреНрд╢рди рдмрд╛рд░ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рд╣рдо рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЙрдЪреНрдЪ рдПрдмреНрд╕реНрдЯреНрд░реИрдХреНрд╢рди рдмрд╛рд░ рджреНрд╡рд╛рд░рд╛ рд╕рдХреНрд╖рдо рд╣реИрдВред рдЬреИрд╕реЗ рдХрд┐ рдШрдЯрдХ-рд╡реНрдпрд╛рдкреА рдЕрдиреБрдХреВрд▓рдиред

рд░рд┐рдПрдХреНрдЯ рдХрд╛ рдкреНрд░рд╛рдердорд┐рдХ рдЙрджреНрджреЗрд╢реНрдп рдШрдЯрдХреЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рдЕрдиреБрдмрдВрдз рдмрдирд╛рдирд╛ рд╣реИ рддрд╛рдХрд┐ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдЕрдореВрд░реНрдд рд╕рд╣-рдЕрд╕реНрддрд┐рддреНрд╡ рдореЗрдВ рд░рд╣ рд╕рдХреЗрдВред рдЙрд╕ рднреВрдорд┐рдХрд╛ рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рд╕рд╛рдорд╛рдиреНрдп рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдореВрд░реНрддрддрд╛ рдХреЗ рд╕реНрддрд░ рдХреЛ рдКрдкрд░ рдЙрдард╛рдирд╛ рд╣реИ рддрд╛рдХрд┐ рд╣рдо рдирдИ рдХреНрд░реЙрд╕-рдШрдЯрдХ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░ рд╕рдХреЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдмрдЯреНрд░реА рдХреА рд╕рднреА рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рд╣реЗрдЬрдирд╛, рдлрд┐рд░ рд╕рдмрдЯреНрд░реА рдХреЛ рдкреБрдирд░реНрдЬреАрд╡рд┐рдд рдХрд░рдирд╛ред рдпрд╛ рд╕рдВрднрд╡рддрдГ рд╕рд░реНрд╡рд░ рдкрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЕрдирдорд╛рдЙрдВрдЯрд┐рдВрдЧ рдпрд╛ рд╕рд░реНрд╡рд░ рдкрд░ рд╕рд╛рдордВрдЬрд╕реНрдп рдХреЗ рд╕рдордп рдкрд╣рд▓реБрдУрдВ рдХреЛ рдмрджрд▓рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред

рдпрд╣ рд╕рдм рд╕реНрд╡рд╛рджрд┐рд╖реНрдЯ рдФрд░ рд╕рдорд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╢рд╛рдорд┐рд▓ рдХреБрдЫ рдмреИрдЯрд░реА рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред

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

рдХрд╛рд╢ рдРрд╕рд╛ рдХреБрдЫ рдбреЙрдХреНрд╕ рдореЗрдВ "рджрд░реНрд╢рди / рдбрд┐рдЬрд╛рдЗрди рд▓рдХреНрд╖реНрдп / рдЧреИрд░-рд▓рдХреНрд╖реНрдп" рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЛрддрд╛ред

рд░рд┐рдПрдХреНрдЯ рдХрд╛ рдкреНрд░рд╛рдердорд┐рдХ рдЙрджреНрджреЗрд╢реНрдп рдШрдЯрдХреЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рдЕрдиреБрдмрдВрдз рдмрдирд╛рдирд╛ рд╣реИ рддрд╛рдХрд┐ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдЕрдореВрд░реНрдд рд╕рд╣-рдЕрд╕реНрддрд┐рддреНрд╡ рдореЗрдВ рд░рд╣ рд╕рдХреЗрдВред рдЙрд╕ рднреВрдорд┐рдХрд╛ рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рд╕рд╛рдорд╛рдиреНрдп рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдореВрд░реНрддрддрд╛ рдХреЗ рд╕реНрддрд░ рдХреЛ рдКрдкрд░ рдЙрдард╛рдирд╛ рд╣реИ рддрд╛рдХрд┐ рд╣рдо рдирдИ рдХреНрд░реЙрд╕-рдШрдЯрдХ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░ рд╕рдХреЗрдВред

рдЗрд╕реЗ рдкреНрд░реЗрдо рдХрд░реЗрдВред рдореИрдВ @gaearon рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдпрд╣ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рд╣реЛрддрд╛ред

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

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

@jquense рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣рдордд рд╣реВрдБред рдореИрдВ рдЗрд╕ рд╣реБрдХ рдХреЛ рдмрд╣реБрдд рдкрд╣рд▓реЗ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред (рдореВрд▓ рдкреНрд░рдпреЛрдЧ: https://github.com/reactjs/react-page/commit/082a049d2a13b14199a13394dfb1cb8362c0768a)

рджреЛ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдЭрд┐рдЭрдХ рдпрд╣ рдереА рдХрд┐ рдпрд╣ рдЕрднреА рднреА рдорд╛рдирдХреАрдХрд░рдг рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИред рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдЗрд╕реЗ рдХреЛрд░ рднреА рдЬреЛрдбрд╝рддреЗ, рдореИрдВ рдПрдХ рдорд╛рдирдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдЪрд╛рд╣рддрд╛ рдерд╛ред

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

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

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

рдЖрдо рддреМрд░ рдкрд░ рдореБрдЭреЗ рдЬрд╝рд╛рд▓реНрдЧреЛ рдХреЛ рд╡реЗрдзрд╢рд╛рд▓рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд▓рдЧрддреА рдХреНрдпреЛрдВрдХрд┐ рдЙрдкрднреЛрдХреНрддрд╛ рд╣рдореЗрд╢рд╛ рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ observeOn рдЬреИрд╕реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЗ рд╕рд╛рде рд╣рдореЗрд╢рд╛-рдПрд╕рд┐рдВрдХ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдЪреБрди рд╕рдХрддрд╛ рд╣реИред

рдЦреБрд╢реА рд╣реИ рдХрд┐ рдЗрд╕ рдкрд░ рдЕрдВрддрдд: рдХреБрдЫ рд╕рд╣рдорддрд┐ рдмрди рдЧрдИ рд╣реИред рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓реНрд╕ рдкрд░ рдЪреИрдирд▓ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓реНрд╕ рдХреЛ рднрд╛рд╖рд╛ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рддреЛ рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдЕрдм рдФрд░ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред

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

рдореБрдЭреЗ рдЬрд╝рд╛рд▓реНрдЧреЛ рднреА рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд▓рдЧрддреАред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓реНрд╕ рдХреЗ рд╕рд╛рде рдЖрдк рдПрд╕рд┐рдВрдХреНрд╕ рдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реЗрдбреНрдпреВрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рд╡рд╛рдВрдЫрд┐рдд рд╣реИ, рддреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╢реЗрдбреНрдпреВрд▓рд░ рдЕрдм рдПрд╕рд┐рдВрдХреНрд╕ рд╣реИ рддрд╛рдХрд┐ рдЖрдк рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗрдВред

@sebmarkbage рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдореЗрд░реА рдЕрдзрд┐рдХрд╛рдВрд╢ рдЪрд┐рдВрддрд╛рдУрдВ рдХреЛ рджреВрд░ рдХрд░ рджрд┐рдпрд╛ рд╣реИ рдФрд░ рдЕрдм рдореИрдВ рдЗрд╕реЗ рдврд╛рдВрдЪреЗ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд▓рд╛рдн рджреЗрдЦрддрд╛ рд╣реВрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдХреНрдпрд╛ рдЖрдк this.data рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - (1) рдХреНрдпрд╛ рд╣рдо рдЙрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдкреНрд░реЙрдкреНрд╕/рд╕рдВрджрд░реНрдн/рд░рд╛рдЬреНрдп рдореЗрдВ рдореЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ (2) рдХреНрдпрд╛ рд╣рдо рдЗрд╕рдХрд╛ рдирд╛рдо рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ?

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

... рдЬрд╣рд╛рдВ рдХреЛрдИ рд╡рд╛рджрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╢рд┐рдХрд╛рдпрдд рд╡рд╛рд▓реЗ рднреА) рдПрдХ рджреВрд╕рд░реЗ рдкрд░ рднрд░реЛрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдирд╛рд╡рд╢реНрдпрдХ рд▓рдкреЗрдЯрдиреЗ рдФрд░ рд░рдХреНрд╖рд╛рддреНрдордХ рдХрд╛рд░реНрдп рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╣рд▓ рдХрд░рддреЗ рд╣реИрдВ

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

рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣рдордд рд╣реБрдБред рдореИрдВ рдЗрд╕ рд╣реБрдХ рдХреЛ рдмрд╣реБрдд рдкрд╣рд▓реЗ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рджреЛ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдЭрд┐рдЭрдХ рдпрд╣ рдереА рдХрд┐ рдпрд╣ рдЕрднреА рднреА рдорд╛рдирдХреАрдХрд░рдг рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИред рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдЗрд╕реЗ рдХреЛрд░ рднреА рдЬреЛрдбрд╝рддреЗ, рдореИрдВ рдПрдХ рдорд╛рдирдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдЪрд╛рд╣рддрд╛ рдерд╛ред

рдореБрдЭреЗ рдЦреБрд╢реА рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рднреА рднрд╛рдЧ рд▓рд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕реБрдХреВрди рджреЗрдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред :) рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рджреЛрдВ рдХреЛ рдЬрд▓реНрджреА рдЕрдкрдирд╛рдирд╛ рдЙрд╕ рд╡рд┐рдкрдХреНрд╖ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ рдЬрд┐рд╕рдХреА рдореИрдВ рдпрд╣рд╛рдВ рдЪрд░реНрдЪрд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореЗрд░реА рдЪрд┐рдВрддрд╛ рдХреЛ рдирд╛рдкрд╕рдВрдж рдпрд╛ рдЕрд╕реНрд╡реАрдХреГрдд рди рдХрд░реЗрдВ, рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдПрдкреАрдЖрдИ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдкрд░ рдмрд╣реБрдд рдЙрддреНрд╕рд╛рд╣рд┐рдд рд╣реВрдВред рдФрд░ рдореИрдВ рдпрд╣ рднреА рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫрд╛/рд╕рдмрд╕реЗ рдЙрдЪрд┐рдд рд╡рд┐рдХрд▓реНрдк рдХреИрд╕реЗ рд╣реИред

"рд╣рдореЗрдВ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рдХреЗ рдЖрд░рдПрдХреНрд╕рдЬреЗрдПрд╕ рдЕрдиреБрдмрдВрдз рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдореЗрдВ рд╣реИ рдФрд░ рд╕рдордХрд╛рд▓рд┐рдХ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдмрд╛рд░ @рдЭреБрд╕реИрди рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдореЗрдВ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЙрд╕ рдЕрдиреБрдмрдВрдз рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдВрдЧреЗред"

рдмрд╕ рдереЛрдбрд╝рд╛ рдФрд░ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдПред рдЧреИрд░-рдЕрд╡рд░реБрджреНрдз рдмреИрдХ рдкреНрд░реЗрд╢рд░ рдХреЗ рд╕рд╛рде рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╕реНрдЯреНрд░реАрдо рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд╕реНрдЯреНрд░реАрдо рдкрд╣рд▓ (http://www.reactive-streams.org/) рд╣реИред рдЗрд╕рдореЗрдВ рд░рдирдЯрд╛рдЗрдо рд╡рд╛рддрд╛рд╡рд░рдг (JVM рдФрд░ JavaScript) рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдиреЗрдЯрд╡рд░реНрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ рдХрд┐рдП рдЧрдП рдкреНрд░рдпрд╛рд╕ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

рд╡рд░реНрддрдорд╛рди рдкреНрд░рдореБрдЦ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди fe Akka Streams рдпрд╛ RxJava рд╣реИрдВред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдХреНрдпрд╛ RxJ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдм рдЙрд╕реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЕрдиреБрдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ, рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░ рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕рдСрдирд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм (рд╕рджрд╕реНрдпрддрд╛ рдПрд╕), рдСрдирдиреЗрдХреНрд╕реНрдЯ (рдЯреА рдЯреА), рдкреВрд░реНрдг (), рдСрдирд░рд░ (рдереНрд░реЛрдмрд▓ рдЯреА) рдкрд░ рд╣реИред

рдХреНрдпрд╛ рдЖрдк @jhusain рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ рдЕрдзрд┐рдХ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ?

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

рдХреНрдпрд╛ рдЗрд╕ рдкрд╣рд▓ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдХреЛрдИ рд╕реНрдерд┐рддрд┐ рдпрд╛ рд▓рдХреНрд╖реНрдп рд╣реИ?

@vladap рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ @jhusain . рдХрд╛ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ

рдореИрдВрдиреЗ @jhusain рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрдврд╝рд╛ рд╣реИ рдФрд░ рдореИрдВ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╕рдВрднрд╡рддрдГ рдЗрд╕ рдпреБрдХреНрддрд┐ рдкрд░ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХреА рдкреНрд░реЗрд░рдгрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реВрдВред рдХреНрдпрд╛ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рд▓рд╛рдн рд╣реИ?

рд░рд┐рдПрдХреНрдЯрд┐рд╡-рд╕реНрдЯреНрд░реАрдо рд╕реНрдкреЗрдХ рдХрд╛ рдмрдбрд╝рд╛ рд╕рдорд░реНрдерди рд╣реИ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдВрд╕реНрдХрд░рдг 1.0 рдкрд░ рд╣реИред рдХреНрдпреЛрдВрдХрд┐ RxJava рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рдпреБрдХреНрддрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ RxJs рдЕрдиреБрд╕рд░рдг рдХрд░реЗрдВрдЧреЗ (рд▓реЗрдХрд┐рди рдЬрд╛рдБрдЪ рдирд╣реАрдВ рдХреА рд╣реИ)ред

рдпрд╣ рдмреНрд▓реЙрдЧ рдЕрдХреНрдХрд╛ рдзрд╛рд░рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдХреБрдЫ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд╕рд╛рд░рд╛рдВрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдореИрдВ рдмреИрдХрдПрдВрдб рдФрд░ рдлреНрд░рдВрдЯрдПрдВрдб рдкрд░ рд╕рдорд╛рди рдЗрдВрдЯрд░рдлреЗрд╕ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд▓рд╛рдн рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ, рдореБрдЦреНрдпрддрдГ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рджреЛрдиреЛрдВ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВред рд╕рдВрднрд╡рддрдГ рдпрд╣ рдмреИрдХрдПрдВрдб рдФрд░ рдлреНрд░рдВрдЯрдПрдВрдб рд╕рдореВрд╣реЛрдВ рдХреЗ рдмреАрдЪ рд╕рд╣рдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рджреВрд╕рд░реА рдУрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗрдмрд╕реЛрдХреЗрдЯ рдпрд╛ рдПрд╕рдПрд╕рдИ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдПрдХреАрдХрд░рдг рдмрд┐рдВрджреБ рд╣реИрдВред

рдореБрдЭреЗ рдЕрднреА www.reactive-streams.org рдкрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХрд░реНрддрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдЬрдм рдореИрдВрдиреЗ рдЗрд╕рдХреА рдЬрд╛рдБрдЪ рдХреА рдереА:

рдмреНрдпреЛрд░реНрди рдПрдВрдЯреЛрдиреНрд╕рди - рдЯрд╛рдЗрдкрд╕реЗрдл рдЗрдВрдХред
рдЧреЗрд╡рд┐рди рдмреАрд░рдореИрди - рдУрд░реЗрдХрд▓ рдЗрдВрдХред
рдЬреЙрди рдмреНрд░рд┐рд╕реНрдмрд┐рди - рдирд┐рд░реНрдгрд╛рдпрдХ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдЗрдВрдХред
рдЬреЙрд░реНрдЬ рдХреИрдВрдкрдмреЗрд▓ - рдиреЗрдЯрдлреНрд▓рд┐рдХреНрд╕, рдЗрдВрдХ
рдмреЗрди рдХреНрд░рд┐рд╕реНрдЯреЗрдВрд╕реЗрди - рдиреЗрдЯрдлреНрд▓рд┐рдХреНрд╕, рдЗрдВрдХ
рдорд╛рдерд┐рдпрд╛рд╕ рдбреЛрдирд┐рдЯреНрдЬрд╝ - рд╕реНрдкреНрд░реЗ.рдЖрдИрдУ
рдорд╛рд░рд┐рдпрд╕ рдПрд░рд┐рдХреНрд╕рди - рдЯреНрд╡рд┐рдЯрд░ рдЗрдВрдХред
рдЯрд┐рдо рдлреЙрдХреНрд╕ - рд░реЗрдб рд╣реИрдЯ рдЗрдВрдХред
рд╡рд┐рдХреНрдЯрд░ рдХреНрд▓реИрдВрдЧ - рдЯрд╛рдЗрдкрд╕реЗрдл рдЗрдВрдХред
рдбреЙ. рд░реЛрд▓реИрдВрдб рдХреБрд╣реНрди - рдЯрд╛рдЗрдкрд╕реЗрдл рдЗрдВрдХред
рдбреМрдЧ рд▓реА - SUNY Oswego
рд╕реНрдЯреАрдлрди рдорд╛рд▓рджрд┐рдиреА - рдирд┐рд░реНрдгрд╛рдпрдХ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдЗрдВрдХред
рдиреЙрд░реНрдорди рдореМрд░рд░ - рд░реЗрдб рд╣реИрдЯ рдЗрдВрдХред
рдПрд░рд┐рдХ рдореАрдЬрд░ - рдПрдкреНрд▓рд╛рдЗрдб рдбреНрдпреВрдПрд▓рд┐рдЯреА рдЗрдВрдХред
рдЯреЙрдб рдореЛрдВрдЯрдЧреЛрдорд░реА - рдХрд╛рдЬрд╝рд┐рдВрдЧ рдХреЙрд░реНрдкред
рдкреИрдЯреНрд░рд┐рдХ рдиреЙрд░реНрдбрд╡реЙрд▓ - рдЯрд╛рдЗрдкрд╕реЗрдл рдЗрдВрдХред
рдЬреЛрд╣рд╛рдиреНрд╕ рд░реВрдбреЛрд▓реНрдл - Spray.io
рдПрдВрдбреНрд░реЗ рд╡рд░реНрдЧрд╛ - рдЯрд╛рдЗрдкрд╕реЗрдл рдЗрдВрдХред

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдпрд╣рд╛рдВ рдмрд╣реБрдд рджреВрд░ рдЬрд╛рдКрдВ рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдмрдбрд╝рд╛ рд╕рдВрджрд░реНрдн рднрд╡рд┐рд╖реНрдп рдХреЗ рдлреИрд╕рд▓реЛрдВ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред

@vladap рдЬреЛ рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдФрд░ рдЬреЛ рдореИрдВ рдЬреАрдердм рдореБрджреНрджреЛрдВ рдкрд░ рджреЗрдЦрддрд╛ рд╣реВрдВ
рдПрдХ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдирдЬрд░рд┐рдП рд╕реЗ, рдЬреЛ рдореИрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЬреАрдердм рдореБрджреНрджреЛрдВ рдФрд░ рдЕрдиреНрдп рд╡рд┐рд╢рд┐рд╖реНрдЯ рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдореЗрдВ рднреА рд╕рдордЭ рд╕рдХрддрд╛ рд╣реВрдВ, рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЬрдирд░реЗрдЯрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╕рдореНрдорд╛рди рдХрд░реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реИ:

{
  next(value),
  throw(e),
  return(v)
}

рдмрд╕ рдПрдХ 'рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм' рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рдмрд╣реБрдд рд╣реА рдмреБрдирд┐рдпрд╛рджреА рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЬреЛ рдЙрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╕рдореНрдорд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпрд╣ рдПрдХ рд╣реА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрд▓рдЧ рдирд╛рдордХрд░рдг рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ, рдЗрд╕ рдорд╛рдпрдиреЗ рдореЗрдВ рдпрд╣ рдареАрдХ рд╣реИред рдореИрдВ рд╢рд╛рдпрдж рдЙрд╕реА рдирд╛рдордХрд░рдг рдХреЛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ рдЬреИрд╕рд╛ рдХрд┐ рдХрд▓реНрдкрдирд╛ рдореЗрдВ рд╣реИ рд▓реЗрдХрд┐рди рдЕрдВрдд рдореЗрдВ рдореБрдЭреЗ рдЗрд╕рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдпреЗ рд╡рд┐рдзрд┐рдпрд╛рдВ рд╕рдорд╛рди рд╣реИрдВред

рдореИрдВ рдСрдирд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм() рдХреЗ рдмрд░рд╛рдмрд░ рд▓рд╛рдкрддрд╛ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдмреНрд▓реЙрдЧ рдореЗрдВ рдореИрдВрдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рд▓реЗрдЦрдХ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдкреАрда рдХреЗ рджрдмрд╛рд╡ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреБрдВрдЬреА рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЗрд╕рдХреЗ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рд╣реИрдВред рдЗрд╕рд╕реЗ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд░рд┐рдПрдХреНрдЯ рдмреИрдХ-рдкреНрд░реЗрд╢рд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдФрд░ рд░рдгрдиреАрддрд┐ рд╣реИред рдпрд╣ рдПрдХ рдЬрдЯрд┐рд▓ рдЪреАрдЬ рд╣реИ рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ рд╣реИред

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

рднрд╡рд┐рд╖реНрдп рдХреЗ рдИрд╕реАрдПрдордПрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╣рд╛рдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ? рдЕрдЧрд░ рдХреЛрдИ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИред

рд╡рд░реНрддрдорд╛рди рдкреНрд░рд╕реНрддрд╛рд╡ рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

https://github.com/jhusain/asyncgenerator

рдЬреЗрдПрдЪ

7 рдордИ, 2015, рдкрд░ 2:32 AM рдкрд░, vladap [email protected] рд▓рд┐рдЦрд╛ рд╣реИ:

рднрд╡рд┐рд╖реНрдп рдХреЗ рдИрд╕реАрдПрдордПрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╣рд╛рдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ? рдЕрдЧрд░ рдХреЛрдИ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИред

-
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ рдпрд╛ рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВред

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

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

FYI рдХрд░реЗрдВ RxJS рдХреА рд╡рд░реНрддрдорд╛рди рдореЗрдВ RSP рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рд╣реИред

рдЬреЗрдПрдЪ

7 рдордИ, 2015 рдХреЛ рджреЛрдкрд╣рд░ 2:30 рдмрдЬреЗ, vladap [email protected] рдиреЗ рд▓рд┐рдЦрд╛:

рдпрд╣ рдПрдХ рд╣реА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрд▓рдЧ рдирд╛рдордХрд░рдг рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ, рдЗрд╕ рдорд╛рдпрдиреЗ рдореЗрдВ рдпрд╣ рдареАрдХ рд╣реИред рдореИрдВ рд╢рд╛рдпрдж рдЙрд╕реА рдирд╛рдордХрд░рдг рдХреЛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ рдЬреИрд╕рд╛ рдХрд┐ рдХрд▓реНрдкрдирд╛ рдореЗрдВ рд╣реИ рд▓реЗрдХрд┐рди рдЕрдВрдд рдореЗрдВ рдореБрдЭреЗ рдЗрд╕рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдпреЗ рд╡рд┐рдзрд┐рдпрд╛рдВ рд╕рдорд╛рди рд╣реИрдВред

рдореИрдВ рдСрдирд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм() рдХреЗ рдмрд░рд╛рдмрд░ рд▓рд╛рдкрддрд╛ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдмреНрд▓реЙрдЧ рдореЗрдВ рдореИрдВрдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рд▓реЗрдЦрдХ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдкреАрда рдХреЗ рджрдмрд╛рд╡ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреБрдВрдЬреА рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЗрд╕рдХреЗ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рд╣реИрдВред рдЗрд╕рд╕реЗ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд░рд┐рдПрдХреНрдЯ рдмреИрдХ-рдкреНрд░реЗрд╢рд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдФрд░ рд░рдгрдиреАрддрд┐ рд╣реИред рдпрд╣ рдПрдХ рдЬрдЯрд┐рд▓ рдЪреАрдЬ рд╣реИ рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ рд╣реИред

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

-
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ рдпрд╛ рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВред

рдмрд╣реБрдореВрд▓реНрдп рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред рдЗрд╕рд╕реЗ рдмрд╣реБрдд рдХреБрдЫ рдмреЛрдз рд╣реЛрддрд╛ рд╣реИред

@gaearon рдореИрдВрдиреЗ рдЖрдкрдХреЛ рдХреЙрдкреА рдХрд┐рдпрд╛ рд╣реИред рдореИрдВ ES6 рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде ParseReact рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЙрдЪреНрдЪ-рдХреНрд░рдо рд╡рд╛рд▓реЗ рдШрдЯрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдорд┐рдХреНрд╕рд┐рди рдХреЗ рдЕрд╡рд▓реЛрдХрди рдПрдкреАрдЖрдИ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред

https://gist.github.com/amccloud/d60aa92797b932f72649 (рдиреАрдЪреЗ рдЙрдкрдпреЛрдЧ)

  • рдореИрдВ рдирд┐рд░реАрдХреНрд╖рдг рдХреЛ рдШрдЯрдХ рдкрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдпрд╛ рд╕рдЬрд╛рд╡рдЯреА рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реВрдВред (рдореИрдВ рджреЛрдиреЛрдВ рдХреЛ рдорд┐рд▓рд╛ рд╕рдХрддрд╛ рд╣реВрдВ)
  • рдореИрдВ рд╡реЗрдзрд╢рд╛рд▓рд╛рдУрдВ рдореЗрдВ рдкреНрд░реЙрдкреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рд▓рдп рдХрд░рддрд╛ рд╣реВрдВ (рдирд╣реАрдВ рдпрд╣ред рдбреЗрдЯрд╛, рдпрд╛ рдпрд╣ред рдкреНрд░реЙрдкреНрд╕ред рдбреЗрдЯрд╛)

@aaronshaf @gaearon рдЗрд╕реЗ рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдмрдирд╛рдиреЗ рдХрд╛ рд▓рд╛рдн рдпрд╣ рд╣реИ:

1) рдпрд╣ рдкреНрд░реЙрдкреНрд╕ рдиреЗрдорд╕реНрдкреЗрд╕ рдкрд░ рдирд╣реАрдВ рдЦрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЙрдЪреНрдЪ-рдХреНрд░рдо рд╡рд╛рд▓реЗ рдШрдЯрдХ рдХреЛ рдЖрдкрдХреЗ рдкреНрд░реЙрдкреНрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдбреЗрдЯрд╛ рдЬреИрд╕реЗ рдирд╛рдо рдХрд╛ рджрд╛рд╡рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдХрдИ рдЙрдЪреНрдЪ рдХреНрд░рдо рдХреЗ рдШрдЯрдХреЛрдВ рдХреЛ рд╢реНрд░реГрдВрдЦрд▓рд╛рдмрджреНрдз рдХрд░рдиреЗ рд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рдирд╛рдо рдорд┐рд▓рддреЗ рд░рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЕрдм рдЖрдкрдХреЛ рдЙрди рдирд╛рдореЛрдВ рдХреЛ рдЕрджреНрд╡рд┐рддреАрдп рд░рдЦрдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЦреЛрдЬрдирд╛ рд╣реЛрдЧрд╛ред рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрдк рдХреБрдЫ рдРрд╕реА рд░рдЪрдирд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрдирд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИ рдФрд░ рдЕрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдирд╛рдо рдХрд╛ рд╡рд┐рд░реЛрдз рд╣реИ?

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

HOC рдХреЗ рдмрдЬрд╛рдп, рдпрд╣ рдПрдХ рдирд┐рдпрдорд┐рдд рдШрдЯрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

import Observe from 'react/addons/Observe';

class Foo {
  render() {
    return (
      <Observe
        render={this.renderData}
        resources={{
          myContent: xhr(this.props.url)
        }} />
    );
  }

  renderData({ myContent }) {
    if (myContent === null) return <div>Loading...</div>;
    return <div>{myContent}</div>;
  }
}

рдХреНрдпреЛрдВрдХрд┐ рдЖрдк render рдкреНрд░реЛрдк рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдирд╛рдореЛрдВ рдХреЗ рдЯрдХрд░рд╛рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рджреВрд╕рд░реА рдУрд░, рдпрд╣ рдорд╛рд▓рд┐рдХ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдкреНрд░рджреВрд╖рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдореБрдЭреЗ рдпрд╣рд╛рдВ рдХреНрдпрд╛ рд╕рдордЭ рдирд╣реАрдВ рдЖ рд░рд╣рд╛ рд╣реИ?

рдпрд╣ рдХрдо рд╡рд░реНрдмреЛрдЬрд╝ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ Observe рдШрдЯрдХ рдиреЗ рдЕрдкрдиреЗ рдкреНрд░реЙрдкреНрд╕ рд╕реЗ рд╡реЗрдзрд╢рд╛рд▓рд╛рдУрдВ рдХреЛ рдкрдХрдбрд╝ рд▓рд┐рдпрд╛:

render() {
  return (
    <Observe myContent={Observable.fetch(this.props.url)}
             render={this.renderData} />
  );
}

renderData({ myContent }) {
  if (myContent === null) return <div>Loading...</div>;
  return <div>{myContent}</div>;
}

рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рдЕрдЪреНрдЫреА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ shouldComponentUpdate рдЭреВрдареА рд╡рд╛рдкрд╕реА рдХрд░рддрд╛ рд╣реИ рддреЛ рдпрд╣ рдкреБрди: рд╕рджрд╕реНрдпрддрд╛ рд╕реЗ рдмрдЪ рдЬрд╛рдПрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо render рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдирд╣реАрдВ рдкрд╣реБрдВрдЪреЗрдВрдЧреЗред

рдЕрдВрдд рдореЗрдВ, рдХреЛрдИ render рдХреЗ рд▓рд┐рдП рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕реЗ Observe рдШрдЯрдХ рдореЗрдВ рд▓рдкреЗрдЯрддрд╛ рд╣реИ:

@observe(function (props, state, context) {
  myContent: Observable.fetch(props.url)
})
render({ myContent }) {
  if (myContent === null) return <div>Loading...</div>;
  return <div>{myContent}</div>;
}

рдореИрдВ рдбреЗрдЯрд╛-рдлрд╝реЗрдЪрд┐рдВрдЧ рд▓реЙрдЬрд┐рдХ рдХреЛ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп render рдХреЛ рд╢реБрджреНрдз рд░реЗрдВрдбрд░рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦрдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ред
рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИред рдпрд╣ рдмрд╣реБрдд рдХрд░реАрдм рд╣реИ рдХрд┐ рд░рд╛рдЬреНрдп rx-react рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рд░рд╛рдЬреНрдп рдкреНрд░рдмрдВрдзрди рдХреЛ рдбреЗрдЯрд╛-рдлрд╝реЗрдЪрд┐рдВрдЧ рддрд░реНрдХ рд╕реЗ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдЬреЛ рдмрд╣реБрдд рд╕реБрд╕рдВрдЧрдд рд▓рдЧрддрд╛ рд╣реИред

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

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рддрд░реНрдХ рд▓рд╛рдиреЗ рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛ рдХреЛ рдЗрдВрдЬреЗрдХреНрдЯ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдмрд╕ рдХреБрдЫ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдмрдЪрд╛рддрд╛ рд╣реИред рдпрд╣ рдКрдкрд░ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП desugar рд╣реЛрдЧрд╛, рдЬреЛ рд╕рд┐рд░реНрдл <Observe /> рдШрдЯрдХ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИред рд╕реНрдЯреЗрдЯрдлреБрд▓ рдШрдЯрдХреЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рдЕрд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ render рдХреЛ рдЕрдм рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рд╢реБрджреНрдз рдмрдирд╛рддрд╛ рд╣реИред

рдореИрдВрдиреЗ #3858 рдФрд░ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реЗ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ред

рдХрд┐рд╕реА рднреА рдПрдЪрдУрд╕реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ, рд▓рд╛рдн рдЦреЛрдЬрдХрд░реНрддрд╛ рд╣реИ , рд▓реЗрдХрд┐рди рдбрд╛рдЙрдирд╕рд╛рдЗрдбреНрд╕ рдХрд╛

рд╡рд░реНрддрдорд╛рди рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ, рд▓рд╛рдн рдЦреЛрдЬрдХрд░реНрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдирдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЬреАрд╡рдирдЪрдХреНрд░ рдФрд░ рдмрдбрд╝рд╛ рдореБрдЦреНрдп рдШрдЯрдХ рдПрдкреАрдЖрдИ рд╕рддрд╣ рд╣реИред

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

рдореЗрд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ, рдореИрдВ рд╕реНрдерд╛рди рдФрд░ рдЦреЛрдЬрдХрд░реНрддрд╛ рд░рдЦ рд░рд╣рд╛ рд╣реВрдБ, рд▓реЗрдХрд┐рди:

  • <Observe /> (рдпрд╛ observe() рдбреЗрдХреЛрд░реЗрдЯрд░ рдЬреЛ рд░реЗрдВрдбрд░ рдХреЛ <Observe /> рд╕рд╛рде рд▓рдкреЗрдЯрддрд╛ рд╣реИ) рд╕рд┐рд░реНрдл рдПрдХ рдРрдб-рдСрди рд╣реИ, рдореИрдВ рд░рд┐рдПрдХреНрдЯ рдХреЛрд░ рдореЗрдВ _any_ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
  • рд╣рд░ рдХреЛрдИ рдЕрдкрдиреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЕрд╡рд▓реЛрдХрди рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ <Observe /> рдЬреЛ рдХреЗрд╡рд▓ рдПрдХ рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВред рдЖрдк рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
  • рдШрдЯрдХ рдЬреАрд╡рдирдЪрдХреНрд░ рд╡рд╣реА рд░рд╣рддрд╛ рд╣реИред
  • рдХреЛрдИ рдкреНрд░реЛрдк рд╡рд┐рд░реЛрдз рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдбреЗрдЯрд╛ рдХреЛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  • рд╣рдо рдЕрдкрдиреЗ рдкрд╛рд╕ рдореМрдЬреВрдж рдЯреВрд▓реНрд╕ рд╕реЗ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рдХреЗ рдбреЙрдЧрдлреВрдбрд┐рдВрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
  • рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдирдИ рдореВрд▓ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХрдореА рдЙрдкрдХрд░рдг (рд╕рдЬреНрдЬрд╛рдХрд╛рд░) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рд╢рд╛рдирджрд╛рд░ рдЪрд░реНрдЪрд╛ рдФрд░ рдпрд╣рд╛рдВ рдЪрд╛рд░реЛрдВ рдУрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдмрд╣реБрдд рд╕рдореНрдорд╛рдиред :)

рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдЗрд╕реЗ рдореВрд▓ рдореЗрдВ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИред рд╢рд╛рдпрдж рдПрдХ рдРрдб-рдСрди рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдкрд░реНрдпрд╛рдкреНрдд рдХрд░реНрд╖рдг рджреЗрддрд╛ рд╣реИ рдХрд┐ рд▓реЛрдЧ рдЕрдзрд┐рдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕реЗ рдЕрднрд┐рд╕рд░рдг рдФрд░ рдорд╛рдирдХреАрдХреГрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХрд╣рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдореБрдЭреЗ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ https://github.com/facebook/react/issues/3858 рдФрд░ https://github.com/facebook/react/pull/3920 рд╕реЗ рдмреЗрд╣рддрд░ рд▓рдЧрддрд╛ рд╣реИред

рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдореИрдВ рд╕рд╛рдЗрдб рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ (рдЗрд╕рд▓рд┐рдП рдирдордХ рдХреЗ рджрд╛рдиреЗ) рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ - рдпрд╣ @elierotenberg рдХреЗ рднрдпрд╛рдирдХ рдХрд╛рдо рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдЬреАрд╡рдирдЪрдХреНрд░ рдкрд░ рдХрдмреНрдЬрд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдРрдк рд░рд┐рдПрдХреНрдЯ рдореЗрдВ 100% рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЗрдВрдЯрд░рдСрдк рдХрд░рдирд╛ рд╣реИред

рдХреЙрдлрд╝реАрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рдорд┐рдХреНрд╕рд┐рдиреНрд╕ рдХреЗ рд▓рд┐рдП рдЦреБрдж рдХреЛ рддреИрдпрд╛рд░ рдХрд░реЗрдВ, рдпрд╛ рдЬрдм рддрдХ рдЖрдк рдЪрд╛рд╣реЗрдВ рддреЛ ES6 рдЬреИрд╕рд╛ рджрд┐рдЦрдиреЗ рддрдХ рд╕реНрдХреНрд╡рд┐рдВрдЯ рдХрд░рддреЗ рд░рд╣реЗрдВред :)

_ = require 'lodash'

module.exports = DeclareNeedsMixin = 
  componentDidMount: ->
    <strong i="12">@needsConsumerId</strong> = _.uniqueId @constructor.displayName
    <strong i="13">@sinkNeeds</strong> <strong i="14">@props</strong>, <strong i="15">@state</strong>

  componentWillUpdate: (nextProps, nextState) ->
    <strong i="16">@sinkNeeds</strong> nextProps, nextState

  componentWillUnmount: ->
    @props.flux.declareNeeds <strong i="17">@needsConsumerId</strong>, []

  sinkNeeds: (props, state) ->
    if not @declareNeeds?
      return console.warn 'Missing method required for DeclareNeedsMixin: `declareNeeds`', @

    needs = <strong i="18">@declareNeeds</strong> props, state
    props.flux.declareNeeds <strong i="19">@needsConsumerId</strong>, needs

  # Intended to be overridden by the host class.
  # Returns a set of facts, stored as an array.
  # Yes, immutable data is awesome, that's not the point here though. :)
  # Facts are serializable data, just values.
  # declareNeeds: (props, state) ->
  #   []

рдФрд░ рдЗрд╕ рддрд░рд╣ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛:

module.exports = EmailThreads = React.createClass
  displayName: 'EmailThreads'
  mixins: [DeclareNeedsMixin]

  propTypes:
    flux: PropTypes.flux.isRequired

  declareNeeds: (props, state) ->
    [Needs.GmailData.myThreads({ messages: 20 })]

  ...

рддреЛ declareNeeds рдЗрд╕ рдШрдЯрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдк рдФрд░ рд░рд╛рдЬреНрдп рдХрд╛ рдПрдХрддрд░рдлрд╛ рдХрд╛рд░реНрдп рд╣реИред рдпрд╣рд╛рдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, @props.flux.declareNeeds рдХрд╛ рдкреНрд░рд╛рдкреНрдд рдЕрдВрдд, рдЬреЛ рдПрдХ рд╢реАрд░реНрд╖-рд╕реНрддрд░реАрдп рдШрдЯрдХ рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рд╣реИ, рдЗрди рдЬрд░реВрд░рддреЛрдВ рдХреЛ ProcessSink рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдбреБрдмреЛ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдЕрдкрдиреА рдкрд╕рдВрдж рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдмреИрдЪ рдХрд░рддрд╛ рд╣реИ, рд╕рдорд╛рди flux рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдШрдЯрдХреЛрдВ рдореЗрдВ needs рдбреА-рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЙрди рдЬрд░реВрд░рддреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдЗрдб-рдЗрдлреЗрдХреНрдЯ рдХрд░рддрд╛ рд╣реИ (рдЬреИрд╕реЗ рд╕реЙрдХреЗрдЯ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рдпрд╛ HTTP рдЕрдиреБрд░реЛрдз рдХрд░рдирд╛)ред рдпрд╣ рд╕реЙрдХреЗрдЯ рдХрдиреЗрдХреНрд╢рди рдЬреИрд╕реА рд╕реНрдЯреЗрдЯрдлреБрд▓ рдЪреАрдЬреЛрдВ рдХреЛ рд╕рд╛рдл рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░реЗрдлрд░реЗрдВрд╕ рдХрд╛рдЙрдВрдЯрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрдм рдХреЛрдИ рдШрдЯрдХ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЕрдм рдЙрдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

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

рдореИрдВ рдЗрд╕реЗ рдпрд╣рд╛рдВ рдХреЗрд╡рд▓ рдПрдХ рдФрд░ рдЖрд╡рд╛рдЬ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╛рдЭрд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рд╕реНрдерд╛рди рдореЗрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рдЦреЛрдЬ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдФрд░ рд╡рд░реНрддрдорд╛рди рдПрдкреАрдЖрдИ рдЙрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рдпреЛрдЧ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕реЗрд╡рд╛ рджреЗ рд░рд╣рд╛ рд╣реИред рд╡рд┐рднрд┐рдиреНрди рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХреЗ рдмреАрдЪ рдЗрдВрдЯрд░рдСрдк рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо рдХрджрдо рдХреЛрд░ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @elierotenberg рдиреЗ рдЗрд╕реЗ

рдпрджрд┐ рдХреБрдЫ рднреА рд╣реЛ, рддреЛ рд░рд┐рдПрдХреНрдЯ рдШрдЯрдХреЛрдВ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдФрд░ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╕реЗ рдПрдХ рдорд╛рдЙрдВрдЯреЗрдб рд░рд┐рдПрдХреНрдЯ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рдмрд╛рд╣рд░ рдЬреАрд╡рдирдЪрдХреНрд░ рдХреЛ рдорджрдж рдорд┐рд▓реЗрдЧреАред

рд╕реНрдЯреЗрдЯрд▓реЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрд╕рд┐рдВрдХ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╕реНрдЯреЗрдЯрдлреБрд▓ рд╣реИ, рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреБрдЫ рдШрдЯрдХреЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд▓рдВрдмрд┐рдд/рдкреВрд░реНрдг/рд╡рд┐рдлрд▓ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИред

@elierotenberg рдФрд░ @andrewimm рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рдмрд┐рдВрджреБ рдмрдирд╛рддреЗ рд╣реИрдВред @sebmarkbage рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдиреНрдпреВрдирддрдо рдЗрдВрдЯрд░рдСрдк рдмрд┐рдВрджреБ рдХреА рдУрд░ рдЖрдкрдХреА рд╡реГрддреНрддрд┐ рд╕рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдШрдЯрдХ рдкреЗрдбрд╝ рдХреЛ рдмреБрд▓рдмреБрд▓рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд░реНрдерд╢рд╛рд╕реНрддреНрд░ рдЬреЛрдбрд╝рдирд╛ рдЙрд╕ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИред onError рдФрд░ onCompleted рд╕реЗ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдПрдХ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд╕рд░рд▓ рдХрд╣рд╛рдиреА рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдпрд╣ рд╕рд┐рд░реНрдл this.observed рдореЗрдВ рд╕реНрд▓реЙрдЯ рд╣реЛ рдпрд╛ рддреЛ next/error/completed рдХрд╛ рдЕрдВрддрд┐рдо рдорд╛рди рд░рдЦрддрд╛ рд╣реЛ { next: "foo" } ред рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрдиреЗ рдпреЛрдЧреНрдп рдЕрдиреБрдмрдВрдз рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдП рдмрд┐рдирд╛, рдореБрдЭреЗ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдХрдЯреМрддреА рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рдВрджреЗрд╣ рд╣реИред

рдФрд░ рдЪреВрдВрдХрд┐ рдпрд╣ рдЗрдВрдЯрд░рдиреЗрдЯ рд╣реИ, рдФрд░ рдпрд╣рд╛рдВ рдореЗрд░реА рдкрд╣рд▓реА рдмрд╛рд░ рдЭрдВрдХрд╛рд░ рд╣реЛ рд░рд╣реА рд╣реИ: рд░рд┐рдПрдХреНрдЯ рдЗрд╢реНрдпреВ рдлреАрдб рдХреБрдЫ рдмреЗрд╣рддрд░реАрди рдкрдврд╝рдиреЗ рдФрд░ рдорд╣рд╛рди рдХрд╛рдо рдФрд░ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдСрд▓-рдЕрд░рд╛рдЙрдВрдб рд╕реНрд░реЛрдд рд╣реИред :+1:

рдореЗрд░реЗ рд▓рд┐рдП рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреА рддрд░рд╣ рдЦреБрд╢рдмреВ рдЖ рд░рд╣реА рд╣реИред

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

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдХреЛ react-nexus@^3.4.0 :

// the result from this query...
@component({
  users: ['remote://users', {}]
})
// is injected here...
@component(({ users }) =>
  users.mapEntries(([userId, user]) =>
    [`user:${userId}`, [`remote://users/${userId}/profile`, {}]]
  ).toObject()
))
class Users extends React.Component {
  // ... this component will receive all the users,
  // and their updates.
}

рд╕рдм рдХреБрдЫ, рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдШрдЯрдХ рдПрдкреАрдЖрдИ рдореЗрдВ рдбреЗрдЯрд╛ рдмрд╛рдзреНрдпрдХрд╛рд░реА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдирд╣реАрдВред рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдЪреНрдЪ-рдХреНрд░рдо-рдШрдЯрдХ-рд░рд┐рдЯрд░реНрдирд┐рдВрдЧ рдбреЗрдХреЛрд░реЗрдЯрд░ рдШрдЯрдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдирд╛рдорд╕реНрдерд╛рди рдХреЛ рдкреНрд░рджреВрд╖рд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдбреЗрдЯрд╛ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЬреИрд╕рд╛ рдХрд┐ @sebmarkbage рдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдкреНрд░реЙрдкреНрд╕ рдиреЗрдорд╕реНрдкреЗрд╕ рдореЗрдВ рдкреНрд░рджреВрд╖рдг рдХрд╛ рдЦрддрд░рд╛ рд╣реИред рдЕрднреА рдХреЗ рд▓рд┐рдП, рдореИрдВ рдкреНрд░реЙрдкреНрд╕ рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░ рдбреЗрдХреЛрд░реЗрдЯрд░ ( react-transform-props ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рддрд╛рдХрд┐ рдкреНрд░реЙрдкреНрд╕ рдХреЛ рдЖрдВрддрд░рд┐рдХ рдШрдЯрдХ рдореЗрдВ рдкрд╛рд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЙрдиреНрд╣реЗрдВ рд╕рд╛рдл / рдирд╛рдо рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХреЗ, рд▓реЗрдХрд┐рди рдореИрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдЙрдЪреНрдЪ-рдХреНрд░рдо-рдШрдЯрдХ рдмрди рдЬрд╛рддреЗ рд╣реИрдВ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ рдФрд░ рдирд╛рдо рдЯрдХрд░рд╛рдиреЗ рдХрд╛ рдЬреЛрдЦрд┐рдо рдмрдврд╝ рдЬрд╛рддрд╛ рд╣реИред
рдХреНрдпрд╛ рдЗрд╕реЗ рд╕рдВрдкрддреНрддрд┐ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рдкреНрд░рддреАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдХреНрдпрд╛ propTypes рдЪреЗрдХрд┐рдВрдЧ Symbol -рдХреАрдб рдкреНрд░реЙрдкреНрд╕ рдХреЛ рд╕рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИ? рдХреНрдпрд╛ JSX рдХрдВрдкреНрдпреВрдЯреЗрдб рдЗрдирд▓рд╛рдЗрди рдкреНрд░реЙрдкреНрд╕ рдХреАрдЬрд╝ рдХреЛ рд╕рдкреЛрд░реНрдЯ рдХрд░реЗрдЧрд╛ (рд╣рд╛рд▓рд╛рдБрдХрд┐ рдХреЛрдИ рд╣рдореЗрд╢рд╛ рдХрдВрдкреНрдпреВрдЯреЗрдб рдкреНрд░реЙрдкрд░реНрдЯреАрдЬрд╝ + рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрдкреНрд░реЗрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ)?

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдпрджрд┐ рдпрд╣ рдереЛрдбрд╝рд╛ рд╣рдЯрдХрд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЕрднреА рднреА рдШрдЯрдХ рд╕реНрддрд░ рдкрд░ рдбреЗрдЯрд╛ рдбрд┐рдкреНрд╕ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдореАрдард╛ рдЕрдореВрд░реНрдд/рдПрдкреАрдЖрдИ рдЦреЛрдЬрдирд╛ рд╣реИред

рдореЗрд░рд╛ 2┬в

рд╕рдордп рдХреЗ рд╕рд╛рде рдмрджрд▓рддреЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП 'рдмрдЪреНрдЪреЛрдВ рдХреЛ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдХреЗ рд░реВрдк рдореЗрдВ' рдкреИрдЯрд░реНрди рдХреЗ рд╕рд╛рде рдореБрдЭреЗ рдмрд╣реБрдд рдордЬрд╝рд╛ рдЖ рд░рд╣рд╛ рд╣реИред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ @elierotenberg рдкрд╣рд▓реЗ рдЗрд╕рдХреЗ рд╕рд╛рде рдЖрдП рдереЗ? рдореЗрд░рд╛ рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд╕реНрдкреНрд░рд┐рдВрдЧреНрд╕ рдкрд░ рд╕реНрдкреНрд░рд┐рдВрдЧреНрд╕ (рд░рд┐рдмрд╛рдЙрдВрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) рдореЙрдбрд▓ рдХрд░рдирд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг -

<Springs to={{x: 20, y: 30}} tension={30}>
  {val => <div style={{left: val.x, top: val.y}}>moving pictures</div>}
</Springs>

рдХреЛрдИ рд╕рд╣рд╛рд░рд╛ рдЯрдХрд░рд╛рд╡ рдирд╣реАрдВ, рдФрд░ рдорд╛рд▓рд┐рдХ рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╛ рдХреЛрдИ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВред рдореИрдВ рдХрдИ рд╕реНрдкреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ рдШреЛрдВрд╕рд▓рд╛ рднреА рдмрдирд╛ рд╕рдХрддрд╛ рд╣реВрдВ, рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рднреА рдХрдард┐рди рдмрд┐рдЯреНрд╕ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддреА рд╣реИред рдпреЗ 'рдЕрд╡рд▓реЛрдХрди' (рд╣реЗ!) onError , onComplete рдФрд░ рдЕрдиреНрдп рдкреНрд░реЙрдкреНрд╕ (рдЧреНрд░рд╛рдлрдХреНрд▓ рдХреНрд╡реЗрд░реАрдЬрд╝?) рдХреЛ рднреА рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕реЗ 'рдлреНрд▓рдХреНрд╕' рдХреЗ рд▓рд┐рдП рд╕реНрдХреЗрдЪ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдореЛрдЯрд╛ рдкреНрд░рдпрд╛рд╕

<Store 
  initial={0}
  reduce={(state, action) => action.type === 'click'? state+1 : state} 
  action={{/* assume this comes as a prop from a 'Dispatcher' up somewhere */}}> 
    {state => <div onClick={() => dispatch({type: 'click'})}> clicked {state} times</div>}
</Store>

рд╣рдордиреЗ рдЖрд╕рди рдореЗрдВ рдЗрд╕ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдЬрд┐рд╕реЗ рд╣рдо _render рдХреЙрд▓рдмреИрдХ_ рдХрд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдВрддрддрдГ рдЗрд╕рд╕реЗ рджреВрд░ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред

рдкреЗрд╢реЗрд╡рд░реЛрдВ

  • рдкреНрд░реЙрдкреНрд╕ рдХреЗ рдЯрдХрд░рд╛рдиреЗ рдХреА рдХреЛрдИ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИред
  • StoreComponent рдХреЗ рд▓реЗрдЦрдХ рдФрд░ $#$1 StoreComponent #$ . рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рджреЛрдиреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ

рджреЛрд╖

  • shouldComponentUpdate рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдмреЗрд╣рдж рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд░реЗрдВрдбрд░ рдХреЙрд▓рдмреИрдХ рдкреВрд░реЗ рд░рд╛рдЬреНрдп рдореЗрдВ рдмрдВрдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ A -> Store -> B рдХрд╛ рдПрдХ рдШрдЯрдХ рдкреЗрдбрд╝ рдерд╛ред A рдХреЗ рдкрд╛рд╕ рдЕрдкрдиреЗ рд░рд╛рдЬреНрдп рдореЗрдВ рдПрдХ рдХрд╛рдЙрдВрдЯрд░ рд╣реИ рдЬрд┐рд╕реЗ рд░реЗрдВрдбрд░ рдХреЙрд▓рдмреИрдХ рдХреЗ рджреМрд░рд╛рди B рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рд░рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдХрд╛рдЙрдВрдЯрд░ рдХреЗ рдХрд╛рд░рдг A рдЕрдкрдбреЗрдЯ рд╣реЛрддрд╛ рд╣реИ рдФрд░ Store рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ B рдореЗрдВ рдХрд╛рдЙрдВрдЯрд░ рдХрд╛ рдкреБрд░рд╛рдирд╛ рд╕рдВрд╕реНрдХрд░рдг рд╣реЛрдЧрд╛ред рдирддреАрдЬрддрди, рд╣рдореЗрдВ рд╣рдореЗрд╢рд╛ рд╕реНрдЯреЛрд░ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рд╣реЛрдирд╛ рдкрдбрд╝рд╛ред
  • рдЕрд▓рдЧрд╛рд╡ рдореЗрдВ рдШрдЯрдХреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдмрд╣реБрдд рдХрдард┐рди рд╣реЛ рдЧрдпрд╛ред рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ, рдбреЗрд╡рд▓рдкрд░реНрд╕ рд░реЗрдВрдбрд░ рдХреЙрд▓рдмреИрдХ рдореЗрдВ рдЬрдЯрд┐рд▓ рддрд░реНрдХ рдбрд╛рд▓рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдШрдЯрдХ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рд╣реИ рдФрд░ рддрд░реНрдХ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╛рдХреГрддрд┐рдХ рддрд░реАрдХрд╛ рдкреВрд░реЗ рдкреЗрдбрд╝ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рдФрд░ _рдереНрд░реВ_ рд╕реНрдЯреЛрд░ рдШрдЯрдХ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдерд╛ред рдЗрд╕рд╕реЗ рдЙрдерд▓реЗ рд░реЗрдВрдбрд░рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реЛ рдЧрдпрд╛ред

рдЕрдм рд╣рдо рдПрдХ рдРрд╕реЗ рдореЙрдбрд▓ рдХреА рдУрд░ рдмрдврд╝ рд░рд╣реЗ рд╣реИрдВ рдЬрд╣рд╛рдВ StoreComponent ReactElement #$ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЬрдм рд╕реНрдЯреЛрд░ рдХреЛ рдирдпрд╛ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╕реНрдЯреЛрд░ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░реЛрдк рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддреЗ рд╣реБрдП ReactElement рдХреЛ рдХреНрд▓реЛрди рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкреИрдЯрд░реНрди рдХреЛ рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ рдХрдВрдкреЛрдиреЗрдВрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдФрд░ рдкреНрд░реЙрдкреНрд╕ рд▓реЗрдирд╛ред рд╣рдо рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдЧрдП рдХреНрдпреЛрдВрдХрд┐ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдпрд╣ рдореЙрдбрд▓ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рдерд╛ред

рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛ рдмрд┐рдВрджреБ, 'рдмрдЧрд╝рд▓ рдореЗрдВ' рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рддреЛрдбрд╝реЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪ рд╕рдХрддреЗред

@threepointone рд╕рддреНрддрд╛ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ https://github.com/reactjs/react-future/pull/28

@ pspeter3 рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╕реНрдЯреЛрд░ рдХреЛ рд╣рдореЗрд╢рд╛ рдЕрдкрдбреЗрдЯ / shouldComponentUpdate: ()=> true рдмрдирд╛рдиреЗ рдореЗрдВ рдХреЛрдИ рдЧрдВрднреАрд░ рдХрдореА рд╣реИ? рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдБ рдХрд┐ рдЗрд╕рдХреЗ 'рдмрдЪреНрдЪреЛрдВ' рдХреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ Store рдмрд┐рдирд╛ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛрдЧрд╛ред рдЖрдкрдХреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

@threepointone рдареАрдХ рдпрд╣реА рд╣рдордиреЗ рдЕрдкрдиреА рд╕реАрдорд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдерд╛ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░рднрд╛рд╡ рдХреНрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЯреАрдо рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдХреА рдУрд░ рд╕реЗ рдкреВрд░реНрдг рдЪрд┐рдВрддрд╛рдПрдБ рдереАрдВред рдХрдард┐рдирд╛рдИ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде рд╕рдВрдпреБрдХреНрдд рдЪрд┐рдВрддрд╛рдУрдВ рдиреЗ рд╕реНрд╡рд┐рдЪ рдХреЛ React.cloneElement(this.props.child, {data: this.state.data}) . рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛

@ pspeter3 рдкрд░реАрдХреНрд╖рдг рдХреЛрдг рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИред рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдЙрдерд▓реЗ рд░реЗрдВрдбрд░рд░ рдиреЗ 'рд░реЗрдВрдбрд░ рдХреЙрд▓рдмреИрдХ' рдХреЛ рдорд╛рдиреНрдпрддрд╛ рджреА? рдХреНрдпрд╛ рдЗрд╕рд╕реЗ рдорджрдж рдорд┐рд▓реЗрдЧреА?

Ps- 'рд░реЗрдВрдбрд░ рдХреЙрд▓рдмреИрдХ' :thumbs_up:

@sebmarkbage es- рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рдкрд░ рд╡рд░реНрддрдорд╛рди рдЪрд░реНрдЪрд╛ рдпрд╣ рд╣реИ рдХрд┐ subscribe рдХреЛ async рдХреА рдЧрд╛рд░рдВрдЯреА рджреА рдЬрд╛рдПрдЧреА, [Symbol.observer] рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рд╢реЙрд░реНрдЯрдХрдЯ рдФрд░ рд╕рдордХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рд╕рджрд╕реНрдпрддрд╛ рдкреНрд░рджрд╛рди рдХреА рдЬрд╛рдПрдЧреА, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рд┐рдВрдХ/рдПрд╕рд┐рдВрдХ рдПрдкрд┐рд╕ рджреЛрдиреЛрдВ рд╣реЛрдиреЗ рдХреА рд╡реИрдзрддрд╛ рд╣реИ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдмрд╣рд╕ рд╣реЛ рд░рд╣реА рд╣реИред

рдореИрдВрдиреЗ рдЗрд╕ рдЯрд┐рдХрдЯ рдкрд░ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╕рдмреНрд╕рдХреНрд░рд┐рдкреНрд╢рди рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЪрд┐рдВрддрд┐рдд рдХрд┐рдпрд╛ рдерд╛, рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╡рд╣рд╛рдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рд╡рд┐рдЪрд╛рд░ рдмрд╛рд╣рд░реА рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд╛рдл рдкреИрдЯрд░реНрди рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ рдЦреЗрд▓рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рдПрдЪрдУрд╕реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдЭреБрдХ рд░рд╣рд╛ рд╣реВрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ @gaearon рдореИрдВрдиреЗ рдЖрдкрдХреЗ HOC рдмрд┐рдЯ рдХреЛ рдКрдкрд░ рд╕рд░рд▓ рдмрдирд╛рдпрд╛, рдПрдХ рд╕реНрдерд┐рд░ - ComposedComponent.observe рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдФрд░ this.state.data рдХреЗ рдмрдЬрд╛рдп this.state.data this.state рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ - https://gist.github.com/tgriesser/d5d80ade6f895c28e659

рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд es7 рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИ:

<strong i="20">@observing</strong>
class Foo extends Component {
  static observe(props, context) {
    return {
      myContent: xhr(props.url)
    };
  }
  render() {
    var myContent = this.props.data.myContent;
    return <div>{myContent}</div>;
  }
}

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

рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╕рдмреНрд╕рдХреНрд░рд┐рдкреНрд╢рди рдХреА рдХрдореА рдПрдХ рдмрдбрд╝реА рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдпрд╣ рдорд┐рд▓ рдЧрдпрд╛ рд╣реИ рдХрд┐ "рд░рд╛рдЬреНрдп рдХреА рд╕рдорд╕реНрдпрд╛" рдФрд░ "рдмрдЧрд╝рд▓ рдореЗрдВ рдбреЗрдЯрд╛ рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИ" (рд╡реНрдпреБрддреНрдкрдиреНрди рдбреЗрдЯрд╛) рдХреЛ рд▓рдЧрд╛рддрд╛рд░ рддрд░реАрдХреЗ рд╕реЗ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдпрд╣ рдЗрд╕реЗ рдПрдХ рд╕реНрдЯреЗрдЯрд▓реЗрд╕ "рд░рд┐рдПрдХреНрд╢рди-рд╡реЗ" рдореЗрдВ рдмрдирд╛рддрд╛ рд╣реИред рдореБрдЭреЗ рдХрд┐рд╕реА рднреА рд╕рдордп рд░рд╛рдЬреНрдп рдХреА рд╕реНрдерд┐рд░рддрд╛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдорд┐рд▓ рдЧрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рдкреИрдЯрд░реНрди UI = React(state) рдореЗрдВ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИред рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмреБрд▓реЗрдЯ-рдкреНрд░реВрдл рдмрдирд╛рдиреЗ, рдФрд░ рдЙрджрд╛рд╣рд░рдг рдЬреЛрдбрд╝рдиреЗ рдФрд░ рдЕрдЪреНрдЫреА рдкреНрд░рд╕реНрддреБрддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд╛рде рд╕реЗ рдмрд╛рд╣рд░ рд╣реВрдВред https://github.com/AlexeyFrolov/slt ред рджреВрд╕рд░реА рдУрд░ рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдореИрдВ рдЗрд╕реЗ рдЕрдкрдиреЗ рдЙрддреНрдкрд╛рджрди рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдкреБрдирд░рд╛рд╡реГрддреНрдд рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдпреЛрдЧрджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрддреБрд░ рджрд┐рдорд╛рдЧ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред

рдирдорд╕реНрддреЗ,

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

рдЬреИрд╕рд╛ рдХрд┐ рд╣рдореЗрдВ рдХреБрдЫ рднреА рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рдорд┐рд▓рд╛ рдЬреЛ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдерд╛, рд╣рдордиреЗ рдиреЙрдХрдЖрдЙрдЯ рд╡реЗрдзрд╢рд╛рд▓рд╛рдУрдВ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ: рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╕рджрд╕реНрдпрддрд╛) рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╡реЗрдзрд╢рд╛рд▓рд╛рдУрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ред
рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд░рд┐рдПрдХреНрдЯ рдШрдЯрдХреЛрдВ рдХреЗ рд╡рд░реНрддрдорд╛рди рдЬреАрд╡рдирдЪрдХреНрд░ рдореЗрдВ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИ, рдФрд░ рд╣рдореЗрдВ рдЕрдЬреАрдм рд╣реИрдХ рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЪрд╛рдЗрд▓реНрдб рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЙрд▓рдмреИрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдереА (рдиреАрдЪреЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдСрдмреНрдЬрд░реНрд╡рд░рдорд┐рдХреНрд╕ рд▓рдЧрднрдЧ 10 рд▓реЛрдХреЗрд╢рди рд╣реИ)ред
рдЗрд╕рдиреЗ рд╣рдорд╛рд░реЗ DX рдореЗрдВ рдмрд╣реБрдд рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рдФрд░ рд╣рдорд╛рд░реА рдЯреАрдо рдХреЗ рд▓рд┐рдП рдЗрддрдирд╛ рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд┐рдпрд╛ рдХрд┐ рд╣рдордиреЗ рдЗрд╕реЗ рдУрдкрди рд╕реЛрд░реНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рдЗрд╕ рдмреАрдЪ рдпрд╣ рдХрд╛рдлреА рдпреБрджреНрдз рд╕рд┐рджреНрдз рд╣реИ (рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ ES7 рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рд╕рд░рдгреА рдкреЙрд▓реАрдлрд┐рд▓ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ) рдФрд░ рдЕрддреНрдпрдзрд┐рдХ рдЕрдиреБрдХреВрд▓рд┐рддред
рдпрд╣рд╛рдВ рдПрдХ рдЫреЛрдЯрд╛ рдЯрд╛рдЗрдорд░ рдЙрджрд╛рд╣рд░рдг рд╣реИ, ( рдЬреЗрдПрд╕рдПрдлрдбрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдЙрдкрд▓рдмреНрдз рд╣реИ),

var store = {};
// add observable properties to the store
mobservable.props(store, {
    timer: 0
});

// of course, this could be put flux-style in dispatchable actions, but this is just to demo Model -> View
function resetTimer() {
    store.timer = 0;
}

setInterval(function() {
    store.timer += 1;
}, 1000);

var TimerView = React.createClass({
    // This component is actually an observer of all store properties that are accessed during the last rendering
    // so there is no need to declare any data use, nor is there (seemingly) any state in this component
    // the combination of mobservable.props and ObserverMixin does all the magic for us.
    // UI updates are nowhere forced, but all views (un)subscribe to their data automatically
    mixins: [mobservable.ObserverMixin],

    render: function() {
        return (<span>Seconds passed: {this.props.store.timer}</span>);
    }
});

var TimerApp = React.createClass({
    render: function() {
        var now = new Date(); // just to demonstrate that TimerView updates independently of TimerApp
        return (<div>
            <div>Started rendering at: {now.toString()}</div>
            <TimerView {...this.props} />
            <br/><button onClick={resetTimer}>Reset timer</button>
        </div>);
    }
});

// pass in the store to the component tree (you could also access it directly through global vars, whatever suits your style)
React.render(<TimerApp store={store} />, document.body);

рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдпрд╣ рдмреНрд▓реЙрдЧ рджреЗрдЦреЗрдВред BTW, рдореИрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реВрдБрдЧрд╛ рдХрд┐ ES6 рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдФрд░/рдпрд╛ рдХрдВрдЯреЗрдирд░ рдХреЛ lib рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ред

рдЕрдлрд╕реЛрд╕ рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдпреВрд░реЛрдк рд╕реЗ рдкрд╣рд▓реЗ рдпрд╣ рдзрд╛рдЧрд╛ рдирд╣реАрдВ рджреЗрдЦрд╛ рдерд╛, рдЕрдиреНрдпрдерд╛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдФрд░ рдЕрд╡рд▓реЛрдХрдиреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЕрд╡рд╕рд░ рд╣реЛрддрд╛ред рд▓реЗрдХрд┐рди рдкреНрд░реЗрд░рдХ рд╡рд╛рд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд-рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж! : +1: рдореБрдЭреЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЧреНрд░рд╛рдлрдХреНрдпреВрдПрд▓ рдХреЗ рд╕рд╛рд░ рдФрд░ рд░реЗрдбрдХреНрд╕ рдХреЗ рдкреАрдЫреЗ рд╡рд┐рдЪрд╛рд░ рдХрд╛рд░реНрдп рдкрд╕рдВрдж рдЖрдпрд╛ :)

@mweststrate рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдореБрджрд╛рдп рдЕрдВрддрддрдГ "рдЕрд╡рд▓реЛрдХрди" рдФрд░ "рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдбреЗрдЯрд╛" рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЗ рдмреАрдЪ рдЪрдпрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдПрдХ рд╕рдорд╛рдзрд╛рди (https://github.com/AlexeyFrolov/slt/issues/4) рдореЗрдВ рджреЛрдиреЛрдВ рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХреА рддрд╛рдХрдд рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рдорд┐рд╢реНрд░рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛред рдореЗрд░реЗ рд╕рдорд╛рдзрд╛рди рдореЗрдВ рдореИрдВрдиреЗ рдХрд┐рд╕реА рднреА рд╕рдордп рд░рд╛рдЬреНрдп рдХреА рд╕реНрдерд┐рд░рддрд╛ рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд╕рд╛рде "рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдбреЗрдЯрд╛" рджреГрд╖реНрдЯрд┐рдХреЛрдг рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИред рдореИрдВ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рдФрд░ рдЬреЗрдирд░реЗрдЯрд░ рдХреЛ рднреА рд╕рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВред рдпрд╣ "рд╡реНрдпреБрддреНрдкрдиреНрди" рдпрд╛ "рдкреВрд░рдХ" рдбреЗрдЯрд╛ (рдЬреИрд╕реЗ рдкреГрд╖реНрда рдирд┐рдХрд╛рдп, рд╕рдВрдкрддреНрддрд┐, рдЕрдиреБрд╢рдВрд╕рд╛рдПрдВ, рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ, рдкрд╕рдВрдж) рд▓рд╛рдиреЗ рдФрд░ рдРрдк рд╕реНрдерд┐рддрд┐ рдХреА рд╕реНрдерд┐рд░рддрд╛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдирд┐рдпрдореЛрдВ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред

https://github.com/AlexeyFrolov/slt#rules -example

рдпрд╣ рдПрдХ рдЬрдЯрд┐рд▓ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ (рдореЗрд░рд╛ рдЙрддреНрдкрд╛рджрди рдХреЛрдб) рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕реНрдерд╛рди рд╢реАрд░реНрд╖рд▓реЗрдЦ рдХреЗ рд╕рд╛рде рдПрдкреАрдЖрдИ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реИред

import r from "superagent-bluebird-promise";
import router from "./router";

export default {
    "request": function (req)  {
        let route = router.match(req.url);
        let session = req.session;
        route.url = req.url;
        return this
            .set("route", route)
            .set("session", req.session);
    },
    "route": {
        deps: ["request"],
        set: function (route, request) {
            let {name, params: { id }} = route;
            if (name === "login") {
                return this;
            }
            let url = router.url({name, params: {id}});
            let method = request.method ? request.method.toLowerCase() : "get";
            let req = r[method]("http://example.com/api/" + url);
            if (~["post", "put"].indexOf(method)) {
                req.send(request.body);
            }
            return req.then((resp) => {
                let ctx = this.ctx;
                let path = url.substr(1).replace("/", ".");
                if (!resp.body) {
                    let location = resp.headers.location;
                    if (location) {
                        ctx.set("request", {
                            method: "GET",
                            url: location.replace('/api', '')
                        });
                    }
                } else {
                    ctx.set(path, resp.body);
                }
                return ctx.commit();
            });
        }
    }
}

рдмрд╛рдХреА рдореЗрдВ рдпрд╣ рдЖрдкрдХреЗ рдЬреИрд╕рд╛ рд╣реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕реАрдзрд╛ рдмрд╛рдзреНрдпрдХрд╛рд░реА рдирд╣реАрдВ рд╣реИ (рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ)ред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рд╕рд╛рдЭрд╛ рд▓рдХреНрд╖реНрдп рдХреЛ рд╕рдВрдЧреГрд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗрдирд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдРрд╕реЗ рдХрдИ рдХрд┐рдирд╛рд░реЗ-рдорд╛рдорд▓реЗ рд╣реЛрдВрдЧреЗ рдЬрд┐рди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред

рдЙрдкрд░реЛрдХреНрдд рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рд╕реЗ рдореИрдВ рд╕рдВрднрд╛рд╡рд┐рдд рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЕрдВрддрд┐рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рд╣рд░ рдмрд╛рд░ "рдбреЗрдЯрд╛рдлреБрд▓" рдШрдЯрдХ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ:

  • рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдкреНрд░рддрд┐рдкрд╛рджрди
  • .state рдФрд░ .data . рдХреА рд╢реБрд░реБрдЖрдд
  • .context , .props , .state рдФрд░ .observe рдЙрд▓рдЭрд╛рд╡
  • рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░рддрд┐рдкрд╛рджрди

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реЗ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╡рдг, рдЕрд╕реНрдерд┐рд░ рдФрд░ рдбрд┐рдмрдЧ рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдХрдард┐рди рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

рдореИрдВ @glenjamin рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд connect рдФрд░ disconnect рдЬреАрд╡рдирдЪрдХреНрд░ рд╣реБрдХ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВред

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдЕрдЧрд░ рдпрд╣ рдСрдл-рд╡рд┐рд╖рдп рд╣реИ (рдореИрдВ рдХрд╛рдлреА рдирд╣реАрдВ рдмрддрд╛ рд╕рдХрддрд╛)ред рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдХрд┐ рдореБрдЭреЗ рдХреНрдпреЛрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдШрдЯрдХ рдкреЗрдбрд╝ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдкреАрдЖрдИ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдирд╛ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рддрд░реАрдХрд╛ рд╣реЛрдЧрд╛: https://github.com/kevinrobinson/redux/blob/feature/loggit-todomvc/examples/loggit -todomvc/loggit/renderers/precompute_react_renderer.js#L72

рдпрд╣ рддрд░реАрдХрд╛ рдкреЗрдбрд╝ рдкрд░ рдЪрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд░реА рд╣реИрдХрд░реА рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдореЗрд░рд╛ рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рдЪреАрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ рдХреИрд╕реЗ "рдмрдЧрд╝рд▓ рдореЗрдВ рдбреЗрдЯрд╛-рд▓реЛрдбрд┐рдВрдЧ" рдореЗрдВ рдирд╡рд╛рдЪрд╛рд░ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░реЗрдЧрд╛, рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ "рдПрдХ рд░реЗрдВрдбрд░рд░ рдЬреЛ рдХрд░рддрд╛ рд╣реИ" рдЯреА рд╡рд░реНрдХ рдЯреЙрдк-рдбрд╛рдЙрди": https://github.com/kevinrobinson/redux/blob/feature/loggit-todomvc/examples/loggit-todomvc/loggit/react_interpreter.js#L8

рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдХрд┐ рдореБрдЭреЗ рдХреНрдпреЛрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдШрдЯрдХ рдкреЗрдбрд╝ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдкреАрдЖрдИ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдирд╛ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рддрд░реАрдХрд╛ рд╣реЛрдЧрд╛ред

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ @swannodette рдиреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ

рд╣рд╛рдВ, рдЙрдиреНрд╣реЛрдВрдиреЗ рдкрд╣рд▓реЗ ReactConf рдореЗрдВ рдЗрд╕реА рддрд░рд╣ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдерд╛ред рдореИрдВрдиреЗ рдирд╡реАрдирддрдо Om.next рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИ рдпрд╛ рдпреВрд░реЛрдХреНрд▓реЛрдЬрд░ рдмрд╛рдд рдирд╣реАрдВ рд╕реБрдиреА рд╣реИ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рдУрдо рдЕрдкрдиреА рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рдерд╛ рдЬрд┐рд╕реЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдмрдирд╛рдирд╛ рдкрдбрд╝рддрд╛ рдерд╛ред

рдпрд╣ рддрд░реАрдХрд╛ рдкреЗрдбрд╝ рдкрд░ рдЪрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд░реА рд╣реИрдХрд░реА рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдореЗрд░рд╛ рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рдЪреАрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ рдХреИрд╕реЗ "рдмрдЧрд╝рд▓ рдореЗрдВ рдбреЗрдЯрд╛-рд▓реЛрдбрд┐рдВрдЧ" рдореЗрдВ рдирд╡рд╛рдЪрд╛рд░ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░реЗрдЧрд╛, рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ "рдПрдХ рд░реЗрдВрдбрд░рд░ рдЬреЛ рдХрд░рддрд╛ рд╣реИ" рдЯреА рдХрд╛рдо рдКрдкрд░ рд╕реЗ рдиреАрдЪреЗ"

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдореЛрдЯреЗ рддреМрд░ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдмрд░реНрддрдиреЛрдВ рдореЗрдВ рдкрд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЙрдерд▓реЗ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ - рдореИрдВрдиреЗ рдЗрд╕реЗ рдПрдХ рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдПрдкреАрдЖрдИ рдмрдирд╛рдиреЗ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рд░рд┐рдПрдХреНрдЯрдпреВрд░реЛрдк рдореЗрдВ @sebmarkbage рдХреЛ DOM рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЗ рдПрдХ рд╕рд╣рдХрд░реНрдореА рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИ - 0.14 рдкрд░рд┐рд╡рд░реНрддрди рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдорд╛рд░реНрдЧ рдкреНрд░рд╢рд╕реНрдд рдХрд░рддреЗ рд╣реИрдВред

рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдереЛрдбрд╝рд╛ рдирд┐рдореНрди рд╕реНрддрд░ рдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ - рд▓реЗрдХрд┐рди рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рд╡реЗрдм рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рдорд╛рди рд╣реА рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдерд╛рди рдореЗрдВ рдкреНрд░рдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ, рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреЗрдбрд╝ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ рддреЛ рд╣рдо рдЗрд╕реЗ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рднреА рдбреЗрдЯрд╛ рдХреА рдЬрд░реВрд░рддреЛрдВ рдХреЛ рдвреВрдВрдв рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╕рдВрдкреВрд░реНрдг рд╡рд░реНрдЪреБрдЕрд▓ DOM рдЯреНрд░реА рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдПрдХ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд░реВрдк рд╕реЗ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдФрд░ рдЙрдкрдпреЛрдЧреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рдПрдХреНрд╕реЗрд╕ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛, рднрд▓реЗ рд╣реА рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рдПред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ 0.14 рдХреЗ рд╕рд╛рде рдЬрд┐рд╕ рдкрде рдкрд░ рдЪрд▓ рд░рд╣реА рд╣реИ, рдЙрд╕реЗ рджреЗрдЦрддреЗ рд╣реБрдП рдпрд╣ рдмрд╣реБрдд рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИред

рд╡реЗрдзрд╢рд╛рд▓рд╛рдУрдВ рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдореИрдВ рд╡рд┐рдирдореНрд░рддрд╛рдкреВрд░реНрд╡рдХ рдЗрд╕ рд╕реВрддреНрд░ рдореЗрдВ рдЕрдЪреНрдЫреЗ рд╕рдЬреНрдЬрдиреЛрдВ рдХреЛ рдЙрд▓реНрдХрд╛ рдХреЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдбреЗрдЯрд╛ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджреЗрдЦрдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ: https://github.com/meteor/meteor/wiki/Tracker-Manualред рд░рд┐рдПрдХреНрдЯ рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рд╕рдореЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП componentWillMount рд╡рд┐рдзрд┐ рдореЗрдВ рдХреЛрдб рдХреА 3-5 рд▓рд╛рдЗрдиреЗрдВ рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдк рд╕реЗ рд▓рдЧрддреА рд╣реИрдВ, рдХреБрдЫ рдЗрд╕ рддрд░рд╣:

  componentWillMount() {
    if (typeof this.getState === 'function') {
      Tracker.autorun(() => {
        // Assuming this.getState() calls some functions that return
        // reactive data sources
        this.setState(this.getState());
      });
    }
  }

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЯреНрд░реИрдХрд░ (рдЬрд┐рд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдХ рдЕрд▓рдЧ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ) рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рд╕рдорд░реНрдерди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИред

рдПрдХ рдмрд╛рд░ рдХреБрдЫ рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рдореВрд▓реНрдпреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рдж MOBservable рдПрдХ рдШрдЯрдХ рд╕рд╛рдЗрдб-рд╡реЗ рдХреЛ рд░реАрдлреНрд░реЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рдорд╛рди рдкреИрдЯрд░реНрди рдХрд╛ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдЬреАрд╡рдирдЪрдХреНрд░ рд╡рд┐рдзрд┐рдпрд╛рдВ + рдбреЗрдХреЛрд░реЗрдЯрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреИрдЯрд░реНрди рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд▓рдЪреАрд▓рд╛рдкрди рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рддреАрд╕рд░реЗ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рдЗрдореНрд╣реЛ рдХрд░рддреЗ рд╣реИрдВ рдХреЗрд╡рд▓ рдЬрдЯрд┐рд▓ рдЪреАрдЬреЛрдВ рдХреЛ рдЦрддреНрдо рдХрд░ рджреЗрдЧрд╛ред

    componentWillMount: function() {
        var baseRender = this.render;
        this.render = function() {
            if (this._watchDisposer)
                this._watchDisposer();
            var[rendering, disposer] = mobservableStatic.watch(() => baseRender.call(this), () => {
                    this.forceUpdate();
            });
            this._watchDisposer = disposer;
            return rendering;
        }
    },

@Mitranim рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫрд╛ рдкрдарди рд╣реИ, рдЗрд╕реЗ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдпрд╣ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ https://github.com/facebook/react/pull/3920 рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣рд╛ рд╣реИред

рд╣рдо рддрдп рдирд╣реАрдВ рдХрд░ рдкрд╛ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдХреМрди рд╕рд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдмреЗрд╣рддрд░ рд╣реИред рджреЛрдиреЛрдВ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рдЬреНрдпрд╛рджрд╛рддрд░ рдЖрд╢реНрд╡рд╕реНрдд рд╣реВрдВ рдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ (рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рд▓рд┐рдВрдХ рдХрд┐рдпрд╛ рд╣реИ; https://github.com/meteor/meteor/wiki/Tracker-Manual) рдЬрд╛рдиреЗ рдХрд╛ рд░рд╛рд╕реНрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЖрдо рд╕рд╣рдорддрд┐ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪреЗ рд╣реИрдВ рдФрд░ рд╣рдо рдЕрднреА рднреА рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдХреНрдпрд╛ рдЖрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред

@Mitranim @jimfb рдореИрдВ рдХрдИ рд╡рд░реНрд╖реЛрдВ рд╕реЗ рдЙрд▓реНрдХрд╛ рдХрд╛ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдкреНрд░рд╢рдВрд╕рдХ рд░рд╣рд╛ рд╣реВрдВред рдЯреНрд░реИрдХрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рдФрд░ рдмрд╣реБрдд рд╣реА рдЖрдХрд░реНрд╖рдХ рд╣реИред рдореИрдВрдиреЗ рдПрдХ рдкреНрд░реЗрдЬреЗрдВрдЯреЗрд╢рди рдмрдирд╛рдпрд╛ рдЬрд┐рд╕рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдЯреНрд░реИрдХрд░ рдХрд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рд╕рдВрд╕реНрдХрд░рдг рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

https://github.com/ccorcos/meteor-track/blob/master/client/main.js

рдФрд░ рдореИрдВрдиреЗ рдЯреНрд░реИрдХрд░ рдХреЗ рд╕рд╛рде рдПрдХ рдирдореВрджрд╛рд░ рд╕реНрдЯреНрд░реАрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рднреА рдмрдирд╛рдИ:

https://github.com/ccorcos/meteor-tracker-streams

рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдмреНрд▓реЗрдЬрд╝ рдХреЗ рдмрдЬрд╛рдп рд░рд┐рдПрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдВрдХреНрд░рдордг рдХрд┐рдпрд╛ рд╣реИ, рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЯреНрд░реИрдХрд░ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рд╣реИ рдФрд░ рдХрднреА-рдХрднреА рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкреНрд░рдХрд╛рд╢рди/рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм/рдСрди рдЪреЗрдВрдЬ рд╡рд┐рдзрд┐рдпрд╛рдВ рд╕рд┐рд░реНрдл 100x рдЖрд╕рд╛рди рд╣реЛрддреА рд╣реИрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рднреА рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкреНрд░рд╢рдВрд╕рдХреЛрдВ рдХреЗ рд▓рд┐рдП, рдЯреНрд░реИрдХрд░ рдХреБрдЫ рд╕рд╛рдЗрдб-рдЗрдлреЗрдХреНрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИ рдЬреЛ 99% рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рд╡реЗ рдЖрдкрдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдШрдЯрдХ рдореЗрдВ рдХреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛

componentWillMount: ->
  <strong i="15">@c</strong> = Tracker.autorun =>
    @setState({loading: true})
    Meteor.subscribe 'users', => @setState({loading: false})
    Tracker.autorun =>
      @setState({users: Users.find({}, {sort:{name:-1}}).fetch()})
componentWillUnmount: ->
  @c.stop()

рд╕рд╛рдЗрдб-рдЗрдлреЗрдХреНрдЯреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░рд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ c.stop() рд╕рдмреНрд╕рдХреНрд░рд┐рдкреНрд╢рди рдФрд░ рдЖрдВрддрд░рд┐рдХ рдСрдЯреЛрд░рди рдХреЛ рднреА рдмрдВрдж рдХрд░ рджреЗрдЧрд╛ред

@ccorcos рд╣рд╛рдВ, https://github.com/facebook/react/pull/3920 рдореЗрдВ рд╕рднреА рджреБрд╖реНрдкреНрд░рднрд╛рд╡ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЖрдВрддрд░рд┐рдХ рд╣реЛрдВрдЧреЗред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд░рд┐рдПрдХреНрдЯ рдХреЛрд░ рдЙрдиреНрд╣реЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп/рдХрд╛рд░реНрдпрд╛рддреНрдордХ рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдХреЛрдИ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рд╡реИрд╕реЗ рднреА рдмрд╛рд╣рд░реА рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрдВрдЧреЗред

рджрд┐рд▓рдЪрд╕реНрдк... рддреЛ рдХреНрдпреЛрдВ рди рд╕рд┐рд░реНрдл рдЪреЗрдВрдЬ рдХреЙрд▓рдмреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ? рдореИрдВрдиреЗ рдЙрдиреНрд╣реЗрдВ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрдЧрдд рдкрд╛рдпрд╛ рд╣реИред рдЪрд╛рд╣реЗ рдЖрдк рдЙрд▓реНрдХрд╛ (рдЯреНрд░реИрдХрд░), RxJS, Highland.js, рдЖрджрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реЛрдВ, рдЖрдк рдХрд┐рд╕реА рдИрд╡реЗрдВрдЯ рдХреЙрд▓рдмреИрдХ рдХреЗ рд╕рд╛рде рд╣рдореЗрд╢рд╛ рдЙрдирдХреЗ рд╕рд╛рде рдПрдХреАрдХреГрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рд░рд┐рдПрдХреНрдЯ рд╣рд╛рдИ-рдСрд░реНрдбрд░ рдХрдВрдкреЛрдиреЗрдВрдЯ рдХреЗ рд╕рд╛рде рднреА рдРрд╕рд╛ рд╣реА рд╣реИред

Redux рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореБрдЭреЗ рдЬреЛ рдкрд╕рдВрдж рд╣реИ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕ рддрд░реНрдХ рдХреЛ рдврд╛рдВрдЪреЗ рд╕реЗ рдмрд╛рд╣рд░ рд░рдЦрддрд╛ рд╣реИ рдФрд░ рд░рд┐рдПрдХреНрдЯ рдШрдЯрдХреЛрдВ рдХреЛ рд╢реБрджреНрдз рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦрддрд╛ рд╣реИред

@ccorcos рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдХреЛрдИ рдШрдЯрдХ рдЙрджрд╛рд╣рд░рдг рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рднреА "рд╕рджрд╕реНрдпрддрд╛" рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдШрдЯрдХ рд▓реЗрдЦрдХ рдЕрдХреНрд╕рд░ рдЗрд╕ рд╕рдлрд╛рдИ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕реНрдореГрддрд┐ рд░рд┐рд╕рд╛рд╡ рдмрдирд╛рддреЗ рд╣реИрдВред рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╣реЛ, рдЬрд┐рд╕рд╕реЗ рд▓рд┐рдЦрдирд╛ рдЖрд╕рд╛рди рд╣реЛ (рдХрдо рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ) рдФрд░ рдХрдо рддреНрд░реБрдЯрд┐-рдкреНрд░рд╡рдг (рдХреНрд▓реАрдирдЕрдк рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╣реИ)ред

@jimfb рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реАред рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░рдирд╛ рдЯреНрд░реИрдХрд░ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд╛рдл-рд╕реБрдерд░реА рдЪреАрдЬреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓ рд╕рджрд╕реНрдпрддрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдПрдХ рдмрд╛рд░ рдШрдЯрдХ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИ, рддреЛ рд╕рдлрд╛рдИ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ!

рд╣рд╛рдБ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ "рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ" рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реБрдИ рд╣реИред рдЖрдкрдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ c.stop() рдореЗрдВ рдШрдЯрдХ рдЕрдирдорд╛рдЙрдВрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдпрджреНрдпрдкрд┐ рдЖрдк рдЗрд╕реЗ рдПрдХ рдорд┐рд╢реНрд░рдг рдХреЗ рд╕рд╛рде рджреВрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

componentWillMount: ->
  <strong i="7">@autorun</strong> =>
    @setState({loading: true})
    Meteor.subscribe 'users', => @setState({loading: false})
    Tracker.autorun =>
      @setState({users: Users.find({}, {sort:{name:-1}}).fetch()})

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

@ccorcos рд╣рдо рд╡рд┐рднрд┐рдиреНрди рддрдВрддреНрд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реЛрдВрдЧреЗред рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдореИрдВрдиреЗ рдЬрд╛рдБрдЪ рдХреА рдереА, рдЯреНрд░реИрдХрд░ рдХреЗ рдкрд╛рд╕ рд╕реНрдерд╛рдпреА рд╕рджрд╕реНрдпрддрд╛ рдирд╣реАрдВ рдереА; рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд (рдЗрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рдХреЗ) рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрдм рдпрд╣ рдмрджрд▓рддрд╛ рд╣реИ рддреЛ _once_ рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╕рджрд╕реНрдпрддрд╛ рдХрд╛ рдЕрдВрдд рд╣реИред рдпрджрд┐ рдпрд╣ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдХреЛ рдлрд┐рд░ рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рдФрд░ рдмрджрд▓рд╛рд╡ рдХреЗ рд▓рд┐рдП "рд╕рджрд╕реНрдпрддрд╛" рдХреЛ рдлрд┐рд░ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИред рдФрд░ рдЗрд╕реА рддрд░рд╣ред

@Mitranim рд╕рд╣реА рд╣реИ, # 3920 рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдЙрд▓реНрдХрд╛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ "рд╕реНрд╡рдЪрд╛рд▓рд┐рдд" рд╣реИрдВ (рд╕рджрд╕реНрдпрддрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╣реИ), рдФрд░ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рд╕рд░рд▓ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдк рд╕реЗ рд╢реВрдиреНрдп рдПрдкреАрдЖрдИ рд╕рддрд╣ рдХреНрд╖реЗрддреНрд░ рд╣реИред

@ccorcos @Mitranim рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдЯреНрд░реИрдХрд░ / Vue.js рдкреНрд░реЗрд░рд┐рдд рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓рд┐рдП рдЖрдк Mobservable рдЖрдЬрд╝рдорд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ _render_ рдХреЗ рджреМрд░рд╛рди рдПрдХреНрд╕реЗрд╕ рдХрд┐рдП рдЧрдП рд╕рднреА рдбреЗрдЯрд╛ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЕрдирдорд╛рдЙрдВрдЯ рдкрд░ рд╕рднреА рд╕рдмреНрд╕рдХреНрд░рд┐рдкреНрд╢рди рдХрд╛ рдирд┐рдкрдЯрд╛рди рдХрд░рддрд╛ рд╣реИ (рддрдм рддрдХ рд╕рдмреНрд╕рдХреНрд░рд┐рдкреНрд╢рди рдХреЛ рдЬреАрд╡рд┐рдд рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рд╣рдордиреЗ рдЗрд╕реЗ рдореЗрдВрдбрд┐рдХреНрд╕ рдореЗрдВ рдЕрдм рддрдХ рдмрд╣реБрдд рдмрдбрд╝реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИред рдпрд╣ рдЖрдкрдХреЗ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╡рд┐рдиреАрдд рд╣реИ рдФрд░ рд╕рд╛рде рд╣реА рдпрд╣ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдореЙрдбрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдореМрдЬреВрджрд╛ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рдЬрд╛рддрд╛ рд╣реИред

рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдореИрдВрдиреЗ рдЬрд╛рдБрдЪ рдХреА рдереА, рдЯреНрд░реИрдХрд░ рдХреЗ рдкрд╛рд╕ рд╕реНрдерд╛рдпреА рд╕рджрд╕реНрдпрддрд╛ рдирд╣реАрдВ рдереА

@Mitranim рд╕рджрд╕реНрдпрддрд╛ рд╕реНрдерд╛рдпреА рд╣реЛ рд╕рдХрддреА рд╣реИред рдЗрд╕рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВред

sub = Meteor.subscribe('chatrooms')
# this subscription lasts until...
sub.stop()

рдЕрдм рдЯреНрд░реИрдХрд░ рдХреЗ рд╕рд╛рде рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рдЪреАрдЬреЗрдВ рд╣реИрдВред рдЗрд╕рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВред

comp = Tracker.autorun ->
  Meteor.subscribe('chatrooms')
# this subscription lasts until...
comp.stop()

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдВрддрд┐рдо рдЙрджрд╛рд╣рд░рдг рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИред рдЬрдм рддрдХ рд╣рдо рдРрд╕рд╛ рдХреБрдЫ рдирд╣реАрдВ рдХрд░рддреЗред

roomId = new ReactiveVar(1)
comp = Tracker.autorun ->
  Meteor.subscribe('messages', roomId.get())
# when I change the roomId, the autorun will re-run
roomId.set(2)
# the subscription to room 1 was stopped and now the subscription to room 2 has started
# the subscription is stopped when I call stop...
comp.stop()

рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ (рдЗрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рдХреЗ) рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдпрд╣ рдмрджрд▓рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╕рджрд╕реНрдпрддрд╛ рдХрд╛ рдЕрдВрдд рд╣реИред

рд╕рджрд╕реНрдпрддрд╛ рддрдм рддрдХ рдЪрд▓рддреА рд╣реИ рдЬрдм рддрдХ рдСрдЯреЛрд░рди рдлрд┐рд░ рд╕реЗ рдЪрд╛рд▓реВ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ (рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдирд┐рд░реНрднрд░рддрд╛ рдмрджрд▓ рдЬрд╛рддреА рд╣реИ) рдпрд╛ рдЧрдгрдирд╛ рдпрд╣ рд░реБрдХ рдЬрд╛рддреА рд╣реИред рдЬрд┐рдирдореЗрдВ рд╕реЗ рджреЛрдиреЛрдВ рдХрдВрдкреНрдпреВрдЯреЗрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВред рдЗрдирд╡реИрд▓рд┐рдбреЗрдЯ рд╣реБрдХред

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

comp = Tracker.autorun ->
  Meteor.subscribe('chatrooms')

# is the same as

comp = Tracker.autorun (c) ->
  sub = null
  Tracker.nonreactive ->
    # dont let comp.stop() stop the subscription using Tracker.nonreactive
    sub = Meteor.subscribe('chatrooms')
  c.onInvalidate ->
    # stop the subscription when the computation is invalidated (re-run)
    sub.stop()
# invalidate and stop the computation
comp.stop()

@ccorcos рдореИрдВ рдЕрдм рднреНрд░рдо рдХрд╛ рд╕реНрд░реЛрдд рджреЗрдЦрддрд╛ рд╣реВрдВ; рдпрд╣ рдореЗрд░реА рд╢рдмреНрджрд╛рд╡рд▓реА рдереАред рд╕рдмреНрд╕рдХреНрд░рд┐рдкреНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╕рдордп, рдореЗрд░рд╛ рдорддрд▓рдм _Meteor рд╕рдмреНрд╕рдХреНрд░рд┐рдкреНрд╢рди_ рдирд╣реАрдВ рдерд╛ред рд╡реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╕рд░реНрд╡рд░ рд╕реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдХреМрди рд╕рд╛ рдбреЗрдЯрд╛ рдкреБрд╢ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗ рд╡реНрдпреВ рд▓реЗрдпрд░ рдЕрдкрдбреЗрдЯ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдирд╣реАрдВ рд╣реИрдВ, рдЬреЛ рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХрд╛ рд╡рд┐рд╖рдп рд╣реИред _рд╕рджрд╕реНрдпрддрд╛_ рдХрд╣рддреЗ рд╕рдордп, рдореИрдВ рдкрд╛рд░рдВрдкрд░рд┐рдХ рдИрд╡реЗрдВрдЯ рд╢реНрд░реЛрддрд╛рдУрдВ рдФрд░ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреА рдЯреНрд░реИрдХрд░ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рдмреАрдЪ рдПрдХ рд╕рдорд╛рдирд╛рдВрддрд░ рдЪрд┐рддреНрд░рдг рдХрд░ рд░рд╣рд╛ рдерд╛ред рд░рд┐рдПрдХреНрдЯ рдШрдЯрдХреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдПрдХ рдШрдЯрдХ рд╡рд┐рдзрд┐ рд╣реЛрдЧреА рдЬреЛ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреА рд╣реИ рдФрд░ рдлрд┐рд░ рдХреЙрд▓ рдХрд░рддреА рд╣реИ setState рдпрд╛ forceUpdate ред

@mweststrate рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд▓рдЧ рд░рд╣рд╛ рд╣реИред

рдЖрд╣ рд╣рд╛рдБред рддреЛ рдЙрдирдХреЗ рдкрд╛рд╕ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЪрддреБрд░ рддрд░реАрдХрд╛ рд╣реИред

componentWillMount: function() {
  this.comp = Tracker.autorun(() => {
    let sub = Meteor.subscribe('messages')
    return {
      loading: !sub.ready(),
      messages: Messages.find().fetch()
    }
  })
componentWillUnmount: function() {
  this.comp.stop()
}

рд╕рджрд╕реНрдпрддрд╛ рд╣рд░ рдмрд╛рд░ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдлрд┐рд░ рд╕реЗ рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдЧреАред sub.ready рдФрд░ Messages.find.fetch рджреЛрдиреЛрдВ "рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓" рд╣реИрдВ рдФрд░ рдЬрдм рднреА рд╡реЗ рдмрджрд▓рддреЗ рд╣реИрдВ рддреЛ рдСрдЯреЛрд░рди рдХреЛ рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреНрд░рд┐рдЧрд░ рдХрд░реЗрдВрдЧреЗред рдЯреНрд░реИрдХрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдЖрдк рдСрдЯреЛрд░рди рдХреЛ рдЫрд┐рдкрд╛рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рд╣реЛрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдлрд╝рдВрдХреНрд╢рди "рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд╕рдВрджрд░реНрдн" рдХреЗ рднреАрддрд░ рд╣реЛрддрд╛ рд╣реИ

рдЖрдк рдЗрд╕реЗ рдорд┐рдХреНрд╕реА рдореЗрдВ рдлреЗрдВрдХ рд╕рдХрддреЗ рд╣реИрдВ

componentWillMount: function() {
  this.comp = Tracker.autorun(() => {
    return this.getReactiveData()
  })
componentWillUnmount: function() {
  this.comp.stop()
}

рдФрд░ рдлрд┐рд░ рдЖрдк рдЗрд╕ рдЬрд╛рджреБрдИ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде рд░рд╣ рдЧрдП рд╣реИрдВ рдЬреЛ рдмрд╕ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ!

getReactiveData: function() {
  let sub = Meteor.subscribe('messages')
  return {
    loading: !sub.ready(),
    messages: Messages.find().fetch()
  }
}

рдЯреНрд░реИрдХрд░ рдЗрд╕ рддрд░рд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ...

@ccorcos рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЯреНрд░реИрдХрд░-рд╢реИрд▓реА рдХреА рдШрдЯрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдореИрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЧрд▓рдд рдерд╛ред рдЖрдкрдХреЛ рдЕрднреА рднреА рд╢реНрд░реЛрддрд╛ рдХреЛ componentWillUnmount рдореЗрдВ рд░реЛрдХрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдпрд╣ рдбреЗрдЯрд╛ рд╕реНрд░реЛрддреЛрдВ рддрдХ рдкрд╣реБрдВрдЪрддрд╛ рд░рд╣реЗрдЧрд╛ рдФрд░ setState рдХреЙрд▓ рдХрд░рддрд╛ рд░рд╣реЗрдЧрд╛ (рдЬрдм рддрдХ рдХрд┐ рдЖрдк isMounted() рдЬреЛ рдЕрдм рдмрд╣рд┐рд╖реНрдХреГрдд рд╣реИ)ред

рдПрдХ рддрд░рдл рдзреНрдпрд╛рди рджреЗрдВ, рдЖрдк рдШрдЯрдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рджрд┐рдП рдЧрдП рд╣реИрдВ: [1] , [2] ред рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

export class Chat extends React.Component {
  <strong i="13">@reactive</strong>
  updateState () {
    this.setState({
      auth: auth.read(),
      messages: messages.read()
    })
  }

  /* ... */
}

@ рдорд┐рддреНрд░рд╛рдирд┐рдо рдмрд╣реБрдд рд╕рд╛рдл-рд╕реБрдерд░рд╛ рд╣реИ - рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдЙрдЪреНрдЪ-рдХреНрд░рдо рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред ;)

@sebmarkbage @jimfb рдореИрдВ рдХреБрдЫ рдорд╣реАрдиреЛрдВ рд╕реЗ рдЗрд╕ рдереНрд░реЗрдб рдФрд░ рдСрд▓реНрдЯ рдереНрд░реЗрдб (#3858) рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдореИрдВ рдЙрддреНрд╕реБрдХ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рдХреЛрд░ рдЯреАрдо рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд┐рд╕реА рдЖрдо рд╕рд╣рдорддрд┐ рдкрд░ рдкрд╣реБрдВрдЪ рдЧрдИ рд╣реИ, рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рджрд┐рд╢рд╛ред

@oztune рдХреЛрдИ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ; рд╣рдордиреЗ рдЕрдиреНрдп рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдУрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИред рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдХреЛрдИ рдЕрдкрдбреЗрдЯ рд╣реЛрдиреЗ рдкрд░ рд╣рдо рдХрд┐рд╕реА рдПрдХ рдереНрд░реЗрдб рдкрд░ рдкреЛрд╕реНрдЯ рдХрд░реЗрдВрдЧреЗред

рджреЛрд╕реНрддреЛрдВ, рдореИрдВрдиреЗ рдХрдВрдЯреЗрдирд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдпреВрдирд┐рд╡рд░реНрд╕рд▓ рдПрдкреАрдЖрдИ рдмрдирд╛рдпрд╛ рд╣реИред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдХрдВрдкреЛрдЬрд░ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВред рдЬреЛ рдХрд┐, рд╣рдо рдЙрдЪреНрдЪ рдСрд░реНрдбрд░ рдлрд╝рдВрдХреНрд╢рди рд╡рд╛рд▓реЗ рдХрдВрдЯреЗрдирд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред

import { compose } from `react-komposer`;

// Create a component to display Time
const Time = ({time}) => (<div>{time}</div>);

// Create the composer function and tell how to fetch data
const composerFunction = (props, onData) => {
    const handler = setInterval(() => {
    const time = new Date().toString();
    onData(null, {time});
  }, 1000);

  const cleanup = () => clearInterval(handler);
  return cleanup;
};

// Compose the container
const Clock = compose(composerFunction)(Time);

// Render the container
ReactDOM.render(<Clock />, document.getElementById('react-root'));

рдпрд╣рд╛рдБ рд▓рд╛рдЗрд╡ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ: https://jsfiddle.net/arunoda/jxse2yw8/

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд╛рджреЛрдВ, Rx.js рд╡реЗрдзрд╢рд╛рд▓рд╛рдУрдВ рдФрд░ рдЙрд▓реНрдХрд╛ рдХреЗ рдЯреНрд░реИрдХрд░ рдХреЗ рд╕рд╛рде рдХрдВрдЯреЗрдирд░ рдмрдирд╛рдиреЗ рдХреЗ рдХреБрдЫ рдЖрд╕рд╛рди рддрд░реАрдХреЗ рднреА рд╣реИрдВред

рдЗрд╕ рдкрд░ рдореЗрд░рд╛ рд▓реЗрдЦ рднреА рджреЗрдЦреЗрдВ: рдЖрдЗрдП рдХреБрдЫ рд░рд┐рдПрдХреНрдЯ рдХрдВрдЯреЗрдирд░реЛрдВ рдХреА рд░рдЪрдирд╛ рдХрд░реЗрдВ

@arunoda рд╣рдо рдХреБрдЫ рдРрд╕рд╛ рд╣реА рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдПрдХ рдмрд╛рдд рдЬреЛ рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ, рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдХрдВрдкреЛрдЬрд░ рдлрдВрдХреНрд╢рди рдХреЛ рд╣рд░ рдкреНрд░реЛрдк рдЪреЗрдВрдЬ рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдХреИрд╕реЗ рд░реЛрдХрддреЗ рд╣реИрдВ?

@oztune рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдм рдпрд╣ рдлрд┐рд░ рд╕реЗ рдЪрд▓реЗрдЧрд╛ред рд╣рдо рдЗрд╕ рд▓реЛрдХрдХрд╛ рдФрд░ рдЙрд▓реНрдХрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЙрди рджреЛрдиреЛрдВ рдХреЗ рдкрд╛рд╕ рд╕реНрдерд╛рдиреАрдп рдХреИрд╢ рд╣реИрдВ рдФрд░ рдЬрдм рд╣рдо рдХрдВрдкреЛрдЬрд░рдлрдВрдХреНрд╢рди рдХреЛ рдХрдИ рдмрд╛рд░ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ рддрдм рднреА рд╕рд░реНрд╡рд░ рд╣рд┐рдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдРрд╕рд╛ рдХреБрдЫ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

const options =  {propsToWatch: ["postId"]};
const Clock = compose(composerFunction, options)(Time);

рдХреЛрдИ рд╡рд┐рдЪрд╛рд░?

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

@oztune рдореИрдВрдиреЗ рдПрдХ рдирдпрд╛ GH рдореБрджреНрджрд╛ рдмрдирд╛рдпрд╛ рд╣реИ рдФрд░ рдЪрд▓рд┐рдП рд╡рд╣рд╛рдВ рдЕрдкрдиреА рдЪреИрдЯ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЯреНрд╡рд┐рдЯрд░ рд╕реЗ рдХрд╛рдлреА рдмреЗрд╣рддрд░ рд╣реИред

рдХреНрдпреЛрдВ рди рд╕рд┐рд░реНрдл JSX рдХреЛ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓реНрд╕ рдХреЛ рд╕реАрдзреЗ рд╕рдордЭрдиреЗ рдФрд░ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рджреЗрдВ, рддрд╛рдХрд┐ рдореИрдВ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рдХреЛ рдкреНрд░реЙрдкреНрд╕ рдореЗрдВ рдкрд╛рд╕ рдХрд░ рд╕рдХреВрдВ, рдЬреИрд╕реЗ рдХрд┐ this.props.todo$ рдФрд░ рдЙрдиреНрд╣реЗрдВ JSX рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд░реЗрдВред рддрдм рдореБрдЭреЗ рдХрд┐рд╕реА рдПрдкреАрдЖрдИ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА, рдмрд╛рдХреА рдХреЛ рд░рд┐рдПрдХреНрдЯ рдХреЗ рдмрд╛рд╣рд░ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдПрдЪрдУрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡реЗрдзрд╢рд╛рд▓рд╛рдУрдВ рдХреЛ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдкреНрд░реЙрдкреНрд╕ рдореЗрдВ рд╕рд╛рджрд╛ рдбреЗрдЯрд╛ рд╣реИ рдпрд╛ рдПрдХ рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ this.data рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

{this.props.todo$

рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рд░рд┐рдПрдХреНрдЯ рд░реЗрдВрдбрд░ рдСрд╕рд░реНрд╡реЗрдмрд▓ [JSX] рдХреЛ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдмрд┐рдирд╛ рд▓рд┐рдВрдХ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдбрд┐рдЬрд╝рд╛рдЗрди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред

https://medium.com/@milankinen/containers -are-dead-long-live-observable-combinators-2cb0c1f06c96#.yxns1dqin

https://github.com/milankinen/react-combinators

рдирдорд╕реНрддреЗ,
рдЕрднреА рдХреЗ рд▓рд┐рдП рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ rxjs рд╕реНрдЯреНрд░реАрдо рдХреЗ рд╕рд╛рде рд╕реНрдЯреЗрдЯрд▓реЗрд╕ рдШрдЯрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдореИрдВ рдХрд┐рд╕реА рдЕрдиреНрдп рдПрдкреАрдЖрдИ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдирд╣реАрдВ рд╕рдордЭрддрд╛ред
рдореИрдВрдиреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд▓рд┐рдЦрд╛ - рдПрдХ рдмреЛрд░реНрдб рдЬрд┐рд╕ рдкрд░ рдЖрдк рдорд╛рдЙрд╕ рд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЬрдм рдпрд╣ 26 рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдпрд╣ рдкреБрдирдГ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред
рдореБрдЭреЗ рдпрд╣ рд╕реБрдирдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛ рдХрд┐ рдЖрдк рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реИрдВред
рдпрд╣рд╛рдБ рдХреЛрдб рд╣реИ:
https://jsfiddle.net/a6ehwonv/74/

@giltig : рдореИрдВ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕реАрдЦ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ рдкрд╕рдВрдж рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рд╕рд╛рде рдореЗрдВ Cycle.js.

рдореИрдВ рдмреНрд░рд┐рдЬрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╖рдпреЛрдВ рдореЗрдВ рдкрд╛рд╕ рдХрд┐рдП рдмрд┐рдирд╛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдЖрд╕рд╛рдиреА рд╕реЗ рдШрдЯрдХреЛрдВ рдкрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЛ рд╕реБрдирдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВред рдЕрдЧрд░ рдореИрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ рддреЛ рдпрд╣рд╛рдВ рдЬреЛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЙрд╕рдХреЗ рдореБрдХрд╛рдмрд▓реЗ рдпрд╣ рджреВрд╕рд░реА рддрд░рдл рд╣реИред рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдпрджрд┐ рд╣рдо рдЗрд╕рдХреА рд╕рд┐рдВрдереЗрдЯрд┐рдХ рдШрдЯрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд░рд┐рдПрдХреНрдЯ vdom рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рд╢рд╛рдпрдж "refs" рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрд╡рд▓реЛрдХрди рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдХреЗрд╡рд▓ рдЕрд╡рд▓реЛрдХрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП CSS рдЯреИрдЧ рд╣реЛрдиреЗ рд╕реЗ рдмрдЪрд╛ рдЬрд╛ рд╕рдХреЗред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ RxJs рдХрдВрдмрд╛рдЗрдирд▓реЗрд╕реНрдЯ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╣рдо рдмрдбрд╝реЗ рдШрдЯрдХреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдзреЗ рд░рд┐рдПрдХреНрдЯ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдШрдЯрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗрдВред

const myFancyReactComponent = ({surface, number, gameover}) => (
        <div> 
          {gameover ? gameover : surface}
          {number}
        </div>
)

const LiveApp = Rx.Observable.combineLatest(
    LiveSurface, DynamicNumberView, DynamicGameOver,
    myFancyReactComponent
)

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

рдЕрдЧрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдШрдЯрдХ рдкреЛрдЬреЛрд╕ рдХреЛ рддрдм рддрдХ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рддрдХ рд╡реЗ рдкреНрд░реЛрдк рдХреЗ рд░реВрдк рдореЗрдВ рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рд╣реЛрдВред рдЕрднреА рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдКрдкрд░ рдЬреЛ рджрд┐рдЦрд╛рдпрд╛ рд╣реИ рд╡рд╣ рд╡рд╣реА рддрд░реАрдХрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдЪреБрдирд╛ рд╣реИред

рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ рдЖрдкрдиреЗ MyFancyReactComponent рдХреЗ рд╕рд╛рде рдЬреЛ рдХрд┐рдпрд╛ рд╡рд╣ рд╕рдВрднрд╡ рд╣реИ рдФрд░ рд╣рдордиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рднреА рдРрд╕рд╛ рдХрд┐рдпрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЖрдк рд╕реАрдзреЗ рдЬреЗрдПрд╕рдПрдХреНрд╕ рднреА рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред

рд╡рд┐рд╖рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ - рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╡реИрдз рддрд░реАрдХрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЕрдВрддрддрдГ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдШрдЯрдХ рдореЗрдВ рдореИрдВ рд╕рд┐рд░реНрдл рдПрдХ рд╣реИрдВрдбрд▓рд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдХреБрдЫ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рдЗрд╕реЗ рдЙрд╕ рд╡рд┐рд╖рдп рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪреБрдирддрд╛ рд╣реВрдВ рдЬреЛ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдХреЛрдИ рдФрд░ рдЕрдиреНрдпрдерд╛ рдЪреБрди рд╕рдХрддрд╛ рд╣реИ - рдпрд╣ рд▓рдЪреАрд▓рд╛ рд╣реИред

рдЕрдЧрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдШрдЯрдХ рдкреЛрдЬреЛрд╕ рдХреЛ рддрдм рддрдХ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рддрдХ рд╡реЗ рдкреНрд░реЛрдк рдХреЗ рд░реВрдк рдореЗрдВ рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рд╣реЛрдВред рдЕрднреА рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдКрдкрд░ рдЬреЛ рджрд┐рдЦрд╛рдпрд╛ рд╣реИ рд╡рд╣ рд╡рд╣реА рддрд░реАрдХрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдЪреБрдирд╛ рд╣реИред

рджреЗрдЦрдиреЗ рдпреЛрдЧреНрдп рдкреНрд░реЙрдкреНрд╕ рдХрд╛ рд▓рдВрдмреЗ рд╕рдордп рдореЗрдВ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред рдЙрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЗрд╕рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ..

рдпрд╣ рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ рд╣рдордиреЗ рд╕рд╕реНрдкреЗрдВрд╕ (рдХреИрд╢ + рд╕рдВрджрд░реНрдн) рдХреЗ рд╕рд╛рде рдПрдХ рдЕрд▓рдЧ рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рдХрд┐рдпрд╛ред рдХреИрд╢ рдХреЛ рд╣реА рд╕рдмреНрд╕рдХреНрд░рд┐рдкреНрд╢рди рдХреЗ рд▓рд┐рдП рд╕рдкреЛрд░реНрдЯ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИред рдЖрдк рд╕рд╕реНрдкреЗрдВрд╕ рдХреЗ рд╢реЗрд╖ рдХрд╛рд░реНрдп рдХреЛ https://github.com/facebook/react/issues/13206 рдореЗрдВ рдЯреНрд░реИрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╣рдо рдЕрдзрд┐рдХ рдкреГрдердХ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рджрд╕реНрдпрддрд╛ рдкреИрдХреЗрдЬ рднреА рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред

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

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

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

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

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

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

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