【问题标题】:Array not rending correctly into a list数组未正确呈现到列表中
【发布时间】:2021-08-31 18:36:27
【问题描述】:

我有一个要传递给子组件的数组,我希望所有数组元素都呈现在一个列表中。并不复杂,我已经做过很多次了,只是这次我无法让它按照我想要的方式格式化。

在我的父母中,我正在过滤我状态中的一组对象,并返回我想要的对象:

state = {
    activeTab: 0,
    tabs: [
      {
        id: 0,
        icon: <AiFillShopping />,
        label: 'Groceries',
        content: ['grocery list', 'test']
      }, 
      {
        id: 1,
        icon: <FaSchool />,
        label: 'School',
        content: ['school list', 'test']
      }
    ],
    value: '',
  }
let filteredContent = this.state.tabs.filter((tab, index) => {
      if(index === this.state.activeTab) {
        return tab;
      }
    })
console.log(filteredContent) // logs {id: 0, label: "Groceries", content: Array(2)}

然后我将过滤的内容传递给我的孩子,然后在我的孩子身上,我通过道具进行映射以获取内容并将项目作为列表列出:

<ul>
   {this.props.content.map(content=> <li>{content.content}</li>)}
</ul>

但它作为一个列表项出现,所有元素都在一行中,如下所示: “杂货清单测试”

我确定我只是做了一些愚蠢的事情,但我已经盯着它看了很长时间,我可以用另一双眼睛。

【问题讨论】:

  • 渲染函数前this.props.content的内容是什么?这是你所期望的,还是不同的?
  • @A_A 不是没有区别,是一样的。它记录 {id: 0, label: "Groceries", content: Array(2)}
  • @Sphinx 它并没有真正显示
  • 标签,而是呈现为购物清单测试。

标签: javascript arrays reactjs


【解决方案1】:

由于content.content 是一个可渲染内容数组,即字符串,它由 React 为您连接并渲染。

您需要先展平嵌套的 content 数组,然后将它们映射到 JSX。

<ul>
  {content
    .flatMap((content) => content.content)
    .map((content) => (
      <li key={content}>{content}</li>
    ))}
</ul>

function App() {
  const content = [
    {
      id: 0,
      // icon: <AiFillShopping />,
      label: "Groceries",
      content: ["grocery list", "test"]
    },
    {
      id: 1,
      // icon: <FaSchool />,
      label: "School",
      content: ["school list", "test"]
    }
  ];
  return (
    <div className="App">
      <ul>
        {content
          .flatMap((content) => content.content)
          .map((content) => (
            <li key={content}>{content}</li>
          ))}
      </ul>
    </div>
  );
}

const rootElement = document.getElementById("root");
ReactDOM.render(
  <App />,
  rootElement
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="root" />

如果您碰巧只想要一个逗号分隔的内容列表,他们会加入内容数组。

<ul>
  {content.map((content) => (
    <li key={content}>{content.content.join(", ")}</li>
  ))}
</ul>

过滤注意事项

Array.prototype.filter 回调返回一个布尔值,不是结果数组中你想要的元素。您的过滤器代码仅在“意外”下起作用,因为返回 tab 被强制为真实值,并且当索引不匹配时,您将隐式返回 undefined ,这是一个虚假值。您应该只返回条件的结果。

const filteredContent = this.state.tabs.filter(
  (tab, index) => index === this.state.activeTab
);

由于您正在过滤选项卡数组并(大概)呈现它们,那么您可能不想使用数组索引,因为它与任何选项卡本质上都没有关联。使用 tab.id 并存储一个活动标签 ID 是更好的选择,因为 id 与数组中的任何相对位置无关,每个标签对象始终相同。

【讨论】:

  • 哦,太好了,这解决了我的问题!感谢您提供有关过滤的说明,我会确保应用它
猜你喜欢
相关资源
最近更新 更多
热门标签