我在尝试使用循环数组构建有条件地呈现不同元素的自定义组件时遇到问题。该组件包含特殊的className,用于生成每行3个元素的网格,而与传递给该组件的参数数量无关。
我正在使用map
遍历条件索引,在该条件索引中,我有条件地呈现第一个元素(用于打开),普通元素,每3个元素(用于关闭列并再次打开)和最后一个元素。 / p>
let optionsLength = this.props.options.length;
let options = []
this.props.options.map((option, index) => {
if (index === 0) {
options.push(
<div className="column is-one-third">
...
// other conditionals explained below
问题来了,试图找到一种方法,我需要关闭并打开父级<div>
的每3个元素。
在添加元素之前,我想关闭</div>
标签并打开新列div <div className="columns sub">
。该迭代无法在与样式会中断相同的条件下结束,因此存在更多依赖于以下元素的逻辑。但另一方面,JSX会中断。
以下是我希望实现的伪代码:
<div classname="columns"> // <-- ideally, rendered with the same element
<div>...</div> //<-- 1st element
<div>...</div>// <-- 2nd element
<div>...</div>// <-- 3rd element, so we add the following 2 lines
</div> <-- 3rd element
<div className="columns"> //<-- 3rd element
<div>...</div> //<-- 4rd element
...
<div>....</div>//<-- last element
</div>// <-- last element
PS我正在使用bulma生成列网格。
答案 0 :(得分:1)
假设this.props.options
为[1,2,3,4,5,6,7]
,则为组件声明此方法:
treatArray = arr => {
let masterArray = []
// Will a new array of arrays with 3 items
while (arr.length) masterArray.push(arr.splice(0, 3));
return (
<div>
{masterArray.map(setOf3 => (
<div classname="columns">
{setOf3.map(singleCol => (
<div className="column is-one-third">{singleCol}</div>
))}
</div>
))}
</div>
);
};
然后在您的render
中调用此函数:
render(){
return(
//.
//.
{ this.treatArray(this.props.options) }
//.
//.
)
}
这里是工作中的codesandbox。