在React中使用map函数的包装器渲染元素

时间:2019-01-17 23:46:26

标签: javascript reactjs

我有一个react组件,我需要根据数组中的项目渲染一堆元素。我已经设置了一个函数来渲染数组中的所有数组,并且效果很好。现在,我想将渲染的元素分为两个不同的包装器元素。我尝试了几种使用if语句和开关执行此操作的方法,但是我的代码变得非常混乱。我想看看是否有更清洁的方法可以做到,有人可能会知道。

  renderSplit(key) {
    return <div className={`inner_${key}`} key={key}>{`inner_${key}`}</div>;
  }

  render() {
    const { arr } = this.props;
    return (
      <div>
        {arr.map(this.renderSplit)}
      </div>
    );
  } 

因此,如果我有5个项目的数组,我希望将renderSplit渲染的前4个项目包装在一个容器中 <div className='left'>.....</div>和要包装在另一个包装器<div className='right'>....</div>中的数组中的最后一项 如果只有一项,则在数组中不会被任何包装div包装。

3 个答案:

答案 0 :(得分:2)

应该是arr.map而不是body.map接下来传入数组。然后调用函数

执行此操作:

 renderSplit(arr) {
    return arr.map((entry,index)=>
             <div className={`inner_${entry}`} key={entry}>{`inner_${entry}`}</div>;
         )
      }

  render() {
    const { arr } = this.props;
    return (
      <div>
        {this.renderSplit(arr)}
      </div>
    );
  } 

您可以在map语句中输入一个条件(相对于索引),以满足最后一个语句

答案 1 :(得分:0)

您可以使用destructuring assignment从数组中提取第一个元素和最后一个元素,检查是否存在最后一个元素(如果不存在),这意味着该数组只有一个条目,并相应地呈现:

 renderSplit(key) {
    return <div className={`inner_${key}`} key={key}>{`inner_${key}`}</div>;
  }

  render() {
    const { arr } = this.props;
    const [last, ...firstElems ] = arr.reverse(); // reverse the array to get the last element and use the spread operator to get the rest.

    return (
      firstElems.length > 0  // if you have elements in the firstElems array 
        ? ( 
        <div className="wrapper">
          <div className="left">{firstElems.reverse().map(this.renderSplit)}</div> // reverse the firstElems array to display it in the right order.
          <div className="right">{this.renderSplit(last)}</div> // render the last element.
        </div> 
        )
        // other wise, render the single element you have.
        : <div className="singleElement">{this.renderSplit(last)}</div> 
    );
  } 

答案 2 :(得分:0)

让我们看看:

  renderSplit(key) {
    return <div className={`inner_${key}`} key={key}>{`inner_${key}`}</div>;
  }

  render() {
    const { arr } = this.props;

    if(!arr || !arr.length) { return null; }

    if(arr.length === 1) { return renderSplit(arr[0]); }

    const left = arr.slice(0, arr.length - 2);
    const right = arr[arr.length -1];
    // Or else: 
    // const rightElement = arr.pop(); const leftElements = arr;

    return (
      // or <React.Fragment>
      <>
        <div className="left">
          {leftElements.map(this.renderSplit)}
        </div>
        <div className="right">
          {this.renderSplit(rightElement)}
        </div>
      </>       
    );
  }