Heim Web-Frontend Front-End-Fragen und Antworten Warum sind Daten in der Vue-Komponente eine Funktion?

Warum sind Daten in der Vue-Komponente eine Funktion?

Dec 01, 2022 pm 07:46 PM
vue vue3

Grund: Um zu verhindern, dass mehrere Komponenteninstanzobjekte dieselben Daten teilen und eine Datenverschmutzung in Form einer Funktion verursachen, wird bei Verwendung von initData als Factory-Funktion ein neues Datenobjekt zurückgegeben. Wenn die Daten in der Komponente als Funktion geschrieben werden, werden die Daten in Form eines Funktionsrückgabewerts definiert, sodass bei jeder Wiederverwendung der Komponente neue Daten mit einem eigenen Bereich zurückgegeben werden, ähnlich wie beim Erstellen privater Daten für jede Komponenteninstanz Der Datenraum ermöglicht es jeder Komponenteninstanz, ihre eigenen Daten zu verwalten.

Warum sind Daten in der Vue-Komponente eine Funktion?

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

1. Der Unterschied zwischen Instanz- und Komponentendefinition von Daten

Bei der Definition einer Vue-Instanz kann das Datenattribut entweder ein Objekt oder eine Funktion sein

const app = new Vue({
    el:"#app",
    // 对象格式
    data:{
        foo:"foo"
    },
    // 函数格式
    data(){
        return {
             foo:"foo"
        }
    }
})
Nach dem Login kopieren

Das in einer Komponente definierte Datenattribut kann nur ein sein Funktion

Wenn die Komponentendaten direkt als Objekt definiert sind

Vue.component('component1',{
    template:`<div>组件</div>`,
    data:{
        foo:"foo"
    }})
Nach dem Login kopieren

, erhalten Sie eine Warnmeldung

Warum sind Daten in der Vue-Komponente eine Funktion?

Warnhinweis: Die zurückgegebenen Daten sollten in jeder Komponenteninstanz eine Funktion sein

2. Komponentendaten Definitionsfunktion und Der Unterschied zwischen Objekten

Oben wurde erwähnt, dass Komponentendaten eine Funktion sein müssen. Ich frage mich, ob Sie jemals darüber nachgedacht haben, warum das so ist.

Wenn wir eine Komponente definieren, bildet Vue schließlich eine Komponenteninstanz über Vue.extend()

Hier imitieren wir den Komponentenkonstruktor, definieren das Datenattribut und verwenden die Form eines Objekts

function Component(){
 
}
Component.prototype.data = {
	count : 0
}
Nach dem Login kopieren

Erstellen Sie zwei Komponenteninstanzen

const componentA = new Component()
const componentB = new Component()
Nach dem Login kopieren

Ändern Sie den Wert des Datenattributs der Komponente Komponente A, und der Wert in Komponente B ändert sich ebenfalls.

console.log(componentB.data.count)  // 0
componentA.data.count = 1
console.log(componentB.data.count)  // 1
Nach dem Login kopieren

Der Grund dafür ist, dass beide dieselbe Speicheradresse haben und der von Komponente A geänderte Inhalt sich auch auf Komponente B auswirkt. [Freigabe von Lernvideos: vue-Video-Tutorial, Web-Front-End-Video]

Wenn wir die Form einer Funktion verwenden, tritt diese Situation nicht auf (die Speicheradresse des von der Funktion zurückgegebenen Objekts ist nicht dieselbe )

function Component(){
this.data = this.data()
}
Component.prototype.data = function (){
    return {
   count : 0
    }
}
Nach dem Login kopieren

Ändern Sie den Wert des Datenattributs der Komponente A, der Wert in Komponente B ist nicht betroffen

console.log(componentB.data.count)  // 0
componentA.data.count = 1
console.log(componentB.data.count)  // 0
Nach dem Login kopieren

Die Vue-Komponente kann viele Instanzen haben, und die Funktion wird verwendet, um ein neues Datenformular zurückzugeben, sodass die Daten von Jedes Instanzobjekt wird nicht durch die Daten anderer Instanzobjekte verunreinigt

Speicherort des Quellcodes: /vue-dev/src/core/instance/state .js

function initData (vm: Component) {
  let data = vm.$options.data
  data = vm._data = typeof data === &#39;function&#39;
    ? getData(data, vm)
    : data || {}
    ...
}
Nach dem Login kopieren
Daten können sowohl Objekt als auch Funktion sein, warum erscheint also die obige Warnung? Keine Sorge, lesen Sie unten weiter

Wenn die Komponente erstellt wird, werden die Optionen zusammengeführt

Speicherort des Quellcodes: /vue-dev/src/core/util/options.js /vue-dev/src/core/instance/state.js

Vue.prototype._init = function (options?: Object) {
    ...
    // merge options
    if (options && options._isComponent) {
      // optimize internal component instantiation
      // since dynamic options merging is pretty slow, and none of the
      // internal component options needs special treatment.
      initInternalComponent(vm, options)
    } else {
      vm.$options = mergeOptions(
        resolveConstructorOptions(vm.constructor),
        options || {},
        vm
      )
    }
    ...
  }
Nach dem Login kopieren

data既能是object也能是function,那为什么还会出现上文警告呢?

别急,继续看下文

组件在创建的时候,会进行选项的合并

源码位置:/vue-dev/src/core/util/options.js

自定义组件会进入mergeOptions进行选项合并

strats.data = function (
  parentVal: any,
  childVal: any,
  vm?: Component
): ?Function {
  if (!vm) {
    if (childVal && typeof childVal !== "function") {
      process.env.NODE_ENV !== "production" &&
        warn(
          &#39;The "data" option should be a function &#39; +
            "that returns a per-instance value in component " +
            "definitions.",
          vm
        );
      return parentVal;
    }
    return mergeDataOrFn(parentVal, childVal);
  }
  return mergeDataOrFn(parentVal, childVal, vm);
};
Nach dem Login kopieren

定义data会进行数据校验

源码位置:/vue-dev/src/core/instance/init.js

Da beim Definieren von Komponenten mergeOptions für das Zusammenführen von Optionen eingegeben werden

rrreee

Daten definieren führt eine Datenüberprüfung durch

Speicherort des Quellcodes: /vue-dev/src/core/instance/init.jsDies Wenn die VM-Instanz undefiniert ist, geben Sie die if-Beurteilung ein. Wenn der Datentyp keine Funktion ist, wird eine Warnung angezeigt. Die Stamminstanz ist ein Singleton. Es tritt keine Datenverschmutzung auf. Komponenteninstanzobjektdaten müssen eine Funktion sein. Der Zweck besteht darin, zu verhindern, dass mehrere Komponenteninstanzobjekte dieselben Daten teilen und Datenverschmutzung verursachen. Wenn initData als Factory-Funktion verwendet wird, wird ein neues Datenobjekt zurückgegeben. Hinweis:

Die Komponenten in Vue werden zur Wiederverwendung verwendet, um eine Wiederverwendung von Daten zu verhindern. Sie werden als Funktionen definiert.

Die Daten in der Vue-Komponente sollten voneinander isoliert sein und sich nicht gegenseitig beeinflussen. Bei jeder Wiederverwendung der Komponente sollten die Datendaten einmal kopiert werden Wenn die Komponente kopiert wird, sind die Daten anderer wiederverwendeter lokaler Komponenten nicht betroffen. Daher müssen Sie über die Datenfunktion ein Objekt als Status der Komponente zurückgeben.

  • Wenn wir die Daten in die Komponente als Funktion schreiben, werden die Daten in Form eines Funktionsrückgabewerts definiert, sodass bei jeder Wiederverwendung der Komponente neue Daten mit einem eigenen Gültigkeitsbereich zurückgegeben werden, ähnlich wie bei Durch Angabe jeder Komponenteninstanz wird ein privater Datenraum erstellt, sodass jede Komponenteninstanz ihre eigenen Daten verwalten kann.

  • Wenn das Datum unserer Komponente einfach in Objektform geschrieben wird, verwenden diese Instanzen denselben Konstruktor. Aufgrund der Eigenschaften von JavaScript teilen alle Komponenteninstanzen dieselben Daten, was zu einer Änderung und allen Änderungen führt.

(Teilen von Lernvideos: Web-Frontend-Entwicklung, Grundlegendes Programmiervideo)

Das obige ist der detaillierte Inhalt vonWarum sind Daten in der Vue-Komponente eine Funktion?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

So verwenden Sie Bootstrap in Vue So verwenden Sie Bootstrap in Vue Apr 07, 2025 pm 11:33 PM

Die Verwendung von Bootstrap in Vue.js ist in fünf Schritte unterteilt: Startstrap installieren. Bootstrap in main.js. Verwenden Sie die Bootstrap -Komponente direkt in der Vorlage. Optional: benutzerdefinierter Stil. Optional: Verwenden Sie Plug-Ins.

So fügen Sie Funktionen zu Schaltflächen für Vue hinzu So fügen Sie Funktionen zu Schaltflächen für Vue hinzu Apr 08, 2025 am 08:51 AM

Sie können der VUE -Taste eine Funktion hinzufügen, indem Sie die Taste in der HTML -Vorlage an eine Methode binden. Definieren Sie die Methode und schreiben Sie die Funktionslogik in der VUE -Instanz.

So verweisen Sie auf die JS -Datei mit Vue.js So verweisen Sie auf die JS -Datei mit Vue.js Apr 07, 2025 pm 11:27 PM

Es gibt drei Möglichkeiten, sich auf JS -Dateien in Vue.js zu beziehen: Geben Sie den Pfad direkt mit dem & lt; Skript & gt an. Etikett;; Dynamischer Import mit dem montierten () Lebenszyklushaken; und importieren über die Vuex State Management Library.

So verwenden Sie Watch in Vue So verwenden Sie Watch in Vue Apr 07, 2025 pm 11:36 PM

Mit der Watch -Option in Vue.js können Entwickler auf Änderungen in bestimmten Daten anhören. Wenn sich die Daten ändert, löst sich eine Rückruffunktion aus, um Aktualisierungsansichten oder andere Aufgaben auszuführen. Zu den Konfigurationsoptionen gehören unmittelbar, die festlegen, ob ein Rückruf sofort ausgeführt werden soll, und Deep, das feststellt, ob Änderungen an Objekten oder Arrays rekursiv anhören sollen.

Was bedeutet VUE Multi-Page-Entwicklung? Was bedeutet VUE Multi-Page-Entwicklung? Apr 07, 2025 pm 11:57 PM

VUE Multi-Page-Entwicklung ist eine Möglichkeit, Anwendungen mithilfe des Vue.js-Frameworks zu erstellen, in dem die Anwendung in separate Seiten unterteilt ist: Code-Wartung: Die Aufteilung der Anwendung in mehrere Seiten kann das Verwalten und Wartungsbereich erleichtern. Modularität: Jede Seite kann als separates Modul für eine einfache Wiederverwendung und den Austausch verwendet werden. Einfaches Routing: Die Navigation zwischen Seiten kann durch einfache Routing -Konfiguration verwaltet werden. SEO -Optimierung: Jede Seite hat eine eigene URL, die SEO hilft.

So kehren Sie von Vue zur vorherigen Seite zurück So kehren Sie von Vue zur vorherigen Seite zurück Apr 07, 2025 pm 11:30 PM

VUE.JS hat vier Methoden, um zur vorherigen Seite zurückzukehren: $ router.go (-1) $ router.back () verwendet & lt; Router-Link to = & quot;/& quot; Komponentenfenster.history.back () und die Methodenauswahl hängt von der Szene ab.

So verwenden Sie Vue Traversal So verwenden Sie Vue Traversal Apr 07, 2025 pm 11:48 PM

Es gibt drei gängige Methoden für Vue.js, um Arrays und Objekte zu durchqueren: Die V-für-Anweisung wird verwendet, um jedes Element zu durchqueren und Vorlagen zu rendern; Die V-Bind-Anweisung kann mit V-für dynamisch Attributwerte für jedes Element verwendet werden. und die .MAP -Methode kann Array -Elemente in Neuarrays umwandeln.

Wie man einen Tag zum Vue springt Wie man einen Tag zum Vue springt Apr 08, 2025 am 09:24 AM

Zu den Methoden zum Implementieren des Sprung eines Tags in VUE gehören: Verwenden des A -Tags in der HTML -Vorlage, um das HREF -Attribut anzugeben. Verwenden Sie die Router-Link-Komponente des Vue-Routings. Verwenden Sie dies. $ Router.push () Methode in JavaScript. Parameter können durch den Abfrageparameter weitergeleitet werden, und Routen sind in den Routeroptionen für dynamische Sprünge konfiguriert.

See all articles