假设我在应用程序中使用了所需的提供程序,将其命名为MyProvider
,并用它包装我的应用程序。该提供程序必须以data1
和data2
为道具:
const data1 = store.getState().data1;
const data2 = "some data";
<Provider store={store}>
<Myprovider data1={data1} data2={data2}>
<App/>
</Myprovider>
</ Provider>
所以data1
是从状态中检索的,而data2是预定义的数据。当data1
发生更改时(我的意思是,当调度了一些操作,并且state's data1
发生了一些更改时,提供程序不会检测到它(。所以我想到的是创建wrapper for Myprovider
,让我们称之为ConnectedMyprovider
,它将连接到redux存储,并将data1
和data2
作为道具传递给Myprovider
。
ConnectedMyprovider
的代码类似于:
import {connect} from 'react-redux';
import {MyProvider} from 'MyProvider';
function mapStateToProps(state, ownProps) {
const {data1} = state.data1;
const data2 = ownProps.data2;
return {data1: data1, data2: data2};
}
export default connect(mapStateToProps, null)(MyProvider);
然后,将我的应用程序包装为:
const data2 = "some data";
<Provider store={store}>
<ConnectedMyProvider data2={data2}>
<App/>
</ConnectedMyProvider>
</ Provider>
最终出现错误Make sure your <MyProvider> is set up correctly.
未提供data2
。有人知道怎么做吗?
@Vilva。我直接把它移到ConnectedMyProvider
中,并添加了这个部分class ConnectedMyProvider extends Component {
:
import {Provider as TranslateProvider} from 'react-translated'; // this is provider I wrapped
class ConnectedMyProvider extends Component {
constructor(props) {
super(props);
}
render() {
return (
<TranslateProvider language={this.props.language} translation={translation} >
<App/>
</TranslateProvider>
);
}
}
function mapStateToProps(state, ownProps) {
return {
language: state.language
};
}
export default connect(mapStateToProps, null)(ConnectedMyProvider);
我将ConnectedMyProvider
定义为新的Component,并在render函数中返回Provider
(包装的提供程序(。请注意,我还在return语句中放入了<App/>
。然后,在索引中,我有ConnectedMyProvider
作为渲染方法中的最后一个子项
ReactDOM.render(
<Provider store={store}>
<ConnectedMyProvider />
</ Provider>,
document.getElementById('root')
);
如上所述,<App/>
嵌套在ConnectedMyProvider
返回语句中,如果我将其嵌套在<ConnectedMyProvider>
标记内的index.jsx's
渲染函数中,它将不起作用。
我使用redux已经有一段时间了,但你的方法对我来说似乎相当正确。你确定没有命名/语法错误吗?逻辑听起来不错。
尝试检查ownProps.data2
是否确实工作。如果不是,这听起来可能是一个愚蠢的建议,但为什么不直接在ConnectedMyProvider上设置data2呢?。