我有一个使用 React/Redux 的应用程序。我使用 Electron 将其打包为一个独立的应用程序。我目前正在构建基础以允许用户将自己的插件或小部件添加到应用程序中。由于我使用的是 Redux,我想继续使用 Redux 来跟踪安装的内容以及它为应用程序带来的更改/新功能。
在我深入探讨我的问题之前,让我们举个例子。我的核心应用程序有一个带有“控制”按钮的侧边栏。核心有两个按钮,但我想允许插件在那里添加自己的按钮。当然,我可以手动继续,在按钮侧边栏组件的 js 文件中导入插件并手动添加按钮,但这会破坏可插入性的目的。所以我能想到的最好和最简单的解决方案是从插件代码中分派一个动作,例如 ADD_SIDEBAR_BUTTON 它基本上将一个带有按钮元数据的对象添加到按钮数组(包括那些是核心的)。这个:
store.dispatch({type: "ADD_SIDEBAR_BUTTON", payload: {type: "button", path: "goSomewhere", label: "A label"}});
虽然这可以工作,但它极大地限制了按钮的功能,因为按钮的实际逻辑和 jsx 将来自核心应用程序。在实践中,我只是渴望让插件传递一个 React 组件,这将使插件在事件、生命周期的完全控制等方面有很大的自由度……但是传递除了普通对象之外的任何东西都是 Redux不,不。
另一种解决方案是让插件开发人员创建一个带有导出类的文件,并使用 redux 提供它的路径,如下所示:
class MyPluginButton extends Component {
handleClick() => evt => {
// do my special things
}
render() {
return <button onClick={this.handleClick}>My Special Button</button>
}
}
export default MyPluginButton;
然后插件的一个 initialize() 函数将调度操作并传递核心导入按钮所需的信息(如果没有正确完成,我也可能会想到安全问题):
store.dispatch({type: "ADD_SIDEBAR_BUTTON", payload: {path: "myplugin/src/components/MyPluginButton"}});
现在我的问题是,有没有人有好的想法可以/应该如何实施?我想确保没有其他我错过的模式或实现。