Jestem początkującym użytkownikiem języka javascript / redux / react, budującym małą aplikację za pomocą Redux, React-Redux i React. Z jakiegoś powodu, gdy używam funkcji mapDispatchToProps w tandemie z connect (wiązanie react-redux), otrzymuję TypeError wskazujący, że wysyłanie nie jest funkcją, gdy próbuję wykonać wynikową właściwość. Kiedy jednak wywołuję dispatch jako prop (zobacz funkcję setAddr w dostarczonym kodzie), to działa.
Jestem ciekawy, dlaczego tak jest, w przykładowej aplikacji TODO w dokumentach redux metoda mapDispatchToProps jest konfigurowana w ten sam sposób. Kiedy I console.log (dispatch) wewnątrz funkcji, mówi, że wysyłka jest obiektem typu. Mógłbym nadal korzystać z wysyłki w ten sposób, ale czułbym się lepiej, wiedząc, dlaczego tak się dzieje, zanim będę kontynuować dalszą pracę z reduxem. Do kompilacji używam WebPacka z programami ładującymi Babel.
Mój kod:
import React, { PropTypes, Component } from 'react';
import { connect } from 'react-redux';
import { setAddresses } from '../actions.js';
import GeoCode from './geoCode.js';
import FlatButton from 'material-ui/lib/flat-button';
const Start = React.createClass({
propTypes: {
onSubmit: PropTypes.func.isRequired
},
setAddr: function(){
this.props.dispatch(
setAddresses({
pickup: this.refs.pickup.state.address,
dropoff: this.refs.dropoff.state.address
})
)
},
render: function() {
return (
<div>
<div className="row">
<div className="col-xs-6">
<GeoCode ref='pickup' />
</div>
<div className="col-xs-6">
<GeoCode ref='dropoff' />
</div>
</div>
<div className="row">
<div className="col-xs-6">
<FlatButton
label='Does Not Work'
onClick={this.props.onSubmit({
pickup: this.refs.pickup.state.address,
dropoff: this.refs.dropoff.state.address
})}
/>
</div>
<div className="col-xs-6">
<FlatButton
label='Works'
onClick={this.setAddr}
/>
</div>
</div>
</div>
);
}
})
const mapDispatchToProps = (dispatch) => {
return {
onSubmit: (data) => {
dispatch(setAddresses(data))
}
}
}
const StartContainer = connect(mapDispatchToProps)(Start)
export default StartContainer
Twoje zdrowie.
źródło
Odpowiedzi:
Jeśli chcesz użyć
mapDispatchToProps
bezmapStateToProps
tylkonull
pierwszego argumentu.export default connect(null, mapDispatchToProps)(Start)
źródło
mapDispatchToProps
, po prostu nie dodawaj tego argumentu doconnect
:connect(mapStateToProps)(MyComponent)
Brakuje tylko pierwszego argumentu do
connect
, czylimapStateToProps
metody. Fragment aplikacji Redux todo:źródło
Posługiwać się
zamiast
źródło
Rozwiązałem to, zamieniając argumenty, których używałem
co jest złe. To
mapStateToProps
musi być pierwszym argumentem:Teraz wydaje się to oczywiste, ale może komuś pomóc.
źródło
Potrzebowałem przykładu,
React.Component
więc zamieszczam go:źródło
Kwestia
Oto kilka rzeczy, na które należy zwrócić uwagę, aby zrozumieć zachowanie połączonego komponentu w kodzie:
Arity of
connect
Matters:connect(mapStateToProps, mapDispatchToProps)
React-Redux wywołuje
connect
z pierwszym argumentemmapStateToProps
i drugim argumentemmapDispatchToProps
.Dlatego, chociaż zdałeś już swoje
mapDispatchToProps
, React-Redux w rzeczywistości traktuje to tak, jakmapState
dlatego, że jest to pierwszy argument. Nadal otrzymujesz wstrzykniętąonSubmit
funkcję w swoim komponencie, ponieważ zwrotmapState
jest scalany z właściwościami komponentu. Ale nie takmapDispatch
powinno być wstrzykiwane.Możesz używać
mapDispatch
bez definiowaniamapState
. Przekaż wnull
miejsce,mapState
a Twój komponent nie będzie podlegał zmianom w sklepie.Podłączony komponent
dispatch
jest domyślnie odbierany , gdy niemapDispatch
podanoPonadto twój komponent otrzymuje,
dispatch
ponieważ otrzymałnull
drugą pozycję zamapDispatch
. Jeśli poprawnie przejdzieszmapDispatch
, twój komponent nie zostanie odebranydispatch
.Powszechna praktyka
Powyższe odpowiedzi wyjaśnia, dlaczego komponent zachowywał się w ten sposób. Chociaż powszechną praktyką jest po prostu przekazywanie kreatora akcji przy użyciu
mapStateToProps
skrótu obiektu. I nazwij to w ramach swojego komponentu,onSubmit
czyli:źródło
Jeśli nie podasz
mapDispatchToProps
drugiego argumentu, na przykład:wtedy automatycznie otrzymujesz wysyłkę do właściwości komponentu, więc możesz po prostu:
bez mapDispatchToProps
źródło
Używam w ten sposób .. jego łatwy do zrozumienia pierwszy argument to mapStateToProps, a drugi argument to mapDispatchToProps na końcu połącz się z funkcją / klasą.
źródło
Czasami ten błąd występuje również podczas zmiany kolejności funkcji komponentu podczas przekazywania do połączenia.
Niepoprawne zamówienie:
Właściwa kolejność:
źródło
Pułapka, w którą niektórzy mogą wkroczyć, jest objęta tym pytaniem, ale nie została uwzględniona w odpowiedziach, ponieważ jest nieco inna w strukturze kodu, ale zwraca dokładnie ten sam błąd.
Ten błąd występuje podczas używania
bindActionCreators
i nieprzekazywaniadispatch
funkcjiKod błędu
Kod stały
Brak funkcji
dispatch
w kodzie błęduźródło
Funkcja 'connect' React-redux przyjmuje dwa argumenty, pierwszy to mapStateToProps, a drugi to mapDispatchToProps sprawdź poniżej, np.
export default connect(mapStateToProps, mapDispatchToProps)(Index);
`Jeśli nie chcemy pobrać stanu z redux, ustawiamy wartość null zamiast mapStateToProps.
export default connect(null, mapDispatchToProps)(Index);
źródło