Javascript - 循环创建卡片列表

Posted

技术标签:

【中文标题】Javascript - 循环创建卡片列表【英文标题】:Javascript - loop to create list of cards 【发布时间】:2021-07-28 11:42:09 【问题描述】:

html 和简单的 JS(没有 react/vue)。 我需要做一个卡片列表,并想做一个循环以避免重复 html。

我当前的代码:

<div id="products-cards-container">
    <div class="products-cards">              
        <div class="product-header">
            <img src="../assets/img/image1.png"/>
        </div>
        <div class="product-content">
            <h4>title 1</h4>
            <p>super content 1</p>
        </div> 
        <button class="info-button">+ info</button>
    </div>
    <div>
        <div class="product-header">
            <img src="../assets/img/cards/products/image2.png"/>
        </div>
        <div class="product-content">
            <h4>title 2</h4>
            <p>super content 2</p>
        </div> 
        <button class="info-button">+ info</button>
    </div>
    <div>
        <div class="product-header">
            <img src="../assets/img/cards/products/image-3.png"/>
        </div>
        <div class="product-content">
            <h4>title 3</h4>
            <p>blablablablbalbalbabla blablaba</p>
        </div> 
        <button class="info-button">+ info</button>
    </div>\
</div>

我正在尝试返回 html

script.js

const valuesCards = [
     
    image: '../img/image1.png', 
    title: 'title 1', 
    content: 'super content 1',
    ,
    
    image: '../img/image2.png', 
    title: 'title 2', 
    content: 'super content 2'
    ,
     
    image: '../img/image-3.png', 
    title: 'title3', 
    content: 'blablablablbalbalbabla blablaba'
    ,
   ]

创建一个在 .products-cards div 中插入卡片列表的函数:

    function returnCards() => 
    ----- AND HERE I AM STUCK
   (as well, all tries I did with a simple array / object returned only the last info) ----
    

【问题讨论】:

【参考方案1】:

您需要执行一个“for 循环”来迭代您的 valuesCards 对象,并为每个值返回一个 html 模板并注入到 DOM 中所需的元素中。

例如:

    // Define the object
    const valuesCards = [
      
        'image': '../img/image1.png',
        'title': 'title 1',
        'content': 'super content 1',
      ,
      
        'image': '../img/image2.png',
        'title': 'title 2',
        'content': 'super content 2'
      ,
      
        'image': '../img/image-3.png',
        'title': 'title3',
        'content': 'blablablablbalbalbabla blablaba'
      
    ]
    
    // Identify the DOM element to store cards
    cardsContainer = document.querySelector('#products-cards-container');
    
    // Create a loop that iterates over valuesCards object
    for (let value of Object.values(valuesCards)) 
      console.log(value.title);
        // Create an element to store new card content
        let newCard = document.createElement('DIV');
    
        // Add products-cards class to new element
        newCard.classList.add('products-cards');
    
        // Create a multiline string template with current values each time 
        cardHtml = `
           <div class="">              
            <div class="product-header">
                <img src="$value.image"/>
            </div>
            <div class="product-content">
                <h4>$value.title</h4>
                <p>$value.content</p>
            </div> 
            <button class="info-button">+ info</button>
           </div>   
        `;
    
        // Append the new element to the cardsContainer element in DOM
        cardsContainer.appendChild(newCard);
    
        // Inject the template html on DOM's new append item
        newCard.innerHTML = cardHtml;
    
    

重要!!在要打印卡片的 html 中创建一个 id="products-cards-container" 的 div 元素。

【讨论】:

Todavia no aparece nada。 el documento donde pongo tu codigo se llama cards-content.js y no hay nada más que este codigo que me has dado。 De momento importo así en mi documento html : 。测验重要吗? 我对我的代码进行了一些更改并在本地进行了测试。现在它应该可以工作了。 .【参考方案2】:

你可以这样做

const valuesCards = [
     
    image: '../img/image1.png', 
    title: 'title 1', 
    content: 'super content 1',
    ,
    
    image: '../img/image2.png', 
    title: 'title 2', 
    content: 'super content 2'
    ,
     
    image: '../img/image-3.png', 
    title: 'title3', 
    content: 'blablablablbalbalbabla blablaba'
    ,
   ];
   
   let cardHTML = '';
   valuesCards.map(element => 
        cardHTML += '<div> \
        <div class="product-header"> \
         <img src="'+element.image+'"/> \
        </div> \
        <div class="product-content"> \
           <h4>'+element.title+'</h4> \
         <p>'+element.content+'</p> \
        </div> \
        <button class="info-button">+ info</button> \
      </div> \
      ';
   );
   
document.getElementsByClassName('products-cards')[0].innerHTML = cardHTML;
 <div id="products-cards-container">
       <div class="products-cards"> 
         
       </div>
</div>

【讨论】:

【参考方案3】:

使用Array.prototype.map 函数和模板文字。

const container = document.getElementById('products-cards-container');
const valuesCards = [
    image: '../img/image1.png',
    title: 'title 1',
    content: 'super content 1',
  ,
  
    image: '../img/image2.png',
    title: 'title 2',
    content: 'super content 2'
  ,
  
    image: '../img/image-3.png',
    title: 'title3',
    content: 'blablablablbalbalbabla blablaba'
  ,
]

function returnCards(valuesCards) 
  return "<div class=\"products-cards\">" + valuesCards.map(valuesCard => `
  <div>
    <div class="product-header">
      <img src="$valuesCard.image"/>
    </div>
    <div class="product-content">
      <h4>$valuesCard.title</h4>
      <p>$valuesCard.content</p>
    </div> 
    <button class="info-button">+ info</button>
  </div>`).join('') + "</div>";


container.innerHTML = returnCards(valuesCards);
&lt;div id="products-cards-container"&gt;&lt;/div&gt;

【讨论】:

【参考方案4】:

const valuesCards = [
     
    image: '../img/image1.png', 
    title: 'title 1', 
    content: 'super content 1',
    ,
    
    image: '../img/image2.png', 
    title: 'title 2', 
    content: 'super content 2'
    ,
     
    image: '../img/image-3.png', 
    title: 'title3', 
    content: 'blablablablbalbalbabla blablaba'
    ,
   ]
valuesCards.map(card=> 
  var cardDiv = document.createElement('div');
  cardDiv.innerHTML = `
                <div class="product-header">
                  <img src="$card.image"/>
                </div>
                <div class="product-content">
                  <h4>$card.title</h4>
                  <p>$card.content</p>
                </div> 
                <button class="info-button">+ info</button>`
  document.getElementsByClassName('products-cards')[0].appendChild(cardDiv);
)
<div id="products-cards-container">
       <div class="products-cards">  
          </div>
</div>

【讨论】:

以上是关于Javascript - 循环创建卡片列表的主要内容,如果未能解决你的问题,请参考以下文章

当卡片数据由循环提供时,如何从物化(css)卡片制作多项目轮播?

在 MVC 项目中使用 JavaScript 调用控制器函数

我想创建一个循环来创建 10 个不同的字符串并使用该字符串显示 10 个不同的卡片

我用 api 的 listview.builder 创建了一个卡片列表。现在我想在点击一张卡片时更改墨水池点击中的卡片颜色

使用JS动态创建国家下拉列表[重复]

使用带有 JavaScript 的 for 循环时,将新列表项添加到 <ul> 项 [重复]