Heim >Web-Frontend >Front-End-Fragen und Antworten >Was ist der Unterschied zwischen v-if und v-for in vue

Was ist der Unterschied zwischen v-if und v-for in vue

青灯夜游
青灯夜游Original
2022-12-27 18:48:333170Durchsuche

Der Unterschied zwischen v-if und v-for: 1. Verschiedene Funktionen Die v-if-Anweisung wird zum bedingten Rendern eines Inhalts verwendet. Dieser Inhalt wird nur dann gerendert, wenn der Ausdruck der Anweisung „true“ zurückgibt value; while v Die -for-Direktive rendert eine Liste basierend auf einem Array. 2. Die Prioritäten sind unterschiedlich. V-for hat eine höhere Priorität als v-if. Bei der Beurteilung wird v-for vor v-if beurteilt.

Was ist der Unterschied zwischen v-if und v-for in vue

Die Betriebsumgebung dieses Tutorials: Windows7-System, Vue3-Version, DELL G3-Computer.

Zuallererst wird in der offiziellen Dokumentation klar angegeben, dass die gemeinsame Verwendung von v-for und v-if nicht empfohlen wird.

1. Die Rolle von v-if und v-for

Die v-if-Anweisung wird zum bedingten Rendern eines Inhalts verwendet. Dieser Inhalt wird nur gerendert , wenn der Ausdruck des Befehls einen wahren Wert zurückgibt. Die

v-for-Direktive rendert eine Liste basierend auf einem Array. Die v-for-Direktive erfordert eine spezielle Syntax der Form item in items, wobei „items“ das Quelldatenarray oder -objekt und „item“ der Alias ​​des zu iterierenden Array-Elements ist.

In v-for Es wird empfohlen, den Schlüsselwert festzulegen und sicherzustellen, dass jeder Schlüsselwert eindeutig ist, was die Optimierung des Diff-Algorithmus erleichtert.

Der Unterschied in der Verwendung zwischen den beiden ist wie folgt:

<div v-if="isShow" >123</div>
  
<li v-for="item in items" :key="item.id">
  {{ item.label }}
</li>

2 Die Priorität der beiden

Bei der Verwendung hat v-for eine höhere Priorität als v-if

v-if und v-for sind alle Anweisungen im Vue-Vorlagensystem

Wenn die Vue-Vorlage kompiliert ist, wird das Anweisungssystem in eine ausführbare Renderfunktion umgewandelt

Beispiel
Schreiben Sie ein p-Tag und verwenden Sie v-if und v-for at Gleichzeitig

<div id="app">
  <p v-if="isShow" v-for="item in items">
    {{ item.title }}
  </p>
</div>

Erstellen Sie eine Vue-Instanz und speichern Sie isShow- und Elementdaten

const app = new Vue({
 el: "#app",
 data() {
  return {
   items: [
    { title: "foo" },
    { title: "baz" }]
  }
 },
 computed: {
  isShow() {
   return this.items && this.items.length > 0
  }
 }
})

Der Code der Vorlagenanweisung wird in der Renderfunktion generiert. Die Rendering-Funktion kann über app.$options.render

ƒ anonymous() {
 with (this) { return
  _c(&#39;div&#39;, { attrs: { "id": "app" } }, 
  _l((items), function (item) { return (isShow) ? _c(&#39;p&#39;, [_v("\n" + _s(item.title) + "\n")]) : _e() }), 0) }
}

_l abgerufen werden ist die Listenwiedergabefunktion von vue. Innerhalb der Funktion wird eine if-Beurteilung durchgeführt
und eine vorläufige Schlussfolgerung gezogen: v-for hat eine höhere Priorität als v-if

Dann werden v-for und v-if unterschiedlich platziert Etiketten

<div id="app">
  <template v-if="isShow">
    <p v-for="item in items">{{item.title}}</p>
  </template>
</div>

Dann geben Sie die Renderfunktion aus

ƒ anonymous() {
 with(this){return
  _c(&#39;div&#39;,{attrs:{"id":"app"}},
  [(isShow)?[_v("\n"),
  _l((items),function(item){return _c(&#39;p&#39;,[_v(_s(item.title))])})]:_e()],2)}
}

Zu diesem Zeitpunkt können wir sehen, dass v-for und v-if, wenn sie auf verschiedene Tags wirken, zuerst beurteilt und dann in der Liste gerendert werden

Lassen Sie uns den Vue-Quellcode überprüfen
Quellcode-Speicherort: vue-devsrccompilercodegenindex.js

export function genElement (el: ASTElement, state: CodegenState): string {
 if (el.parent) {
  el.pre = el.pre || el.parent.pre
 }
 if (el.staticRoot && !el.staticProcessed) {
  return genStatic(el, state)
 } else if (el.once && !el.onceProcessed) {
  return genOnce(el, state)
 } else if (el.for && !el.forProcessed) {
  return genFor(el, state)
 } else if (el.if && !el.ifProcessed) {
  return genIf(el, state)
 } else if (el.tag === &#39;template&#39; && !el.slotTarget && !state.pre) {
  return genChildren(el, state) || &#39;void 0&#39;
 } else if (el.tag === &#39;slot&#39;) {
  return genSlot(el, state)
 } else {
  // component or element
  ...
}

Bei der Beurteilung von „if“ wird „v-for“ vor „v-if“ beurteilt. Das endgültige Ergebnis der Beurteilung ist, dass „v-for“ eine höhere Priorität hat als „v-if“. if und v-for werden gleichzeitig für dasselbe Element verwendet, was zu einer Leistungsverschwendung führt (jedes Rendering führt zuerst eine Schleife durch und führt dann eine bedingte Beurteilung durch).

Wenn Sie diese Situation vermeiden, verschachteln Sie die Vorlage (Seite) in Beim Rendern der äußeren Ebene werden keine Dom-Knoten generiert. Die v-if-Beurteilung wird auf dieser Ebene durchgeführt, und dann wird die v-for-Schleife intern ausgeführt

<template v-if="isShow">
  <p v-for="item in items">
</template>

Wenn die Bedingung innerhalb der Schleife erscheint, können die Elemente, die nicht angezeigt werden müssen, angezeigt werden durch das berechnete Attribut im Voraus herausgefiltert werden.
computed: {
  items: function() {
   return this.list.filter(function (item) {
    return item.isShow
   })
  }
}
. Fallbeschreibung: Verwenden Sie beispielsweise v-for auf der Seite. Durchlaufen Sie 100 Li-Tags, zeigen Sie jedoch nur den Inhalt des Li-Tags mit Index = 97 an und blenden Sie den Rest aus. Selbst wenn in 100 Listen nur ein Datenelement verwendet werden muss, wird das gesamte Array durchlaufen.
 ff6d136ddc5fdfeffaf53ff6ee95f185
    04a018f18083b7a83936d439c5c53c8b{{item.name}}bed06894275b65c1ab86501b08a632eb
 929d1f5ca49e04fdcb27f9465b944689

Lösung: Verwenden Sie berechnetes

<ul>
    <li v-for="item in activeList">{{item.name}}</li>
</ul>

computed: {
  activeList() {
    return this.list.filter(val => {
      return val.actived;
    });
  }
},

[Verwandte Empfehlungen:

vuejs-Video-Tutorial

,

Web-Front-End-Entwicklung

]

Das obige ist der detaillierte Inhalt vonWas ist der Unterschied zwischen v-if und v-for in vue. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn