Mam prosty komponent React, który podłączam (mapowanie prostej tablicy / stanu). Aby uniknąć odwoływania się do kontekstu sklepu, chciałbym uzyskać sposób na uzyskanie „wysyłki” bezpośrednio z rekwizytów. Widziałem innych stosujących to podejście, ale z jakiegoś powodu nie mam do niego dostępu :)
Oto wersje każdej zależności npm, której obecnie używam
"react": "0.14.3",
"react-redux": "^4.0.0",
"react-router": "1.0.1",
"redux": "^3.0.4",
"redux-thunk": "^1.0.2"
Oto metoda komponentu z połączeniem
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);
Jeśli chcesz zobaczyć reduktor (nic ekscytującego, ale oto jest)
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;
};
Jeśli chcesz zobaczyć, jak skonfigurowany jest mój router w / Redux
const createStoreWithMiddleware = applyMiddleware(
thunk
)(createStore);
const store = createStoreWithMiddleware(reducers);
var Route = (
<Provider store={store}>
<Router history={createBrowserHistory()}>
{Routes}
</Router>
</Provider>
);
aktualizacja
wygląda na to, że jeśli pominę własną wysyłkę w połączeniu (obecnie powyżej pokazuję fetchUsers), otrzymam wysyłkę za darmo (tylko nie jestem pewien, czy tak zwykle działałaby konfiguracja z akcjami asynchronicznymi). Czy ludzie mieszają się i łączą, czy to wszystko, czy nic?
[mapDispatchToProps]
źródło
bindActionCreators(actionCreators, dispatch)
opcjonalnym? Zauważyłem w twoim kodzie na// es7 spread syntax
linii, żedispatch
nie jest przekazywany dobindActionCreators
function mapDispatchToProps(dispatch) { return { ...bindActionCreators({ increment, decrement }), dispatch }; }
Zwykle możesz mieszać i dopasowywać w zależności od tego, co chcesz.
Państwo może przekazać
dispatch
na jako rekwizyt jeśli to, co chcesz:Nie jestem pewien, jak
fetchUsers
jest używany (jako funkcji asynchroniczny?), Ale można zazwyczaj używać coś jakbindActionCreators
na auto-wiążą wysyłki i wtedy nie trzeba się martwić o użyciudispatch
bezpośrednio podłączonych komponentów.Używanie
dispatch
rodzaju katalogowego łączy głupi , bezstanowy składnik z reduxem. Co może sprawić, że będzie mniej przenośny.źródło
fetchUsers
wstrzyknięty jako rekwizyt. Notacja skrótu działa tylko wtedy, gdy przekażesz obiekt jako drugi argument. Po przejechaniu funkcję trzeba nazwaćbindActionCreators
siebie:dispatch => ({ ...bindActionCreators({ fetchUsers }, dispatch), dispatch })
.dispatch => ( bindActionCreators({ dispatch, fetchUsers }, dispatch))
Chociaż możesz przekazać
dispatch
jako częśćdispatchToProps
, zalecałbym unikanie dostępu dostore
lubdispatch
bezpośrednio z poziomu komponentów. Wygląda na to, że lepiej byłoby, gdybyś przekazał związany kreator akcji w drugim argumencie connectadispatchToProps
Zobacz przykład, który zamieściłem tutaj https://stackoverflow.com/a/34455431/2644281, jak przekazać „już związanego kreatora akcji” w ten sposób, aby komponenty nie musiały bezpośrednio wiedzieć o sklepie / wysyłce ani od niego zależeć .
Przepraszam, że mówię krótko. Zaktualizuję więcej informacji.
źródło