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 syntaxlínea,dispatchno se pasa abindActionCreatorsfunction mapDispatchToProps(dispatch) { return { ...bindActionCreators({ increment, decrement }), dispatch }; }Por lo general, puede mezclar y combinar según lo que desee.
Usted puede pasar
dispatchcomo un puntal si eso es lo que quiere:No estoy seguro de cómo
fetchUsersse utiliza (como una función asíncrona?), Pero que generalmente se usa algo comobindActionCreatorspara auto-bind envío y entonces no tendría que preocuparse acerca de cómo utilizardispatchdirectamente en los componentes conectados.El uso de
dispatchdirectorios empareja el componente tonto y sin estado con redux. Lo que puede hacer que sea menos portátil.fuente
fetchUsersinyecció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 llamarbindActionCreatorsa sí mismo:dispatch => ({ ...bindActionCreators({ fetchUsers }, dispatch), dispatch }).dispatch => ( bindActionCreators({ dispatch, fetchUsers }, dispatch))Si bien podría pasar
dispatchcomo parte dedispatchToProps, recomendaría evitar acceder alstoreodispatchdirectamente desde sus componentes. Parece que sería mejor para usted pasar un creador de acción vinculado en el segundo argumento de ConnectdispatchToPropsVea 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