J'ai un simple composant React que je connecte (mappant un simple tableau / état). Pour éviter de référencer le contexte du magasin, j'aimerais avoir un moyen d'obtenir une «répartition» directement à partir des accessoires. J'en ai vu d'autres utiliser cette approche mais je n'y ai pas accès pour une raison quelconque :)
Voici les versions de chaque dépendance npm que j'utilise actuellement
"react": "0.14.3",
"react-redux": "^4.0.0",
"react-router": "1.0.1",
"redux": "^3.0.4",
"redux-thunk": "^1.0.2"
Voici le composant avec la méthode de connexion
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 vous avez besoin de voir le réducteur (rien d'excitant mais le voici)
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 vous avez besoin de voir comment mon routeur est configuré avec redux
const createStoreWithMiddleware = applyMiddleware(
thunk
)(createStore);
const store = createStoreWithMiddleware(reducers);
var Route = (
<Provider store={store}>
<Router history={createBrowserHistory()}>
{Routes}
</Router>
</Provider>
);
mettre à jour
ressemble à si j'omettais ma propre répartition dans la connexion (actuellement ci-dessus, je montre fetchUsers), j'obtiendrais une distribution gratuite (mais je ne sais pas si c'est ainsi qu'une configuration avec des actions asynchrones fonctionnerait habituellement). Les gens se mélangent-ils ou sont-ils tout ou rien?
[mapDispatchToProps]
la source
bindActionCreators(actionCreators, dispatch)
option? J'ai remarqué dans votre code à la// es7 spread syntax
ligne, ledispatch
n'est pas passé àbindActionCreators
function mapDispatchToProps(dispatch) { return { ...bindActionCreators({ increment, decrement }), dispatch }; }
Vous pouvez généralement mélanger et assortir en fonction de ce que vous souhaitez.
Vous pouvez passer
dispatch
comme accessoire si c'est ce que vous voulez:Je ne sais pas comment
fetchUsers
est utilisé (comme une fonction async?), Mais vous généralement utiliser quelque chose commebindActionCreators
à l' auto-bind expédition et vous ne seriez pas à vous soucier de l' utilisationdispatch
directement dans les composants connectés.L'utilisation d'une
dispatch
sorte de répertoire couple le composant stupide et sans état avec redux. Ce qui peut le rendre moins portable.la source
fetchUsers
injecté comme accessoire. La notation de raccourci ne fonctionne que lorsque vous passez un objet comme deuxième argument. Lorsque vous passez une fonction , vous devez appelerbindActionCreators
vous - même:dispatch => ({ ...bindActionCreators({ fetchUsers }, dispatch), dispatch })
.dispatch => ( bindActionCreators({ dispatch, fetchUsers }, dispatch))
Bien que vous puissiez transmettre
dispatch
dans le cadre dedispatchToProps
, je vous recommande d'éviter d'accéder àstore
oudispatch
directement à partir de vos composants. Il semble que vous seriez mieux servi en passant un créateur d'action lié dans le deuxième argument de connectdispatchToProps
Voir un exemple que j'ai publié ici https://stackoverflow.com/a/34455431/2644281 sur la façon de transmettre un "créateur d'action déjà lié" de cette façon, vos composants n'ont pas besoin de connaître directement ou de dépendre du magasin / de la distribution .
Désolé d'être bref. Je mettrai à jour avec plus d'informations.
la source