React's context feature可用於這樣的事情。實際上,react-redux
用於將商店從Provider
轉換爲connect
函數。
處理上下文時,通常最好與react-redux
類似,使用提供程序組件添加它,並使用higher-order component (HOC)來訪問它。
提供者:
import React from 'react';
import propTypes from 'prop-types';
class FunctionProvider extends React.Component {
getChildContext() {
return {
fnc: this.props.fnc
};
}
render() {
return React.Children.only(this.props.children);
}
}
FunctionProvider.childContextTypes = {
fnc: propTypes.func
};
HOC:
import React from 'react';
import propTypes from 'prop-types';
function withFnc(WrappedComponent) {
class WithFnc extend React.Component {
render() {
return < WrappedComponent fnc={this.context.fnc} {...props} />
}
WithFnc.contextTypes = = {
fnc: propTypes.func
};
return WithFnc
}
添加FncProvider
:
function fnc (param) {
alert(param);
}
ReactDOM.render(
<Provider store={store}>
<FncProvider fnc={fnc}>
<App />
</FncProvider>
</Provider>,
document.getElementById('root')
);
裹組件:
import React from 'react';
class MyComponent extends React.Component {
render() {
return <button onClick={() => this.props.fnc('test')}>Click Me!</button>
}
}
export connect(mapStateToProps)(withFnc(MyComponent)
這可能有點過分,但如果你只需要將它傳遞一層或兩層以及一些組件。有時props
是一個完美的解決方案。
如果您特別想使用redux來解決這個問題,您可以創建一箇中間件,在特定操作上調用fnc
(我將使用ES6語法,因爲它的方式更乾淨,但讓我知道是否需要它是瀏覽器兼容的,我會補充說太):
const fncMiddleware = (fnc) => (store) => (next) => (action) => {
if (action.type === 'CALL_FNC') {
fnc(action.param);
}
return next(action);
}
的包括中間件,當您創建存儲:
function fnc (param) {
alert(param);
}
var store = createStore(reducer, applyMiddleware(fncMiddleware(fnc)));
ReactDOM.render(
<Provider store={store}>
<App />
</Provider>,
document.getElementById('root')
);
現在你可以從像任何你連接的部件派遣像{ type: 'CALL_FNC', param='test' }
行動其他活動ñ。
高階組件[鏈接](https://reactjs.org/docs/higher-order-components.html)可能會幫助你。 – mersocarlin