【问题标题】:How to display looped elements in html如何在html中显示循环元素
【发布时间】:2021-08-31 07:04:32
【问题描述】:

使用查询字符串 URLSearchparams 并将我的 fetch 请求合并到 Promise.all 方法中,我的代码现在能够在 console.log 中打印我想要的元素。但是,我很难让这些信息显示在 html 中。它在屏幕上返回“未定义”,但 console.log 显示正确的数据。缺少什么?

async function loadData() {
  const queryStr_id = window.location.search;
  console.log(queryStr_id);

  const product = new URLSearchParams(queryStr_id);
  console.log(product);

  const id = product.get("_id");
  console.log(id);

  try {
    const url_teddies = "http://localhost:3000/api/teddies/" + id;
    const url_cameras = "http://localhost:3000/api/cameras/" + id;
    const url_furniture = "http://localhost:3000/api/furniture/" + id;

    const results = await Promise.all([fetch(url_teddies), fetch(url_cameras), fetch(url_furniture)]);
    const dataPromises = results.map((result) => result.json());
    const finalData = await Promise.all(dataPromises);
    console.log(finalData);



    for (i = 0; i < finalData.length; i++) {
      const prodImg = finalData[i].imageUrl;
      const prodName = finalData[i].name;
      const prodPrice = finalData[i].price / 100 + " Eur";
      const prodDesc = finalData[i].description;
      const coloris = finalData[i].colors;
      const lenses = finalData[i].lenses;
      const varnish = finalData[i].varnish;
      console.log(prodImg);
      console.log(prodName);
      console.log(prodPrice);
      console.log(prodDesc);
      console.log(coloris);
      console.log(lenses);
      console.log(varnish);

      const productDetails = `
        <div class="produit__card__wrapper">
            <div class="produit__card__content">
                <img src="${finalData[i].imageUrl}" alt="${finalData[i].name}" class="productImg"></img>
              <div class="container_text">
                    <h1 class="name"><span>${finalData[i].name}</span></h1>
                    <p class="price"><strong>Price : </strong><span>${finalData[i].price / 100 + " €"}</span></p>
                    <p class="description"><strong>Description : </strong><span>${finalData[i].description}</span></p>
                <form>
                    <label for="product_color"></label>
                    <select name="product_color" id="product_color">
                    </select>
                </form>
                    <button id="addToCart" type="submit " name="addToCart">Ajouter au panier</button>
              </div>
            </div>
        </div>
            `;

    const container = document.querySelector(".container");
    container.innerHTML = productDetails;
    }

    return finalData;
  } catch (err) {
    console.log(err);
  }


}
loadData()

【问题讨论】:

  • 考虑使用document.createElement 和各种元素方法构建元素树,而不是设置innerHTML
  • 并且当在循环中创建像&lt;select&gt; 这样的表单元素时,不要将它们的id 设置为非唯一值以添加标签。相反,您可以将选择元素包装在标签元素中以链接它们
  • 感谢@DustInCompetent

标签: es6-promise innerhtml fetch-api


【解决方案1】:

我认为您只是忘记在将三个承诺的数组分配给finalData 之前将它们展平。试试

const finalData = (await Promise.all(dataPromises)).reduce((data, arr) => data.concat(arr), []);

【讨论】:

  • 我是 Js 新手。我需要一两个小时来理解这个 flat() 方法。现在查找。
  • 调查了一下。看起来没有必要。 Flatten 似乎与我的数组/对象不对应..
  • 你确定吗?您将dataPromises(包含三个承诺的数组)传递给await Promise.all()。这将返回一个长度为 3 的数组,其中每个元素都是获取的 JSON 对象/数组之一。
猜你喜欢
  • 2018-02-08
  • 2015-11-29
  • 2019-07-26
  • 2019-08-27
  • 2021-12-04
  • 1970-01-01
  • 2019-12-15
  • 1970-01-01
  • 2021-12-05
相关资源
最近更新 更多