Heim Web-Frontend js-Tutorial Verwenden Sie ES6-Klassen, um Vue zu imitieren und ein Beispiel für eine bidirektionale Bindung zu schreiben

Verwenden Sie ES6-Klassen, um Vue zu imitieren und ein Beispiel für eine bidirektionale Bindung zu schreiben

Jun 30, 2018 pm 05:21 PM
class es6 双向绑定 绑定

In diesem Artikel wird hauptsächlich die Verwendung von ES6-Klassen zum Nachahmen von Vue beschrieben, um einen Beispielcode für die Zwei-Wege-Bindung zu schreiben. Ich werde ihn jetzt als Referenz verwenden.

In diesem Artikel wird erläutert, wie Sie mithilfe von ES6-Klassen Vue nachahmen, um einen Beispielcode für die bidirektionale Bindung zu schreiben und ihn mit allen zu teilen. Die Details sind wie folgt:

Der endgültige Effekt lautet wie folgt:

Konstruktor (Konstruktor)

Konstruiert ein TinyVue-Objekt, einschließlich grundlegender Elemente, Daten und Methoden

class TinyVue{
 constructor({el, data, methods}){
  this.$data = data
  this.$el = document.querySelector(el)
  this.$methods = methods
  // 初始化
  this._compile()
  this._updater()
  this._watcher()
 }
}
Nach dem Login kopieren

Compiler (kompilieren)

wird verwendet, um das Klickereignis @click des V-Modells und des an das Eingabefeld gebundenen Elements zu analysieren und abzulegen. Down-Box.

Erstellen Sie zunächst eine Funktion zum Laden des Ereignisses:

// el为元素tagName,attr为元素属性(v-model,@click)
_initEvents(el, attr, callBack) {
 this.$el.querySelectorAll(el).forEach(i => {
  if(i.hasAttribute(attr)) {
   let key = i.getAttribute(attr)
   callBack(i, key)
  }
 })
}
Nach dem Login kopieren

Eingabefeldereignis laden

this._initEvents('input, textarea', 'v-model', (i, key) => {
 i.addEventListener('input', () => {
  Object.assign(this.$data, {[key]: i.value})
 })
})
Nach dem Login kopieren

Auswahlfeldereignis laden

this._initEvents('select', 'v-model', (i, key) => {
 i.addEventListener('change', () => Object.assign(this.$data, {[key]: i.options[i.options.selectedIndex].value}))
})
Nach dem Login kopieren

Klickereignis laden

Das Klickereignis entspricht dem Ereignis in Methoden

this._initEvents('*', '@click', (i, key) => {
 i.addEventListener('click', () => this.$methods[key].bind(this.$data)())
})
Nach dem Login kopieren

Updater anzeigen (Updater)

Auf die gleiche Weise, Erstellen Sie zunächst eine öffentliche Funktion, um die Ansichten in verschiedenen Elementen zu verarbeiten, einschließlich des Werts von input und textarea, des Auswahlwerts von select, p's innerHTML

_initView(el, attr, callBack) {
 this.$el.querySelectorAll(el, attr, callBack).forEach(i => {
  if(i.hasAttribute(attr)) {
   let key = i.getAttribute(attr),
    data = this.$data[key]
   callBack(i, key, data)
  }
 })
}
Nach dem Login kopieren

Eingabefeldansicht aktualisieren

this._initView('input, textarea', 'v-model', (i, key, data) => {
 i.value = data
})
Nach dem Login kopieren

Auswahlfeld aktualisieren Ansicht

this._initView('select', 'v-model', (i, key, data) => {
 i.querySelectorAll('option').forEach(v => {
  if(v.value == data) v.setAttribute('selected', true)
  else v.removeAttribute('selected')
 })
})
Nach dem Login kopieren

InnerHTML aktualisieren

Die Implementierungsmethode hier ist etwas niedrig, ich denke nur an regelmäßige Ersetzung {{text}}

let regExpInner = /\{{ *([\w_\-]+) *\}}/g
this.$el.querySelectorAll("*").forEach(i => {
 let replaceList = i.innerHTML.match(regExpInner) || (i.hasAttribute('vueID') && i.getAttribute('vueID').match(regExpInner))
 if(replaceList) {
  if(!i.hasAttribute('vueID')) {
   i.setAttribute('vueID', i.innerHTML)
  }
  i.innerHTML = i.getAttribute('vueID')
  replaceList.forEach(v => {
   let key = v.slice(2, v.length - 2)
   i.innerHTML = i.innerHTML.replace(v, this.$data[key])
  })
 }
})
Nach dem Login kopieren

Watcher (Beobachter)

Aktualisieren Sie die Ansicht, nachdem sich die Daten geändert haben

<p id="app">
 <input type="text" v-model="text1"><br>
 <input type="text" v-model="text2"><br>
 <textarea type="text" v-model="text3"></textarea><br>
 <button @click="add">加一</button>
 <h1>您输入的是:{{text1}}+{{text2}}+{{text3}}</h1>
 <select v-model="select">
  <option value="volvo">Volvo</option>
  <option value="saab">Saab</option>
 </select>
 <select v-model="select">
  <option value="volvo">Volvo</option>
  <option value="saab">Saab</option>
 </select>
 <h1>您选择了:{{select}}</h1>
</p>
<script src="./TinyVue.js"></script>
<script>
 let app = new TinyVue({
  el: &#39;#app&#39;,
  data: {
   text1: 123,
   text2: 456,
   text3: &#39;文本框&#39;,
   select: &#39;saab&#39;
  },
  methods: {
   add() {
    this.text1 ++
    this.text2 ++
   }
  }
 })
</script>
Nach dem Login kopieren

Alle Codes von TinyVue

class TinyVue{
 constructor({el, data, methods}){
  this.$data = data
  this.$el = document.querySelector(el)
  this.$methods = methods
  this._compile()
  this._updater()
  this._watcher()
 }
 _watcher(data = this.$data) {
  let that = this
  Object.keys(data).forEach(i => {
   let value = data[i]
   Object.defineProperty(data, i, {
    enumerable: true,
    configurable: true,
    get: function () {
     return value;
    },
    set: function (newVal) {
     if (value !== newVal) {
      value = newVal;
      that._updater()
     }
    }
   })
  })
 }
 _initEvents(el, attr, callBack) {
  this.$el.querySelectorAll(el).forEach(i => {
   if(i.hasAttribute(attr)) {
    let key = i.getAttribute(attr)
    callBack(i, key)
   }
  })
 }
 _initView(el, attr, callBack) {
  this.$el.querySelectorAll(el, attr, callBack).forEach(i => {
   if(i.hasAttribute(attr)) {
    let key = i.getAttribute(attr),
     data = this.$data[key]
    callBack(i, key, data)
   }
  })
 }
 _updater() {
  this._initView(&#39;input, textarea&#39;, &#39;v-model&#39;, (i, key, data) => {
   i.value = data
  })
  this._initView(&#39;select&#39;, &#39;v-model&#39;, (i, key, data) => {
   i.querySelectorAll(&#39;option&#39;).forEach(v => {
    if(v.value == data) v.setAttribute(&#39;selected&#39;, true)
    else v.removeAttribute(&#39;selected&#39;)
   })
  })
  let regExpInner = /\{{ *([\w_\-]+) *\}}/g
  this.$el.querySelectorAll("*").forEach(i => {
   let replaceList = i.innerHTML.match(regExpInner) || (i.hasAttribute(&#39;vueID&#39;) && i.getAttribute(&#39;vueID&#39;).match(regExpInner))
   if(replaceList) {
    if(!i.hasAttribute(&#39;vueID&#39;)) {
     i.setAttribute(&#39;vueID&#39;, i.innerHTML)
    }
    i.innerHTML = i.getAttribute(&#39;vueID&#39;)
    replaceList.forEach(v => {
     let key = v.slice(2, v.length - 2)
     i.innerHTML = i.innerHTML.replace(v, this.$data[key])
    })
   }
  })
 }
 _compile() {
  this._initEvents(&#39;*&#39;, &#39;@click&#39;, (i, key) => {
   i.addEventListener(&#39;click&#39;, () => this.$methods[key].bind(this.$data)())
  })
  this._initEvents(&#39;input, textarea&#39;, &#39;v-model&#39;, (i, key) => {
   i.addEventListener(&#39;input&#39;, () => {
    Object.assign(this.$data, {[key]: i.value})
   })
  })
  this._initEvents(&#39;select&#39;, &#39;v-model&#39;, (i, key) => {
   i.addEventListener(&#39;change&#39;, () => Object.assign(this.$data, {[key]: i.options[i.options.selectedIndex].value}))
  })
 }
}
Nach dem Login kopieren

Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass es für alle beim Lernen hilfreich sein wird. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website!

Verwandte Empfehlungen:

Einführung in die Verpackung von Vue2.0-Multi-Tab-Switching-Komponenten

Über die Vue-Formulardemo V-Modell Probleme mit bidirektionaler Bindung

Das obige ist der detaillierte Inhalt vonVerwenden Sie ES6-Klassen, um Vue zu imitieren und ein Beispiel für eine bidirektionale Bindung zu schreiben. 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

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Repo: Wie man Teamkollegen wiederbelebt
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Abenteuer: Wie man riesige Samen bekommt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

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)

Können zwei WeChat-Konten an dieselbe Bankkarte gebunden werden? Können zwei WeChat-Konten an dieselbe Bankkarte gebunden werden? Aug 25, 2023 pm 03:13 PM

Zwei WeChat-Konten können nicht an dieselbe Bankkarte gebunden werden. Verknüpfen Sie eine Bankkarte mit einem WeChat-Konto: 1. Öffnen Sie die WeChat-Anwendung, klicken Sie auf die Option „Ich“ und wählen Sie dann die Option „Bezahlen“ 2. Wählen Sie die Option „Bankkarte hinzufügen“ und geben Sie die Bankkarteninformationen ein, wenn Sie dazu aufgefordert werden 3. Sobald die Bankkarte erfolgreich gebunden ist, können Benutzer die Bankkarte für Zahlungen und Überweisungen in WeChat verwenden.

So implementieren Sie bearbeitbare Tabellen in Vue So implementieren Sie bearbeitbare Tabellen in Vue Nov 08, 2023 pm 12:51 PM

Tabellen sind ein wesentlicher Bestandteil vieler Webanwendungen. Tabellen enthalten normalerweise große Datenmengen, daher erfordern Tabellen einige spezifische Funktionen, um die Benutzererfahrung zu verbessern. Eine der wichtigen Funktionen ist die Bearbeitbarkeit. In diesem Artikel untersuchen wir, wie bearbeitbare Tabellen mit Vue.js implementiert werden, und stellen spezifische Codebeispiele bereit. Schritt 1: Daten vorbereiten Zuerst müssen wir die Daten für die Tabelle vorbereiten. Wir können ein JSON-Objekt verwenden, um die Daten der Tabelle zu speichern und sie in der Dateneigenschaft der Vue-Instanz zu speichern. In diesem Fall

So verwenden Sie Klassen und Methoden in Python So verwenden Sie Klassen und Methoden in Python Apr 21, 2023 pm 02:28 PM

Konzepte und Instanzen von Klassen und Methoden Klasse (Klasse): wird verwendet, um eine Sammlung von Objekten mit denselben Eigenschaften und Methoden zu beschreiben. Es definiert die Eigenschaften und Methoden, die jedem Objekt in der Sammlung gemeinsam sind. Objekte sind Instanzen von Klassen. Methode: In der Klasse definierte Funktion. Klassenkonstruktionsmethode __init__(): Die Klasse verfügt über eine spezielle Methode (Konstruktionsmethode) namens init(), die automatisch aufgerufen wird, wenn die Klasse instanziiert wird. Instanzvariablen: In der Deklaration einer Klasse werden Attribute durch Variablen dargestellt. Solche Variablen werden Instanzvariablen genannt. Instanziierung: Erstellen Sie eine Instanz einer Klasse, ein bestimmtes Objekt der Klasse. Vererbung: Das heißt, eine abgeleitete Klasse (derivedclass) erbt die Basisklasse (baseclass).

Ist Async für es6 oder es7? Ist Async für es6 oder es7? Jan 29, 2023 pm 05:36 PM

async ist es7. Async und Wait sind neue Ergänzungen zu ES7 und Lösungen für asynchrone Vorgänge. Man kann sagen, dass Async/Await syntaktischer Zucker für Co-Module und Generatorfunktionen ist und js asynchronen Code mit klarerer Semantik löst. Wie der Name schon sagt, bedeutet Async „asynchron“. Async wird verwendet, um zu deklarieren, dass eine Funktion asynchron ist. Es gibt eine strikte Regel zwischen Async und Wait.

Wie binde ich ein Unterkonto auf Xiaohongshu? Wie prüft es, ob das Konto normal ist? Wie binde ich ein Unterkonto auf Xiaohongshu? Wie prüft es, ob das Konto normal ist? Mar 21, 2024 pm 10:11 PM

Im heutigen Zeitalter der Informationsexplosion wird der Aufbau einer persönlichen Marke und eines Unternehmensimages immer wichtiger. Als führende Fashion-Life-Sharing-Plattform in China hat Xiaohongshu die Aufmerksamkeit und Beteiligung vieler Nutzer auf sich gezogen. Für diejenigen Nutzer, die ihren Einfluss erweitern und die Effizienz der Inhaltsverbreitung verbessern möchten, ist die Bindung von Unterkonten ein wirksames Mittel geworden. Wie bindet Xiaohongshu also ein Unterkonto? Wie kann ich überprüfen, ob das Konto normal ist? Dieser Artikel beantwortet diese Fragen ausführlich für Sie. 1. Wie binde ich ein Unterkonto auf Xiaohongshu? 1. Melden Sie sich bei Ihrem Hauptkonto an: Zuerst müssen Sie sich bei Ihrem Xiaohongshu-Hauptkonto anmelden. 2. Öffnen Sie das Einstellungsmenü: Klicken Sie oben rechts auf „Ich“ und wählen Sie dann „Einstellungen“. 3. Geben Sie die Kontoverwaltung ein: Suchen Sie im Einstellungsmenü nach der Option „Kontoverwaltung“ oder „Kontoassistent“ und klicken Sie darauf

BTCC-Tutorial: Wie kann ich die MetaMask-Wallet an der BTCC-Börse binden und verwenden? BTCC-Tutorial: Wie kann ich die MetaMask-Wallet an der BTCC-Börse binden und verwenden? Apr 26, 2024 am 09:40 AM

MetaMask (auf Chinesisch auch Little Fox Wallet genannt) ist eine kostenlose und beliebte Verschlüsselungs-Wallet-Software. Derzeit unterstützt BTCC die Bindung an die MetaMask-Wallet. Nach der Bindung können Sie sich mit der MetaMask-Wallet schnell anmelden, Werte speichern, Münzen kaufen usw. und bei der erstmaligen Bindung einen Testbonus von 20 USDT erhalten. Im BTCCMetaMask-Wallet-Tutorial stellen wir detailliert vor, wie man MetaMask registriert und verwendet und wie man das Little Fox-Wallet in BTCC bindet und verwendet. Was ist die MetaMask-Wallet? Mit über 30 Millionen Nutzern ist MetaMask Little Fox Wallet heute eines der beliebtesten Kryptowährungs-Wallets. Die Nutzung ist kostenlos und kann als Erweiterung im Netzwerk installiert werden

Schritte und Methoden, um Douyin in Toutiao zu binden Schritte und Methoden, um Douyin in Toutiao zu binden Mar 22, 2024 pm 05:56 PM

1. Öffnen Sie Toutiao. 2. Klicken Sie unten rechts auf „Mein“. 3. Klicken Sie auf [Systemeinstellungen]. 4. Klicken Sie auf [Konto- und Datenschutzeinstellungen]. 5. Klicken Sie auf die Schaltfläche auf der rechten Seite von [Douyin], um Douyin zu binden.

Wie binde ich die Cainiao-App an Pinduoduo? Wie füge ich den Cainiao Wrap zur Pinduoduo-Plattform hinzu? Wie binde ich die Cainiao-App an Pinduoduo? Wie füge ich den Cainiao Wrap zur Pinduoduo-Plattform hinzu? Mar 19, 2024 pm 02:30 PM

Die Cainiao-App ist eine Plattform, die Ihnen verschiedene Logistikinformationen liefern kann. Die Funktionen hier sind sehr leistungsstark und einfach zu verwenden. Wenn Sie logistische Probleme haben, können diese auf jeden Fall gelöst werden -Stopp-Service kann alles rechtzeitig lösen, die Expresslieferung abholen, versenden usw. Wir haben mit verschiedenen Plattformen zusammengearbeitet und können manchmal abgefragt werden Es kann vorkommen, dass die auf Pinduoduo gekauften Waren keine Logistikinformationen anzeigen können. Um dies zu erreichen, müssen Sie die spezifischen Methoden unten klären, und jeder kann einen Blick darauf werfen. So binden Sie Cainiao an ein Pinduoduo-Konto: 1. Öffnen Sie die Cainiao-App und gehen Sie zur Hauptseite

See all articles