2016-07-12 9 views
15

Mam pytanie relavent na ten kod: https://github.com/reactjs/redux/blob/master/examples/async/containers/App.jsdlaczego trzeba powiązać funkcję w konstruktorze

szczególności:

constructor(props) { 
    super(props) 
    this.handleChange = this.handleChange.bind(this) 
    this.handleRefreshClick = this.handleRefreshClick.bind(this) 
    } 

Chyba jej się 2 część pytania.

  1. Dlaczego muszę ustawić zmianę uchwytu jako instancja klasy this.handleChange =, nie mogę po prostu użyć funkcji statycznych dla handleChange i nazywają to bezpośrednio ze w klasie onClick={handleRefreshClick}>?
  2. Nie mam pojęcia, co się dzieje tutaj: this.handleRefreshClick.bind(this)

Thanks

+1

Prawdopodobny duplikat [użycia metody "wiązania" JavaScript] (http://stackoverflow.com/questions/2236747/use-of-the-javascript-bind-method) – ctrlplusb

+0

niezupełnie, nie całkiem rozumiem w Kontekst klasy, szczególnie numer 2 – Saad

+0

Nie zmienia znaczenia "bind". Używasz 'bind', aby utrzymać zakres do' this'. W kontekście reakcji pozwala ci to nazywać takie rzeczy jak 'this.setState' itp. – ctrlplusb

Odpowiedz

14

odpowiedzieć w odwrotnej kolejności ...

  1. this.handleRefreshClick.bind(something) zwraca nową funkcję, w której odniesienia do this będą odnosić się do something. Jest to sposób na zapisanie bieżącej wartości this, która znajduje się w zasięgu podczas wywoływania do konstruktora, dzięki czemu może być używana później, gdy funkcja zostanie wywołana.
  1. Jeżeli funkcje nie wymagają dostępu do stanu swojego urządzenia, a następnie upewnić, że nie trzeba ich wiązać.

Argumentem na rzecz dodając te linie do konstruktora jest tak, że nowe funkcje bound tworzone są tylko raz w instancji klasy. Można również użyć

onClick={this.handleRefreshClick.bind(this)} 

lub (ES6):

onClick={() => this.handleRefreshClick()} 

ale żadnej z tych metod będzie tworzyć nową funkcję każdym razem, gdy składnik jest ponownie renderowane.

+0

, ale zrobienie .bind (this) całej idei klasy jest to, że enkapsuluje" to ", więc dlaczego muszę hermetyzować zakres w określonej funkcji, gdy cała instancja klasy powinna zawierać zakres – Saad

+3

@Zadawanie nie w JS! Klasy są naprawdę [tylko fantazyjnymi funkcjami] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Classes); nie robią nic szczególnie użytecznego w tym ". –

+0

Niewłaściwe jest wiązanie lub używanie funkcji strzałki w renderingu, ponieważ prowadzi to do realokacji funkcji przy każdym renderowaniu. Lepszym rozwiązaniem jest powiązanie w konstruktorze lub użycie funkcji strzałki w klasie. https://medium.freecodecamp.org/react-binding-patterns-5-approaches-for-handling-this-92c651b5af56 – Black

0

te 2 funkcje handleChange i handleRefreshClick są przekazywane w dół jako rekwizyty do innych komponentów,

są one wiążą się z tym, ponieważ kiedy składnik potomny wywoła te funkcje, które będą zawsze wykonywane w kontekście APP.

Można usunąć te funkcje z klasy, ale nadal trzeba powiązać to, ponieważ można byłoby aktualizacji niektórych części aplikacji

1

Powodem, dla którego jest to robione, jest powiązanie słowa kluczowego this z tym obiektem. Tak jak powiedział Tom, wywoływanie funkcji z klasy nie oznacza, że ​​jest ona wywoływana z kontekstem obiektu, który utworzył tę funkcję.

myślę, że może być coraz mylić bo w reagują przykładach/tutoriale, używając React.createClass() CZY wiążą this automatycznie. Więc możesz się zastanawiać, dlaczego React.createClass() to robi, ale nie ze składnią klasy ES6.

React to dlatego nie chcą zadzierać z specyfikacje ES6 (wiążący this do funkcji z tej klasy nie jest w klasie specyfikacji ES6), ale w tym samym czasie, chciał dać swoim użytkownikom wygodę Składnia klasy ES6. Możesz przeczytać więcej na ten temat poniżej.

Github issue

Mam nadzieję, że rzuca pewne światło na dlaczego tak się dzieje.

0

Osobiście wiążę funkcje w konstruktorze, aby ich referencje nie zmieniały się przy każdym ponownym renderowaniu.

Jest to szczególnie ważne, jeśli przekazujesz funkcje tylko dzieciom czytającym, których nie trzeba aktualizować, gdy rekwizyty się nie zmieniają. Używam do tego reaktywnych dodatków-czystego-renderowania-mixin.

W przeciwnym razie, w przypadku ponownego renderowania każdego rodzica, będzie się wiązało, nowe odniesienie do funkcji zostanie utworzone i przekazane dzieciom, co może oznaczać, że zmieniono rekwizyty.

Powiązane problemy