Я примерно так вижу, что там под капотом происходит. К сожаленью, не заглядывал в исходники, поэтому скорее всего пример не свосем корректный, но на вопрос твой отвечает.
function connect(...mappers){
// не знаю как connect получает доступ к store, поэтому тупо захардкодил, но это не важно
// чтобы ответить на вопрос
const store = {
getState() {
return {
players: ['Rooney', 'Mata', 'Messi', 'Ronaldo', 'Zlatan']
}
},
dispatch(actionCreator) {
return function (...args) {
return Promise
.resolve( actionCreator(...args) )
.then(() => console.log(`I have just called ${actionCreator.name} actionCreator`));
};
}
};
let fromStore = {};
if(typeof mappers[0] === "function") {
const state = store.getState();
const stateToProps = mappers[0](state);
fromStore = {...stateToProps};
}
if(typeof mappers[1] === "function") {
fromStore = { ...fromStore, ...mappers[1](store.dispatch) };
}
return function(MyComponent) {
const HOC = Component => props =>
<Component dispatch={store.dispatch} {...fromStore} {...props} />
return HOC(MyComponent);
};
}
const App = (props = { a: 1, b: 2 }) => (
console.log('App props', props)
);
const fetchData = (api) => console.log(`I am gonna fetch some data from this api ${api}`)
const mapStateToProps = state => ({ players: state.players });
const mapDispatchToProps = dispatch => ({ fetchData: dispatch(fetchData) });
const ConnectedApp = connect(mapStateToProps, mapDispatchToProps)(App);
console.log('connectedApp props', ConnectedApp({ hello: 'hello kitty' }).props);
должен признать что вот так не работает
console.log('connectedApp props', <ConnectedApp hello={'hello kitty'} />);
в примере, а должно, но я не хочу париться, поскольку этого примера достаточно
вот можно поиграться
codepen.io/dagman/pen/Ppajeg