React:创建同一控件的另一个实例
React: Creating Another instance of the same control
我创建了一个运行良好的应用程序。我的 app.jsx 看起来像
const App = () => (
<div>
<DimensionPicker dimensionName="genre"/>
<TableControl />
</div>
)
export default App;
嗯。这很好。但现在我想要在同一份报告中使用另一个维度选择器实例,例如
const App = () => (
<div>
<DimensionPicker dimensionName="genre"/>
<DimensionPicker dimensionName="year"/>
<TableControl />
</div>
)
export default App;
事实证明这很难做到,因为第二个实例会覆盖我在商店中创建的状态。
如何解决这种情况?
所以我认为这里的问题是两个实例具有相同的业务逻辑,因为一切都在内部处理。因此,两者都会覆盖您商店中的相同状态,导致两个实例触发相同的回调。
当我希望一个展示组件具有不同的功能时,我所做的只是简单地包装它们并将所需的回调作为道具注入。
我会这样做(伪代码):
GenrePicker extends Component {
handleBehaviour() {
// define GenrePicker specific logic here
dispatch(STATE_CHANGE_GENREPICKER)
}
render() {
return (<DimensionPicker onPickHandler={this.handleBehaviour} dimensionName="genre"/>)
}
}
YearPicker extends Component {
handleBehaviour() {
// define YearPicker specific logic here
dispatch(STATE_CHANGE_YEARPICKER)
}
render() {
return (<DimensionPicker onPickHandler={this.handleBehaviour} dimensionName="year"/>)
}
}
在您的应用程序中
const App = () => (
<div>
<GenrePicker />
<YearPicker />
<TableControl />
</div>
)
export default App;
我总是只针对道具来编写我的演示组件。在您的情况下,我会将 DimensionPicker 视为一个愚蠢的表示组件,并使用具体的组件来注入所需的逻辑。
关于状态覆盖的问题。两个组件不应该有自己的状态 属性 吗? state = { selectedYear: '', selectedGenre: '' } 并因此在他们的 handleBehaviour() 方法中调度一个只传播它自己的状态变化的动作?
我创建了一个运行良好的应用程序。我的 app.jsx 看起来像
const App = () => (
<div>
<DimensionPicker dimensionName="genre"/>
<TableControl />
</div>
)
export default App;
嗯。这很好。但现在我想要在同一份报告中使用另一个维度选择器实例,例如
const App = () => (
<div>
<DimensionPicker dimensionName="genre"/>
<DimensionPicker dimensionName="year"/>
<TableControl />
</div>
)
export default App;
事实证明这很难做到,因为第二个实例会覆盖我在商店中创建的状态。
如何解决这种情况?
所以我认为这里的问题是两个实例具有相同的业务逻辑,因为一切都在内部处理。因此,两者都会覆盖您商店中的相同状态,导致两个实例触发相同的回调。
当我希望一个展示组件具有不同的功能时,我所做的只是简单地包装它们并将所需的回调作为道具注入。
我会这样做(伪代码):
GenrePicker extends Component {
handleBehaviour() {
// define GenrePicker specific logic here
dispatch(STATE_CHANGE_GENREPICKER)
}
render() {
return (<DimensionPicker onPickHandler={this.handleBehaviour} dimensionName="genre"/>)
}
}
YearPicker extends Component {
handleBehaviour() {
// define YearPicker specific logic here
dispatch(STATE_CHANGE_YEARPICKER)
}
render() {
return (<DimensionPicker onPickHandler={this.handleBehaviour} dimensionName="year"/>)
}
}
在您的应用程序中
const App = () => (
<div>
<GenrePicker />
<YearPicker />
<TableControl />
</div>
)
export default App;
我总是只针对道具来编写我的演示组件。在您的情况下,我会将 DimensionPicker 视为一个愚蠢的表示组件,并使用具体的组件来注入所需的逻辑。
关于状态覆盖的问题。两个组件不应该有自己的状态 属性 吗? state = { selectedYear: '', selectedGenre: '' } 并因此在他们的 handleBehaviour() 方法中调度一个只传播它自己的状态变化的动作?