【发布时间】:2017-04-03 04:55:21
【问题描述】:
我正在使用基于文档中的示例代码的模态:https://react-bootstrap.github.io/components.html#modals-live。我想要的是仅在 1)它的数据准备好和 2)打开模式时才呈现子组件。此外,子组件需要知道它必须使用的区域有多大(因为它正在内部进行一些 d3.js svg 绘图)。
顺便说一句,我也在使用fixed-data-table,所以数据(concept)处于状态,模型在行点击时打开:
onRowClick={(evt, idx, obj)=>{
let concept = filteredDataList.getObjectAt(idx);
this.openModal();
this.setState({concept});
}}
根据 Modal 文档示例,Modal 位于渲染中,并以关闭状态存在于 DOM 中,直到有东西打开它。但是,在 Modal 打开之前,Modal.Body 似乎并不存在。我的好主意是子 ConceptDetail 可以从 ref 获取 ClientWidth 到其包含的 div。
let conceptDetail = '';
if (this.state.concept) {
conceptDetail = <ConceptDetail
containerRefs={this.refs}
concept={concept} />/
}
<Modal>
...
<Modal.Body>
<div ref="modalBody" style={{width:'100%'}}>
{conceptDetail}
</div>
</Modal.Body>
...
</Modal>
这个会工作,除了在子组件被渲染之后 ref 还没有准备好。为了弄清楚发生了什么,我这样做了:
componentWillUpdate(){
if (this.refs.modalBody) {
let { clientWidth } = this.refs.modalBody;
alert(`will update, width: ${clientWidth}`);
} else {
alert('will update, no modalBody ref');
}
}
componentDidUpdate(){
if (this.refs.modalBody) {
let { clientWidth } = this.refs.modalBody;
alert(`did update, width: ${clientWidth}`);
} else {
alert('did update, no modalBody ref');
}
}
单击一行时,我看到警报will update, no modalBody ref,然后是警报did update, width: 868,然后显示子组件。但是孩子没有得到宽度(或更新的参考),因为它实际上在componentDidUpdate 之前呈现。我首先看到警报的原因(我假设)是因为 Modal 是动画的并且不会在渲染时立即出现。当我关闭模态框时,我确实看到它终于收到了正确的宽度,但我不再需要它了。
所以,最具体地说,我的问题是:如何通知模态的子组件模态体的宽度?如果有人能解释一下我正在尝试做的事情的正确方法,我将更加感激:触发带有子组件的 Modal 显示,该子组件希望接收数据和容器尺寸作为道具。
【问题讨论】:
标签: reactjs react-bootstrap react-modal