Heim  >  Fragen und Antworten  >  Hauptteil

Behalten Sie reaktionsfähige Flex-Eigenschaften bei, wenn Sie Arrays mithilfe von Handles iterieren

<p>Ich habe den folgenden Code (unter Verwendung von Handlers, Arbeitscode von JSFiddle): </p> <pre class="brush:php;toolbar:false;"><div class="cards-container"> {{#each this.cards}} <div class="card-container container-col-inner col-12 col-md-6 col-lg-3" > <div class="image-card"> <div class="image-content"> <p class="title">{{title}}</p> </div> </div> </div> {{/jede}} </div></pre> <pre class="brush:php;toolbar:false;">{ "3columnLayout": false, "Karten": [ { "Titel": "Karte 1" }, { "Titel": "Karte 2" }, { "Titel": "Karte 3" } ] }</pre> <p>Im Grunde durchläuft es das Karten-Array und erstellt für jedes Element einen <code>card-container</code> Verwenden Sie dann Bootstrap, um jedem Div eine CSS-Klasse zuzuweisen, zum Beispiel <code>col-md-6</code> <ul> <li>Mobil: Elemente werden in einer einzelnen Spalte angezeigt</li> <li>Tabletten: Elemente erscheinen in 2 Spalten</li> <li>Desktop: Elemente werden in 3 Spalten angezeigt</li> </ul> <p>Das alles funktioniert wie erwartet und ergibt optisch die gewünschte Benutzeroberfläche (unabhängig von der Anzahl der Karten): Beispiel unten: </p> <p>Wie im JSON gezeigt, benötige ich jedoch eine Eigenschaft außerhalb der einzelnen Kartenebene, um zu bestimmen, ob der Desktop von einem 4-Spalten-Layout zu einem 3-Spalten-Layout wechseln soll. </p> <p>Ich wollte diese Eigenschaft nicht für jede Karte im Karten-Array wiederholen, also habe ich meinen Code wie in meinem Code-Snippet gezeigt neu organisiert (mithilfe von Handlers): https://jsfiddle.net/stcfa5wh/20/< ; /p> <p>Das bedeutet jetzt jedoch, dass, obwohl ich auf den Wert <code>3columnLayout</code> zugreifen kann, der HTML-Code auf der Seite abgelegt wird und ich <code>col</code> nicht mehr verwenden kann So wie ich es mache. Vorher erledigt. </p> <p>Zum Beispiel könnte ich auf einem Tablet jede <code>image-card</code> auf 50 % Breite einstellen, aber es ignoriert die Notwendigkeit von Zeilen. </p> <p>Kann jemand eine Möglichkeit vorschlagen, die Struktur des HTML beizubehalten und gleichzeitig Attribute der obersten Ebene zu implementieren (z. B. <code>3columnLayout</code>)? </p>
P粉098417223P粉098417223391 Tage vor512

Antworte allen(1)Ich werde antworten

  • P粉309989673

    P粉3099896732023-09-03 15:46:09

    我不明白为什么当您尝试实现 3columnLayout 标志时停止使用 Bootstrap。使用 Bootstrap,我们将在每列上使用类 col-lg-4 来创建 3 列布局。因此,我们每列所需的条件表达式为:{{#if ../3columnLayout}}col-lg-4{{else}}col-lg-3{{/if}}.

    const template = Handlebars.compile(document.getElementById('Template').innerHTML);
    
    const data = {
      "3columnLayout": true,
      "cards": [{
          "title": "Card 1",
        },
        {
          "title": "Card 2",
        },
        {
    
          "title": "Card 3",
    
        },
        {
          "title": "Card 4",
    
        },
        {
          "title": "Card 5",
        },
        {
    
          "title": "Card 6",
        },
        {
          "title": "Card 7",
        },
        {
          "title": "Card 8",
        }
      ]
    }
    
    const output = template(data);
    
    document.getElementById('Output').innerHTML = output;
    .image-card {
      height: 432px;
      background-color: lightblue;
      border: 1px solid;
      margin-bottom: 16px;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/4.7.7/handlebars.min.js"></script>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet"/>
    <script id="Template" type="text/template">
      <div class="container">
        <div class="row">
          {{#each this.cards}}
            <div class="col-md-6 {{#if ../3columnLayout}}col-lg-4{{else}}col-lg-3{{/if}}">
              <div class="image-card">
                <div class="image-content">
                  <p class="title">{{title}}</p>
                </div>
              </div>
            </div>
          {{/each}}
        </div>
      </div>
    </script>
    <div id="Output"></div>

    Antwort
    0
  • StornierenAntwort