我如何从 React Redux 中的子组件调度?
How can I dispatch from child components in React Redux?
我的服务器有这样的代码:
<ReactRedux.Provider store={store}><Layout defaultStore={JSON.stringify(store.getState())}/></ReactRedux.Provider>
<Layout>
显然有更多的组件嵌套更多。
我内心深处有一个这样的class:
import React from 'react';
export default React.createClass({
render: function(){
var classes = [
'js-select-product',
'pseudo-link'
];
if (this.props.selected) {
classes.push('bold');
}
return (
<li className="js-product-selection">
<span onClick={this.props.onClick} className={classes.join(' ')} data-product={this.props.id}>{this.props.name}</span>
</li>
);
}
});
我真正想做的而不是 this.props.onClick
是向 set state in a reducer 发送一个事件。我已经在网上了解了一些有关上下文的信息,但由于该功能是否会消失,我得到了褒贬不一的评论。
编辑
我看到这个 connect method 但我发誓我读过不要在子组件中使用 connect
。
曾经有建议试图限制您连接的组件。参见示例:
https://github.com/reactjs/redux/issues/419
https://github.com/reactjs/redux/issues/419#issuecomment-178850728
无论如何,这对于将一部分状态委托给组件确实更有用。如果对您的情况有意义,或者如果您不想传递调用 dispatch()
的回调,您可以这样做,如果需要,您可以传递商店或向下调度层次结构。
您太关注子组件了。你应该构建你的应用程序,以便你有连接的组件和非连接的组件。非连接组件应该是无状态的,本质上是纯函数,通过 props 接收所有需求。连接组件应该使用 connect
函数将 redux state 映射到 props 并将 redux dispatcher 映射到 props,然后负责将这些 props 传递给子组件。
您的应用中可能有很多连接组件,也有很多非连接组件。 This post(由 redux 的创建者)更详细地讨论了它,并讨论了负责实际显示 UI 的非连接(哑)组件和负责组合的连接(智能)组件未连接的组件。
一个例子可能是(使用一些更新的语法):
class Image extends React {
render() {
return (
<div>
<h1>{this.props.name}</h1>
<img src={this.props.src} />
<button onClick={this.props.onClick}>Click me</button>
</div>
);
}
}
class ImageList extends React {
render() {
return (
this.props.images.map(i => <Image name={i.name} src={i.src} onClick={this.props.updateImage} />)
);
}
}
const mapStateToProps = (state) => {
return {
images: state.images,
};
};
const mapDispatchToProps = (dispatch) => {
return {
updateImage: () => dispatch(updateImageAction()),
};
};
export default connect(mapStateToProps, mapDispatchToProps)(ImageList);
在本例中,ImageList
是连通分量,Image
是非连通分量。
我的服务器有这样的代码:
<ReactRedux.Provider store={store}><Layout defaultStore={JSON.stringify(store.getState())}/></ReactRedux.Provider>
<Layout>
显然有更多的组件嵌套更多。
我内心深处有一个这样的class:
import React from 'react';
export default React.createClass({
render: function(){
var classes = [
'js-select-product',
'pseudo-link'
];
if (this.props.selected) {
classes.push('bold');
}
return (
<li className="js-product-selection">
<span onClick={this.props.onClick} className={classes.join(' ')} data-product={this.props.id}>{this.props.name}</span>
</li>
);
}
});
我真正想做的而不是 this.props.onClick
是向 set state in a reducer 发送一个事件。我已经在网上了解了一些有关上下文的信息,但由于该功能是否会消失,我得到了褒贬不一的评论。
编辑
我看到这个 connect method 但我发誓我读过不要在子组件中使用 connect
。
曾经有建议试图限制您连接的组件。参见示例:
https://github.com/reactjs/redux/issues/419
https://github.com/reactjs/redux/issues/419#issuecomment-178850728
无论如何,这对于将一部分状态委托给组件确实更有用。如果对您的情况有意义,或者如果您不想传递调用 dispatch()
的回调,您可以这样做,如果需要,您可以传递商店或向下调度层次结构。
您太关注子组件了。你应该构建你的应用程序,以便你有连接的组件和非连接的组件。非连接组件应该是无状态的,本质上是纯函数,通过 props 接收所有需求。连接组件应该使用 connect
函数将 redux state 映射到 props 并将 redux dispatcher 映射到 props,然后负责将这些 props 传递给子组件。
您的应用中可能有很多连接组件,也有很多非连接组件。 This post(由 redux 的创建者)更详细地讨论了它,并讨论了负责实际显示 UI 的非连接(哑)组件和负责组合的连接(智能)组件未连接的组件。
一个例子可能是(使用一些更新的语法):
class Image extends React {
render() {
return (
<div>
<h1>{this.props.name}</h1>
<img src={this.props.src} />
<button onClick={this.props.onClick}>Click me</button>
</div>
);
}
}
class ImageList extends React {
render() {
return (
this.props.images.map(i => <Image name={i.name} src={i.src} onClick={this.props.updateImage} />)
);
}
}
const mapStateToProps = (state) => {
return {
images: state.images,
};
};
const mapDispatchToProps = (dispatch) => {
return {
updateImage: () => dispatch(updateImageAction()),
};
};
export default connect(mapStateToProps, mapDispatchToProps)(ImageList);
在本例中,ImageList
是连通分量,Image
是非连通分量。