【发布时间】:2018-12-14 15:06:16
【问题描述】:
假设我有一个组件树如下
<App>
</Header>
<Content>
<SelectableGroup>
...items
</SelectableGroup>
</Content>
<Footer />
</App>
SelectableGroup 能够通过鼠标选择/取消选择它包含的项目。我将当前选择(选定项目的数组)存储在 redux 存储中,以便我的应用程序中的所有组件都可以读取它。
Content 组件已将ref 设置为SelectableGroup,这使我能够以编程方式清除选择(调用clearSelection())。像这样的:
class Content extends React.Component {
constructor(props) {
super(props);
this.selectableGroupRef = React.createRef();
}
clearSelection() {
this.selectableGroupRef.current.clearSelection();
}
render() {
return (
<SelectableGroup ref={this.selectableGroupRef}>
{items}
</SelectableGroup>
);
}
...
}
function mapStateToProps(state) {
...
}
function mapDispatchToProps(dispatch) {
...
}
export default connect(mapStateToProps, mapDispatchToProps)(Content);
我可以很容易地想象将这个clearSelection() 传递给Contents 的孩子。但是如何,这是我的问题,我可以从兄弟组件Footer 调用clearSelection() 吗?
- 我是否应该从
Footer分派一个动作并将某种“请求调用清除选择”状态设置到 Redux 存储?在Content中的componentDidUpdate()回调中对此做出反应,然后立即调度另一个操作以重置此“请求调用清除选择”状态? - 或者有什么首选的方式来调用兄弟的函数?
【问题讨论】:
-
Select是否充当受控输入?换句话说,您是否将其设置为<Select ... value={valueFromProps}? -
在 React 世界中,最好更改 props,而
ref仅在没有其他选择时使用(例如通过调用.focus()强制输入具有焦点) -
@skyboyer 我已将
Select更改为SelectGroup- 明确它不是 HTML Select 元素。它是一个 HOC,可以通过拖动鼠标来选择项目。使用其 ref 清除选择是其创建者的决定。 -
但是你仍然可以用你自己的 HOC 包装它以拥有
value和onChange属性,而不是在每个集成点依赖ref
标签: reactjs react-redux