Erklärung und Beispielverwendung von 4 benutzerdefinierten Anweisungen in Vue

Erklärung und Beispielverwendung von 4 benutzerdefinierten Anweisungen in Vue

Vier praktische Vue-Custom-Anweisungen

1. V-Widerstand

Voraussetzung: Mouse-Drag-Element

Ideen:

Elementversatz = Koordinaten nach dem Gleiten der Maus – Koordinaten beim ersten Klicken mit der Maus auf das Element + oberer und linker Abstand des Elements vom sichtbaren Bereich zum Zeitpunkt des ersten Klicks.
Verwenden Sie den sichtbaren Bereich als Grenze und beschränken Sie das Ziehen innerhalb des sichtbaren Bereichs. [Empfohlen: „Vue.js-Tutorial“]

Code:

Vue.Direktive('ziehen', {
  eingefügt(el) {
    let header = el.querySelector('.dialog_header')
    header.style.cssText += ';cursor:bewegen;'
    header.onmousedown = Funktion (e) {
      //Breite und Höhe des aktuell sichtbaren Bereichs abrufen let clientWidth = document.documentElement.clientWidth
      let clientHeight = document.documentElement.clientHeight
 
      //Holen Sie sich die eigene Breite und Höhe let elWidth = el.getBoundingClientRect().width
      let elHeight = el.getBoundingClientRect().height
 
      //Holen Sie sich den oberen und linken sichtbaren Bereich der aktuellen Entfernung
      let elTop = el.getBoundingClientRect().top
      let elLeft = el.getBoundingClientRect().left
 
      //Beim Klicken die Koordinaten abrufen let startX = e.pageX
      let startY = e.pageY
 
      document.onmousemove = Funktion (e) {
        //Elementversatz = Koordinaten nach dem Gleiten der Maus - Koordinaten, wenn die Maus zum ersten Mal auf das Element klickt + oberer und linker Abstand des Elements vom sichtbaren Bereich beim ersten Klick
        let moveX = e.pageX - startX + elLeft
        let moveY = e.pageY - startY + elTop
 
        //Verwende den sichtbaren Bereich als Grenze und beschränke das Ziehen innerhalb des sichtbaren Bereichs, wenn ((moveX + elWidth) > clientWidth || moveX < 0 || (moveY + elHeight) > clientHeight || moveY < 0) {
          zurückkehren
        }
 
        el.style.cssText += 'oben:' + moveY + 'px;links:' + moveX + 'px;'
      }
      dokument.onmouseup = Funktion () {
        document.onmousemove = null
        document.onmouseup = null
      }
    }
  }
})

2. v-Wortlimit

Anforderungen: Das Hintergrundfeld hat eine Längenbeschränkung und unterscheidet zwischen Chinesisch und Englisch. Chinesisch ist zwei Bytes und Englisch ist ein Byte. Daher muss das Eingabefeld die Anzahl der eingegebenen Zeichen begrenzen und die Anzahl der Bytes unterscheiden, und die Anzahl der eingegebenen Zeichen muss wiedergegeben werden.

Ideen:

Ein-Byte-regulärer Ausdruck /[\x00-\xff]/g

Erstellen Sie ein Element, das die Wortbegrenzung umschließt, und positionieren Sie es im Textbereich und im Eingabefeld.

Berechnen Sie die Anzahl der Eingabezeichen, enLen für Ein-Byte-Zeichen und cnLen für Zwei-Byte-Zeichen. Dies wird später für die Verarbeitung der Zeichenfolgenkürzung verwendet.

Wenn die Anzahl der eingegebenen Zeichen den Grenzwert überschreitet, wird eine Kürzung durchgeführt; substr(0,enLen+cnLen)

Die Schnittstelle aktualisiert den Wert des Eingabefelds oder initialisiert den Wert des Eingabefelds und muss die richtige Anzahl von Bytes ausgeben

Code:

Vue.direktive('Wortgrenze',{
  binden(el,Bindung){
    console.log('binden');
    let { value } = Bindung
    Vue.nextTick(() => {
      //Finden Sie heraus, ob es sich bei dem Eingabefeld um ein Textbereichsfeld oder ein Eingabefeld handelt. let current = 0
      lass arr = Array.prototype.slice.call(el.children)
      für (sei i = 0; i < arr.length; i++) {
        wenn(arr[i].tagName=='TEXTAREA' || arr[i].tagName=='INPUT'){
          Strom = i
        }
      }
   
      //Aktualisiere die Anzahl der Bytes im aktuellen Eingabefeld el.children[el.children.length-1].innerHTML = el.children[current].value.replace(/[^\x00-\xff]/g,'**').length +'/'+value//eslint-disable-line
    })
  },
  aktualisieren(el,Bindung){
    Konsole.log('Aktualisieren');
    let { value } = Bindung
    Vue.nextTick(() => {
      //Finden Sie heraus, ob es sich bei dem Eingabefeld um ein Textbereichsfeld oder ein Eingabefeld handelt. let current = 0
      lass arr = Array.prototype.slice.call(el.children)
      für (sei i = 0; i < arr.length; i++) {
        wenn(arr[i].tagName=='TEXTAREA' || arr[i].tagName=='INPUT'){
          Strom = i
        }
      }
   
      //Aktualisiere die Anzahl der Bytes im aktuellen Eingabefeld el.children[el.children.length-1].innerHTML = el.children[current].value.replace(/[^\x00-\xff]/g,'**').length +'/'+value//eslint-disable-line
    })
  },
  eingefügt(el,Bindung){
    console.log('eingefügt');
    let { value } = Bindung
 
    //Finden Sie heraus, ob es sich bei dem Eingabefeld um ein Textbereichsfeld oder ein Eingabefeld handelt. let current = 0
    lass arr = Array.prototype.slice.call(el.children)
    für (sei i = 0; i < arr.length; i++) {
      wenn(arr[i].tagName=='TEXTAREA' || arr[i].tagName=='INPUT'){
        Strom = i
      }
    }
 
    //Erstellen Sie ein Element, das die Wortbegrenzung umschließt und es im Textbereich und im Eingabefeld positioniert. let div = document.createElement('div')
    if(el.children[current].tagName=='TEXTAREA'){//Es handelt sich um einen Textbereich, der in der unteren rechten Ecke positioniert ist.div.style = 'color:#909399;position:absolute;font-size:12px;bottom:5px;right:10px;'
    }anders{
      let styStr = ''
      if(!el.classList.contains('is-disabled')){//Wenn das Eingabefeld nicht ausgegraut ist, Hintergrundfarbe hinzufügen styStr = 'background:#fff;'
      }
      div.style = 'Farbe: #909399; Position: absolut; Schriftgröße: 12px; unten: 2px; rechts: 10px; Zeilenhöhe: 28px; Höhe: 28px;' + styStr
    }
 
    div.innerHTML = '0/' + Wert
    el.appendChild(div)
    el.children[current].style.paddingRight = "60px"
 
    el.oninput = () => {
      let val = el.children[aktuell].Wert
      val = val.replace(/[^\x00-\xff]/g,'**') //eslint-Deaktivierungszeile
      // Das Wortbegrenzungsfeld wird als letztes Element in el eingefügt el.children[el.children.length-1].innerHTML = val.length + '/' + value
      wenn(Wert.Länge>Wert){
        let cnLen = 0 //Anzahl der Ein-Byte-Wörter let enLen = 0 //Anzahl der Zwei-Byte-Wörter if(val.match(/[^**]/g) && val.match(/[^**]/g).length){
          enLen = val.match(/[^**]/g).length // Berechne die Anzahl der Wörter in einem Byte // Ein Byte besteht aus beiden Bytes if((value - val.match(/[^**]/g).length)>0){
            cnLen = Math.floor((Wert - Wert.match(/[^**]/g).Länge)/2)
          }anders{
            cnLen = 0
          }
        }else{ //Für beide Bytes enLen = 0
          cnLen = Math.floor(Wert/2)
        }
 
        wenn(enLen>Wert){
          enLen = Wert
        }
 
        //Wenn die Anzahl der Bytes den Grenzwert überschreitet, fang el.children[current].value = el.children[current].value.substr(0,enLen+cnLen) ab.
 
        //Aktualisiere die Anzahl der Bytes im aktuellen Eingabefeld el.children[el.children.length-1].innerHTML = el.children[current].value.replace(/[^\x00-\xff]/g,'**').length +'/'+value//eslint-disable-line
 
      }
    }
 
  },
})

verwenden:

<el-input Typ="Textbereich" Zeilen="3" v-wordlimit="20" v-model="Wert"></el-input>

3. v-anthor

Voraussetzung: Klicke auf ein Element (meist Titel, Untertitel etc.) und die Animation scrollt zum entsprechenden Inhaltsblock

Ideen:

Timer mit window.scrollBy

Wenn Sie IE nicht berücksichtigen, können Sie direkt window.scrollBy({ top: ,left:0,behavior:'smooth' }) verwenden.

Code:

Vue.direktive('Anker',{
  eingefügt(el,Bindung){
    let { value } = Bindung
    let timer = null
    el.addEventListener('klicken',Funktion(){
      // Der Abstand zwischen dem aktuellen Element und der Oberseite des sichtbaren Bereichs let currentTop = el.getBoundingClientRect().top
      animateScroll(aktuell oben)
    },FALSCH)
     
    Funktion animateScroll(currentTop){
      wenn(Zeitgeber){
        Intervall löschen(Timer)
      }
      sei c = 9
      Timer = Intervall festlegen(() => {
        wenn(c==0){
          Intervall löschen(Timer)
        }
        C--
        window.scrollBy(0,(aktuellerTop-Wert)/10)
      },16.7)
    }
 
  }
})

verwenden:

<div class="box" v-anchor="20" style="color:red;">Ja</div>

4. v-hasRole

Voraussetzungen: Entsprechende Elemente entsprechend den Systemrollen hinzufügen oder löschen

Code:

Vue.direktive('hatRolle',{
  eingefügt(el,Bindung){
    let { value } = Bindung
    let-Rollen = JSON.parse(sessionStorage.getItem('userInfo')).roleIds
 
    wenn(Wert && Wertinstanz des Arrays && Wert.Länge>0){
 
      let hasPermission = value.includes(Rollen)
 
      wenn(!hasPermission){
        el.parentNode und el.parentNode.removeChild(el)
      }
    }anders{
      throw new Error(`Bitte überprüfen Sie den an die Anweisung gebundenen Ausdruck, das korrekte Format ist beispielsweise v-hasRole="['admin','reviewer']"`)
    }
  }
})

Damit ist dieser Artikel über die Erklärung und Beispielverwendung von 4 benutzerdefinierten Anweisungen in Vue abgeschlossen. Weitere wissenswerte Informationen zu den 4 benutzerdefinierten Anweisungen in Vue finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • Verwendung globaler und lokaler benutzerdefinierter Vue-Anweisungen
  • Detaillierter Code zu benutzerdefinierten Vue-Anweisungen zum Implementieren des Elementziehens
  • So schreiben Sie eine benutzerdefinierte Direktive für Vue3
  • Details zu benutzerdefinierten Vue3-Anweisungen
  • Detaillierte Erläuterung der benutzerdefinierten Vue-Anweisungen
  • Beschreibung der benutzerdefinierten Vue-Direktiven und ihrer allgemeinen Hook-Funktionen

<<:  Detaillierte Erläuterung der Prinzippraxis des Bootstrap-Frameworks für CSS3-Medienabfragen mit responsivem Layout (empfohlen)

>>:  So verwenden Sie ein HTML-Formular mit mehreren Beispielen

Artikel empfehlen

Lösung für den Konflikt zwischen Nginx und Backend-Port

Frage: Bei der Entwicklung des Alice-Verwaltungss...

MySQL effiziente Abfrage Left Join und Gruppieren nach (plus Index)

MySQL effiziente Abfrage MySQL verzichtet auf „Gr...

Schritte für Docker zum Erstellen eines privaten Lagerhafens

Hafen Harbor ist eine Open-Source-Lösung zum Erst...

Vollständiger Prozessdatensatz zur Fehlerbehebung bei MySQL DeadLock

【Autor】 Liu Bo: Leitender Datenbankmanager im Ctr...

Installieren Sie .NET 6.0 im CentOS-System mithilfe eines Cloud-Servers

.NET SDK-Download-Link https://dotnet.microsoft.c...

Eine kurze Einführung in Web2.0-Produkte und -Funktionen

<br />Was ist Web 2.0? Web2.0 umfasst diese ...

Bringen Sie Ihnen kostenlos bei, wie Sie AWS-Serverressourcen nutzen

AWS – Amazons Cloud-Computing-Serviceplattform Ic...

React implementiert Paging-Effekt

In diesem Artikel wird der spezifische Code für R...

Wie melde ich mich per Remote-Zugriff bei der MySql-Datenbank an?

Einführung: Manchmal müssen wir zur Entwicklung e...

Front-End-JavaScript versteht Funktions-Currying gründlich

Inhaltsverzeichnis 1. Was ist Curry 2. Verwendung...