Soy un principiante javascript / redux / react construyendo una pequeña aplicación con redux, react-redux, y react. Por alguna razón, cuando uso la función mapDispatchToProps junto con connect (react-redux vinculante) recibo un TypeError que indica que el despacho no es una función cuando intento ejecutar el accesorio resultante. Sin embargo, cuando llamo a dispatch como accesorio (vea la función setAddr en el código provisto) funciona.
Tengo curiosidad por saber por qué esto es así, en el ejemplo de la aplicación TODO en los documentos redux, el método mapDispatchToProps se configura de la misma manera. Cuando console.log (dispatch) dentro de la función dice que dispatch es type object. Podría seguir usando el despacho de esta manera, pero me sentiría mejor sabiendo por qué sucede esto antes de continuar con redux. Estoy usando webpack con babel-loaders para compilar.
Mi código:
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
Salud.
fuente
Respuestas:
Si desea usar
mapDispatchToProps
sin unmapStateToProps
solo usonull
para el primer argumento.export default connect(null, mapDispatchToProps)(Start)
fuente
mapDispatchToProps
, simplemente no agregue ese argumento aconnect
:connect(mapStateToProps)(MyComponent)
Solo te falta el primer argumento
connect
, que es elmapStateToProps
método. Extracto de la aplicación Redux todo:fuente
Utilizar
en vez de
fuente
Lo resolví intercambiando los argumentos, estaba usando
Cuál está mal. El
mapStateToProps
tiene que ser el primer argumento:Parece obvio ahora, pero podría ayudar a alguien.
fuente
Necesitaba un ejemplo usando,
React.Component
así que lo estoy publicando:fuente
Problema
Aquí hay un par de cosas a tener en cuenta para comprender el comportamiento del componente conectado en su código:
La aridad de los
connect
asuntos:connect(mapStateToProps, mapDispatchToProps)
React-Redux llama
connect
con el primer argumentomapStateToProps
y el segundo argumentomapDispatchToProps
.Por lo tanto, aunque haya pasado en su
mapDispatchToProps
, React-Redux de hecho lo trata como simapState
fuera el primer argumento. Aún obtiene laonSubmit
función inyectada en su componente porque el retorno demapState
se fusiona en los accesorios de su componente. Pero no es así comomapDispatch
se supone que debe inyectarse.Puede usar
mapDispatch
sin definirmapState
. Pase ennull
lugar demapState
y su componente no estará sujeto a cambios en la tienda.El componente conectado recibe
dispatch
por defecto, cuando nomapDispatch
se proporcionaAdemás, su componente recibe
dispatch
porque recibiónull
para su segunda posición paramapDispatch
. Si pasa correctamentemapDispatch
, su componente no recibirádispatch
.Práctica común
Lo anterior responde por qué el componente se comportó de esa manera. Aunque, es una práctica común que simplemente pases a tu creador de acción usando
mapStateToProps
la abreviatura del objeto. Y llame a eso dentro de su componenteonSubmit
Eso es:fuente
Cuando no proporcione
mapDispatchToProps
como segundo argumento, así:entonces recibirá automáticamente el envío a los accesorios del componente, por lo que puede simplemente:
sin ningún mapaDispatchToProps
fuente
Estoy usando así ... es fácil de entender el primer argumento es mapStateToProps y el segundo argumento es mapDispatchToProps al final se conecta con la función / clase.
fuente
En algún momento, este error también se produce cuando cambia el orden de la función Componente mientras pasa a conectarse.
Orden incorrecta:
Orden correcto:
fuente
Una pregunta que algunos podrían enfrentar está cubierta por esta pregunta, pero no se aborda en las respuestas, ya que es ligeramente diferente en la estructura del código pero devuelve exactamente el mismo error.
Este error ocurre al usar
bindActionCreators
y no pasar ladispatch
funciónCódigo de error
Código fijo
Faltaba la función
dispatch
en el código de errorfuente
La función React-redux 'connect' acepta dos argumentos primero es mapStateToProps y segundo es mapDispatchToProps verifique debajo de ej.
export default connect(mapStateToProps, mapDispatchToProps)(Index);
``Si no queremos recuperar el estado de redux, establecemos nulo en lugar de mapStateToProps.
export default connect(null, mapDispatchToProps)(Index);
fuente