reactjs - 如何使用 react-redux 连接外部包中的组件
问题描述
我的应用程序使用我自己的 NPM 包,对一些组件进行分组。
我在我的应用程序的主 index.ts 中定义了这个:
ReactDOM.render(
<Provider store={store}>
<App />
</Provider>,
document.getElementById('root')
)
应用组件声明路由器。每条路由要么使用我的 NPM 包中的内部组件,要么使用外部组件。
react-redux 的 connect 功能可以很好地与内部组件配合使用。但是,当我尝试将连接与外部组件一起使用时出现错误:
在“Connect(ExternalComponent)”的上下文中找不到“store”。要么将根组件包装在 a 中
<Provider>
,要么将自定义的 React 上下文提供者传递给<Provider>
连接选项中的 Connect(ExternalComponent),并将相应的 React 上下文消费者传递给。
我可以理解这个问题:使用 connect 来满足内部需求,与任何包中的任何外部组件共享应用程序的状态真是一团糟……
但是,有没有办法为我的情况处理它?
我不能认为这是一个不寻常的情况。当然,我试过用谷歌搜索它,但我是 React/Redux 世界的初学者,所以也许我没有找到合适的词。
编辑 1
这就是我定义商店变量的方式。
import reducer from 'myNpmPackage/src/reducers';
import middleware from 'myNpmPackage/src/middleware';
const store = createStore(reducer, middleware);
如您所见,reducers 和中间件是我的 NPM 包的一部分。
编辑 2
这是我的 ExternalComponent :
import React, { PureComponent, Fragment } from 'react';
import { connect } from 'react-redux';
interface IExternalComponentProps {}
interface IExternalComponentState {}
class ExternalComponent extends PureComponent<IExternalComponentProps, IExternalComponentState>{
public render() {
return (
<div className="ExternalComponent">
External !
</div>
);
}
}
function mapStateToProps ({ test }: any) {
return {
test
}
}
export default connect(mapStateToProps)(ExternalComponent);
这是我的 App 组件声明路由器:
import React, { Component } from 'react';
import { connect } from 'react-redux'
import {
BrowserRouter as Router,
Route
} from 'react-router-dom';
import ExternalComponent from 'myNpmPackage/src/components/external-component/ExternalComponent.js';
// import InternalComponent from './components/internal-component/InternalComponent';
interface IAppProps {}
interface IAppState {}
class App extends React.Component<IAppProps, IAppState> {
public render() {
return (
<div className="App">
<div className="component-container">
<Router>
<div>
<Route exact path='/' component={ExternalComponent} />
</div>
</Router>
</div>
</div>
);
}
}
export default connect()(App);
如您所见,ExternalComponent 是在 TypeScript 编译后通过 JS 格式使用的。
解决方案
所以,我在 CRA 的 Github 上发布了一个问题: https ://github.com/facebook/create-react-app/issues/6027
一个团队遇到了同样的问题,他们找到了解决方案。仅作记录,我在这里报告:
从这里更改 webpack.config.js 中的 resolve.modules:
模块:['node_modules'].concat(/* ... */),到这个:
模块:[path.resolve('node_modules'), 'node_modules'].concat(/* ... */),
此外,他们做了一个 PR,你可以在这里找到它: https ://github.com/facebook/create-react-app/pull/6207
感谢他们!
推荐阅读
- php - laravel中的groupBy子关系
- c++ - c++中友元函数和聚合的问题
- c++ - C++ 中的文字类型是否可以包含唯一具有带默认值的附加参数的复制构造函数?
- html - 构建tailwindcss配置文件后的问题
- github - 从 puttygen 以 openssh 格式导出 github 可接受的 ssh 密钥
- tensorflow - 如何区分 Tensor 和 EagerTensor
- javascript - 使用脚本在 Google 表格中的嵌入图表上设置辅助 Y 轴的颜色
- reactjs - 使用 react js 以画廊格式显示图像
- eclipse - 在 Eclipse 中无法连接到远程 VM 连接重置
- reactjs - for循环和等待关键字