简体   繁体   English

如何在反应中渲染数组数组

[英]How to render arrays of arrays in react

Need to render arrays of arrays --> which contain objects需要渲染包含对象的数组数组 -->

On JSX / HTML I should have for every sub-array one <li></li> tag, inside of that tag render objects from an array when this sub-array is rendered, I should move on next array and render next arrays in new <li></li tag在 JSX/HTML 上,我应该为每个子数组都有一个<li></li>标签,在渲染这个子数组时,在该标签内部渲染数组中的对象,我应该继续下一个数组并渲染下一个数组新的<li></li标签

Problem in my implemntation is cus all sub-arrays are rendered inside of one <li></li> :我的实现中的问题是因为所有子数组都在一个<li></li>内呈现:

renderList = () => {
   return searchHelpers.logicalExamples.map((tagsArray) =>
      tagsArray.map((tag, i) => (
        <li className="label">
          <button>
            <span className="selected">{tag.name}</span>
          </button>
        </li>
      ))
    );
  };

This is object which is used for rendering lists:这是用于渲染列表的对象:

const searchHelpers = {
  logicalExamples: [
    [
      { name: 'TX Group', tagTypeClass: '' },
      { name: 'AND', tagTypeClass: 'operator' },
      { name: 'Latest News', tagTypeClass: 'new-tag' }
    ],
    [
      { name: 'Pochettino', tagTypeClass: '' },
      { name: 'NOT', tagTypeClass: 'operator' },
      { name: 'Mourinho', tagTypeClass: '' }
    ],
    [
      { name: 'Cristobal Huet', tagTypeClass: '' },
      { name: 'OR', tagTypeClass: 'operator' },
      { name: 'Nico Hischier', tagTypeClass: '' }
    ],
    [
      { name: '(', tagTypeClass: 'new-tag' },
      { name: 'Climate Change', tagTypeClass: 'new-tag' },
      { name: ')', tagTypeClass: 'new-tag' }
    ]
  ]
};

So you want each element of logicalExamples to render as an <li> .因此,您希望logicalExamples每个元素都呈现为<li> That looks like this:看起来像这样:

renderList = () => {
   return searchHelpers.logicalExamples.map((tagsArray) =>
      <li className="label">
        // something goes here
      </li>
    );
  };

And for each element of tagsArray you want a <button> :对于tagsArray每个元素,您都需要一个<button>

renderList = () => {
   return searchHelpers.logicalExamples.map((tagsArray) =>
      <li className="label">
        {tagsArray.map((tag, i) => (
          <button>
            <span className="selected">{tag.name}</span>
          </button>
        }
      ))
      </li>
    );
  };

I like to use/create a flatMap function for this kind of scenario.我喜欢为这种场景使用/创建一个flatMap函数。 I believe lodash has one, but it's tiny enough if you don't want to bundle in a library of that magnitude:我相信lodash有一个,但如果你不想捆绑在这么大的库中,它已经足够小了:

function flatMap(items, fn) {
  return items.reduce((result, item, i) => result.concat(fn(item, i)), []);
}

You can use it like this:你可以这样使用它:

renderList = () => flatMap(searchHelpers.logicalExamples, (tagsArray) =>
  tagsArray.map((tag, i) => (
    <li className="label">
      <button>
        <span className="selected">{tag.name}</span>
      </button>
    </li>
  ))
);

Don't forget to add a key , though!不过,不要忘记添加一个key

Update :更新

OK, wasn't clear on what you needed before.好的,之前不清楚你需要什么。 All you'll need to do is:您需要做的就是:

renderList = () => searchHelpers.logicalExamples.map((tagsArray) => (
  <li className="label">
    {tagsArray.map((tag, i) => (
      <button>
        <span className="selected">{tag.name}</span>
      </button>
    ))}
  </li>
));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM