Chyba rozumiem vbarbarosh pytanie jest pytaniem, a przynajmniej miałem podobną, która doprowadziła mnie do tego postu. Więc jeśli to nie odpowiada na oryginalne pytanie, mam nadzieję, że może pomóc innym, którzy tu lądują.
W moim przypadku mam komponent React z n liczbę dzieci do definiowania opcji konfiguracyjnych dla akcji interfejsu użytkownika. Każde dziecko ma inny ref identyfikujący jaką opcję konfiguracyjną reprezentuje dane wejście i chcę mieć możliwość bezpośredniego dostępu do ref, więc mogę wtedy wywołać metody wyeksponowane na moim komponencie potomnym. (Mogłem narazić attrs danych i używać jQuery wyodrębnić, ale to wydaje się dużo dodatkowych obręcze & problemów z wydajnością)
Moja pierwsza próba była to:
...
<Config ref="showDetails" onChange={this.handleChange} />
<Config ref="showAvatar" onChange={this.handleChange} />
...
Idealnie chciałem związać wszystko zmień zdarzenia na jedną procedurę obsługi, a następnie wyodrębnij wartość ref z obiektu docelowego, który wywołał zdarzenie. Niestety wysłany SyntheticEvent
ma nie zapewnić sposób, aby uzyskać wartość docelową celu, więc nie mogę nawiązać bezpośredniego połączenia z this.ref[name].methodIWantToCall()
.
Co znalazłem był artykuł w docs reagować, które prowadzą mnie do rozwiązania:
https://facebook.github.io/react/tips/communicate-between-components.html
Co możemy zrobić, to wykorzystać JavaScript wiążące i przekazać dodatkowe argumenty.
...
<Config ref="showDetails" onChange={this.handleChange.bind(this, 'showDetails')} />
...
Teraz w moim obsługi uzyskać dane dodawania i mogą uzyskać dostęp do moich pozycje literaturowe:
handleChange: function(refName, event) {
this.refs[refName].myMethodIWantToCall()
}
Sztuką jest to, że podczas wiązania, kolejność argumentów jest zmieniany i pierwszy argument jest teraz wartość bound przekazane, a zdarzenie jest teraz drugim argumentem. Mam nadzieję, że pomaga!
Dlaczego nie zdefiniujesz 'handleMouseEnter' wewnątrz komponentu' Foobar' i nie uzyskasz dostępu do niego przez 'this'? – daniula
@daniula Ponieważ metoda 'Foobar.action' może być wywołana w wyniku zdarzenia' onClick', a nie tylko 'onMouseEnter'. – vbarbarosh
'action' należy zdefiniować na instancji Foobar. Czy 'this.refs.foo.action()' nie działa dla ciebie? –