【问题标题】:Get information from nested loop to render jsx conditionally从嵌套循环中获取信息以有条件地渲染 jsx
【发布时间】:2019-09-26 18:49:54
【问题描述】:

我有一个对象,我必须在其中循环两次以检查我应该在 react 中渲染什么。

我的尝试:

// categories is my nested object
const checkedCategories = [...categories];

for (let i = 0; i < categories.length; i++){
  for (let j =0; j < categories[i].products.length; j++){
    const currentImageType = categories[i].products[j].imageTypes;

    // get information from action in store(mobx) to check if image exists
    const image = images.getDefault(currImageType);

    if (image) {
      //error cannot add property visible, object is not extensible
      checkedCategories[i].visible = true;
    }
  }
}

const categoryTabs = checkedCategories.map((category, index) => {
  if (category.visible){
    return (
      <Product
          key={category.name}
          product={category.products}
       />
    )
  }
});

我想了解如何解决不可扩展对象的问题并仅渲染具有图像的问题(我从嵌套循环中获得的来自商店的信息)

【问题讨论】:

  • 不清楚您要做什么,但查看您的代码,这似乎不正确:for (let j =0; j &lt; categories[i].products[j].length; j++){。你的意思是for (let j =0; j &lt; categories[i].products.length; j++){
  • 当然可以,但是这个错误有一个问题://error cannot add property visible, object is not extensible

标签: javascript reactjs loops


【解决方案1】:

您的循环中有错误。如果您将循环更改为以下内容,它应该可以工作。下面的代码更简洁,更容易推理。

const checkedCategories = [];
categories.forEach(cat => {
  let isVisible = false;
  cat.products.forEach(product => {
    const image = images.getDefault(product.imageTypes);
    isVisible = isVisible || !!image;

  });
  checkedCategories.push(Object.assign({}, cat, { visible: isVisible });
};

【讨论】:

  • 它更干净,但我得到了同样的错误 //error cannot add property visible, object is not extensible
  • 对不起,是否应该为整个事情使用checkedCategories?从原始问题中不清楚
  • 您是否在某个时候freeze您的对象?您可以创建一个新对象,而不是分配visible
  • 我使用严格模式,我必须使用这种模式,但是如何以这种方式做我想要的?我想用额外的键创建新对象(如果图像存在则可见),然后循环这个新对象以仅在键可见时呈现
  • @DawidKwiatoń 我更新了我的答案以创建一个新对象。
猜你喜欢
  • 1970-01-01
  • 2018-06-30
  • 1970-01-01
  • 2015-05-02
  • 1970-01-01
  • 2021-02-22
  • 2020-10-12
  • 2021-03-23
  • 2015-05-16
相关资源
最近更新 更多