У меня есть простой компонент React, который я подключаю (отображая простой массив / состояние). Чтобы не ссылаться на контекст для магазина, я хотел бы иметь способ получать "отправку" непосредственно из props. Я видел, как другие использовали этот подход, но по какой-то причине не имели к нему доступа :)
Вот версии каждой зависимости npm, которую я использую в настоящее время
"react": "0.14.3",
"react-redux": "^4.0.0",
"react-router": "1.0.1",
"redux": "^3.0.4",
"redux-thunk": "^1.0.2"
Вот компонент с методом подключения
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);
Если вам нужно увидеть редуктор (ничего интересного, но вот он)
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;
};
Если вам нужно посмотреть, как мой роутер настроен с редукцией
const createStoreWithMiddleware = applyMiddleware(
thunk
)(createStore);
const store = createStoreWithMiddleware(reducers);
var Route = (
<Provider store={store}>
<Router history={createBrowserHistory()}>
{Routes}
</Router>
</Provider>
);
Обновить
похоже, что если я опущу свою собственную отправку в подключении (в настоящее время я показываю fetchUsers), я бы получил бесплатную отправку (просто не уверен, что так обычно работает настройка с асинхронными действиями). Люди смешиваются и сочетаются друг с другом, или все или ничего?
[mapDispatchToProps]
источник
bindActionCreators(actionCreators, dispatch)
необязательный? Я заметил в вашем коде в// es7 spread syntax
строке, чтоdispatch
не передаетсяbindActionCreators
function mapDispatchToProps(dispatch) { return { ...bindActionCreators({ increment, decrement }), dispatch }; }
Обычно вы можете смешивать и сочетать в зависимости от того, что вам нужно.
Вы можете выступить
dispatch
в качестве опоры, если хотите:Я не знаю , как
fetchUsers
используется ( в качестве функции асинхронной?), Но, как правило , использовать что - то вродеbindActionCreators
для автоматической привязки отправки , а затем вам не придется беспокоиться об использованииdispatch
непосредственно в компонентах связности.Использование
dispatch
каталогового типа объединяет тупой компонент без состояния с redux. Что может сделать его менее портативным.источник
fetchUsers
введенный в качестве опоры. Обозначение ярлыка работает только тогда, когда вы передаете объект в качестве второго аргумента. При передаче функции вы должны вызватьbindActionCreators
себя:dispatch => ({ ...bindActionCreators({ fetchUsers }, dispatch), dispatch })
.dispatch => ( bindActionCreators({ dispatch, fetchUsers }, dispatch))
Хотя вы можете передавать
dispatch
как частьdispatchToProps
, я бы рекомендовал избегать доступа кstore
илиdispatch
непосредственно из ваших компонентов. Похоже, вам лучше было бы передать создателя связанного действия во втором аргументе подключенияdispatchToProps
См. Пример, который я разместил здесь https://stackoverflow.com/a/34455431/2644281, о том, как передать "уже связанный создатель действия", таким образом, вашим компонентам не нужно напрямую знать или зависеть от хранилища / отправки. .
Извините за краткость. Я обновлю с дополнительной информацией.
источник