【发布时间】:2016-03-19 03:15:55
【问题描述】:
我的页面顶部有以下 UI 元素:
|[Static1] [Dynamic1] [Dynamic2] [Dynamic3] [Static2]|
所以Static1 是一些粘在左边的标志组件,Static2 是一些粘在右边的用户菜单组件。
现在在其中我有一个集合组件,它显示从数据库加载的几个动态元素。
一切都很好,如果这些组件不是太多,但如果有更多,我不想要任何换行符,只有一些“更多”菜单的堡垒,比如:
|[Static1] [Dynamic1] [Dynamic2] [Dynamic3] [Dynamic4][...][Static2]|
当我点击[...] 按钮时,我不需要动态组件的垂直列表。
动态项列表存储在ElementList 组件中,代码如下:
React.createClass({
render() {
return (
<div ref="listparent">
{ this.props.elements.map((element) => {
return <Element
ref={"element-"+element.name}
key={element.name}
})}
</div>
)
}
});
this.props.elements 是作为道具传递的集合。我在这些方面尝试了一些方法,但它要么不起作用,要么起作用,但不是在每次页面刷新时:
export default React.createClass({
getInitialState(){
return {
visibleElements: this.props.elements,
hiddenElements: []
}
},
componentDidMount() {
this.rearrange();
},
componentDidUpdate(){
this.rearrange();
},
rearrange(){
var element = ReactDOM.findDOMNode(this.refs.listparent);
let visibleElements = [];
let hiddenElements = [];
for(var i=0; i< this.props.elements.length; i++)
{
var currentElement = this.props.elements[i];
var domElement = ReactDOM.findDOMNode(this.refs["element-"+element.name]);
if(domElement) {
if (domElement.offsetTop + domElement.offsetHeight >
element.offsetTop + element.offsetHeight ||
domElement.offsetLeft + domElement.offsetWidth >
element.offsetLeft + element.offsetWidth - 200) {
hiddenElements.push(currentElement);
}
else {
visibleElements.push(currentElement);
}
}
}
if(this.state.visibleElements.length != visibleElements.length) {
this.setState({
visibleElements: visibleElements,
hiddenElements: hiddenElements
})
}
},
render() {
return (
<div ref="listparent">
{ this.state.visibleElements.map((element) => {
return <Element
ref={"element-"+element.name}
key={element.name} />
})}
{ this.state.hiddenElements.length >0 &&
<DropdownMenu
Header="..."
>
{ this.state.hiddenElements.map((element) => {
return <Element
ref={"element-"+element.name}
key={element.name} />
})}
</DropdownMenu>
}
</div>
)
}
});
这是一个粗略的 jsFiddle 我想做的事:https://jsfiddle.net/3uf9r8ne/
【问题讨论】:
标签: javascript html dom reactjs