Eu tenho um componente React simples que eu conecto (mapeando uma matriz / estado simples). Para evitar fazer referência ao contexto da loja, gostaria de uma maneira de obter "envio" diretamente dos adereços. Já vi outras pessoas usando essa abordagem, mas não têm acesso a ela por algum motivo :)
Aqui estão as versões de cada dependência de npm que estou usando atualmente
"react": "0.14.3",
"react-redux": "^4.0.0",
"react-router": "1.0.1",
"redux": "^3.0.4",
"redux-thunk": "^1.0.2"
Aqui está o componente com método de conexão
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);
Se você precisar ver o redutor (nada emocionante, mas aqui 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;
};
Se você precisa ver como meu roteador está configurado com redux
const createStoreWithMiddleware = applyMiddleware(
thunk
)(createStore);
const store = createStoreWithMiddleware(reducers);
var Route = (
<Provider store={store}>
<Router history={createBrowserHistory()}>
{Routes}
</Router>
</Provider>
);
atualizar
parece que se eu omitir meu próprio despacho na conexão (atualmente acima estou mostrando fetchUsers), eu o obteria gratuitamente (só não tenho certeza se é assim que uma configuração com ações assíncronas normalmente funcionaria). As pessoas se misturam e combinam ou é tudo ou nada?
[mapDispatchToProps]
fonte
bindActionCreators(actionCreators, dispatch)
opcional? Percebi em seu código na// es7 spread syntax
linha, odispatch
não é passado parabindActionCreators
function mapDispatchToProps(dispatch) { return { ...bindActionCreators({ increment, decrement }), dispatch }; }
Normalmente, você pode misturar e combinar com base no que deseja.
Você pode passar
dispatch
como um adereço se é o que deseja:Eu não tenho certeza de como
fetchUsers
é utilizado (como uma função assíncrona?), Mas você normalmente usaria algo comobindActionCreators
a auto-bind expedição e, em seguida, você não teria que se preocupar sobre como utilizardispatch
diretamente em componentes conectados.O uso de
dispatch
diretório acopla o componente idiota e sem estado com redux. O que pode torná-lo menos portátil.fonte
fetchUsers
injeção não ligada como um suporte. A notação de atalho só funciona quando você passa um objeto como o segundo argumento. Quando você passar uma função que você tem que chamarbindActionCreators
-se:dispatch => ({ ...bindActionCreators({ fetchUsers }, dispatch), dispatch })
.dispatch => ( bindActionCreators({ dispatch, fetchUsers }, dispatch))
Embora você possa passar
dispatch
para baixo como parte dedispatchToProps
, recomendo evitar acessar ostore
oudispatch
diretamente de dentro de seus componentes. Parece que você ficaria melhor ao passar um criador de ação vinculada no segundo argumento de conexãodispatchToProps
Veja um exemplo que postei aqui https://stackoverflow.com/a/34455431/2644281 de como transmitir um "criador de ação já vinculado" desta forma, seus componentes não precisam saber diretamente ou depender da loja / expedição .
Desculpe ser breve. Vou atualizar com mais informações.
fonte