Tengo un componente React simple que conecto (mapeando una matriz / estado simple). Para evitar hacer referencia al contexto de la tienda, me gustaría una forma de obtener "despacho" directamente de los accesorios. He visto a otros usar este enfoque pero no tienen acceso a esto por alguna razón :)
Aquí están las versiones de cada dependencia npm que estoy usando actualmente
"react": "0.14.3",
"react-redux": "^4.0.0",
"react-router": "1.0.1",
"redux": "^3.0.4",
"redux-thunk": "^1.0.2"
Aquí está el componente con método de conexión
class Users extends React.Component {
render() {
const { people } = this.props;
return (
<div>
<div>{this.props.children}</div>
<button onClick={() => { this.props.dispatch({type: ActionTypes.ADD_USER, id: 4}); }}>Add User</button>
</div>
);
}
};
function mapStateToProps(state) {
return { people: state.people };
}
export default connect(mapStateToProps, {
fetchUsers
})(Users);
Si necesita ver el reductor (nada emocionante, pero aquí está)
const initialState = {
people: []
};
export default function(state=initialState, action) {
if (action.type === ActionTypes.ADD_USER) {
let newPeople = state.people.concat([{id: action.id, name: 'wat'}]);
return {people: newPeople};
}
return state;
};
Si necesita ver cómo está configurado mi enrutador con redux
const createStoreWithMiddleware = applyMiddleware(
thunk
)(createStore);
const store = createStoreWithMiddleware(reducers);
var Route = (
<Provider store={store}>
<Router history={createBrowserHistory()}>
{Routes}
</Router>
</Provider>
);
actualizar
Parece que si omito mi propio envío en la conexión (actualmente arriba, estoy mostrando fetchUsers), obtendría el envío gratis (pero no estoy seguro de si así es como una configuración con acciones asíncronas funcionaría normalmente). ¿La gente se mezcla y combina o es todo o nada?
[mapDispatchToProps]
fuente
bindActionCreators(actionCreators, dispatch)
opcional? Noté que en su código en la// es7 spread syntax
línea,dispatch
no se pasa abindActionCreators
function mapDispatchToProps(dispatch) { return { ...bindActionCreators({ increment, decrement }), dispatch }; }
Por lo general, puede mezclar y combinar según lo que desee.
Usted puede pasar
dispatch
como un puntal si eso es lo que quiere:No estoy seguro de cómo
fetchUsers
se utiliza (como una función asíncrona?), Pero que generalmente se usa algo comobindActionCreators
para auto-bind envío y entonces no tendría que preocuparse acerca de cómo utilizardispatch
directamente en los componentes conectados.El uso de
dispatch
directorios empareja el componente tonto y sin estado con redux. Lo que puede hacer que sea menos portátil.fuente
fetchUsers
inyección suelta como apoyo. La notación de método abreviado solo funciona cuando pasa un objeto como segundo argumento. Cuando se pasa una función que tiene que llamarbindActionCreators
a sí mismo:dispatch => ({ ...bindActionCreators({ fetchUsers }, dispatch), dispatch })
.dispatch => ( bindActionCreators({ dispatch, fetchUsers }, dispatch))
Si bien podría pasar
dispatch
como parte dedispatchToProps
, recomendaría evitar acceder alstore
odispatch
directamente desde sus componentes. Parece que sería mejor para usted pasar un creador de acción vinculado en el segundo argumento de ConnectdispatchToProps
Vea un ejemplo que publiqué aquí https://stackoverflow.com/a/34455431/2644281 de cómo transmitir un "creador de acciones ya vinculado" de esta manera, sus componentes no necesitan saber directamente o depender de la tienda / despacho .
Perdón por ser breve. Actualizaré con más información.
fuente