Beispielcode zur Implementierung von dynamischem Skinning mit vue+element

Beispielcode zur Implementierung von dynamischem Skinning mit vue+element

Manchmal kann das Thema eines Projekts nicht jedermanns Ästhetik befriedigen. Zu diesem Zeitpunkt ist die Skin-Änderungsfunktion sehr benutzerfreundlich. Dieses Projekt implementiert die Skin-Änderungsfunktion des Hintergrundverwaltungsprojekts basierend auf vue+element

1. Erstellen Sie eine Skinning-Komponente

<Vorlage>
  <el-Farbwähler
    Klasse = "Themenauswahl"
    Popper-Klasse = "Themenauswahl-Dropdown"
    v-Modell="Thema"
    :predefine="Farben vordefinieren"
  ></el-Farbauswahl>
</Vorlage>
 
<Skript>
const version = require("element-ui/package.json").version; // element-ui-Version von node_modules
const ORIGINAL_THEME = "#409EFF"; // Standardfarbe
Standard exportieren {
  Name: "ThemePicker",
  Requisiten: {
    Standard: {
      // Initialisiere das Thema, das von außen übergeben werden kann. Typ: String
      // Standard: '#2668b1'
      // Standard: `${localStorage.getItem("tremePackers")==null?"#C60404":localStorage.getItem("tremePackers")}`
    }
    // size: { // Initialisiere das Thema, das von außen übergeben werden kann // type: String,
    // Standard: „klein“
    // },
  },
  Daten() {
    zurückkehren {
      Kreide: "", // Inhalt des Theme-Kreide-CSS
      Thema: ORIGINAL_THEME,
      showSuccess: true, // Ob die Meldung über den erfolgreichen Skin-Wechsel angezeigt werden soll predefineColors: [
        „#2668b1“,
        "#52b493",
        "#429798",
        "#32789c",
        "#1944a5",
        "#5944bc",
        "#995dcd",
        "#ce7e5b",
        "#ee8b9b",
        "#283551"
      ]
    };
  },
  montiert() {
    dieses.Thema = dieses.Standardthema;
    // dies.$emit('onThemeChange', dieses.thema)
    Dies.showSuccess = true;
  },
  berechnet: {
    Standardthema() {
      gib dies zurück.$store.state.theme;
    }
  },
  betrachten:
    asynchrones Thema(Wert, alterWert) {
          wenn (Typ von Wert !== "Zeichenfolge") zurückgeben;
          const themeCluster = this.getThemeCluster(val.replace("#", ""));
          const originalCluster = this.getThemeCluster(oldVal.replace("#", ""));
          const getHandler = (Variable, ID) => {
            zurückgeben () => {
              const originalCluster = this.getThemeCluster(
                ORIGINAL_THEME.replace("#", "")
              );
              const neuerStyle = this.updateStyle(
                diese[Variable],
                ursprünglicher Cluster,
                ThemenCluster
              );
 
              Geben Sie styleTag = document.getElementById(id) ein.
              wenn (!styleTag) {
                styleTag = document.createElement("Stil");
                styleTag.setAttribute("id", id);
                // Dokument.head.appendChild(styleTag)
                dokumentieren
                  .getElementsByTagName("Stil")[0]
                  .insertBefore(styleTag, null);
              }
              styleTag.innerText = neuerStil;
            };
          };
 
          const chalkHandler = getHandler("Kreide", "Kreide-Stil");
 
          wenn (!diese.Kreide) {
            const url = `../../assets/style/theme/index.css`; //Lokale CSS-Style-Adresse // const url = `./dist/index.css`; //CSS-Adresse nach Projektpaketierung (die Originaldatei wird im öffentlichen Ordner abgelegt)
            // const url = `https://unpkg.com/element-ui@${version}/lib/theme-chalk/index.css`; //Wenn es sich um ein Firmenintranet handelt, ist diese URL nicht anwendbar this.getCSSString(url, chalkHandler, "chalk");
 
          } anders {
            KreideHandler();
          }
 
          const Stile = [].slice
            .call(document.querySelectorAll("Stil"))
            .filter(style => {
              const text = style.innerText;
              zurückkehren (
                neuer RegExp(alterWert, "i").test(Text) &&
                !/Kreidevariablen/.test(Text)
              );
            });
          Stile.fürJeden(Stil => {
            const { innerText } = Stil;
            wenn (Typ des inneren Textes !== "Zeichenfolge") zurückgeben;
            Stil.innerText = dieser.updateStyle(
              innererText,
              ursprünglicher Cluster,
              ThemenCluster
            );
          });
          this.$store.commit("themColor", val);//Speichere die geänderte Farbe im Store
          dies.$emit("onThemeChange", val);
 
        // Auf externe Operationen reagieren // Im localStorage speichern
        // localStorage.setItem('tremePackers',val);
        // wenn(diese.showSuccess) {
        // diese.$nachricht({
        // Meldung: ‚Skin-Änderung erfolgreich‘,
        // Typ: "Erfolg"
        // })
        // } anders {
        // dies.showSuccess = true
        // }
      
    }
  },
  Methoden: {
    updateStyle(Stil, alterCluster, neuerCluster) {
      lassen Sie newStyle = Stil;
      oldCluster.forEach((Farbe, Index) => {
        neuerStil = neuerStil.replace(neuer RegExp(Farbe, "ig"), neuerCluster[Index]);
      });
      gib neuen Stil zurück;
    },
    
    getCSSString(url, Rückruf, Variable) {
      const xhr = neue XMLHttpRequest();
      xhr.onreadystatechange = () => {
        wenn (xhr.readyState === 4 && xhr.status === 200) {
          dies[Variable] = xhr.responseText.replace(/@font-face{[^}]+}/, "");
          Rückruf();
        }
      };
      xhr.open("GET", URL);
      xhr.senden();
    },
 
    getThemeCluster(Thema) {
      const tintColor = (Farbe, Farbton) => {
        lass rot = parseInt(color.slice(0, 2), 16);
        lass grün = parseInt(color.slice(2, 4), 16);
        lass blau = parseInt(color.slice(4, 6), 16);
 
        wenn (Farbton === 0) {
          // wenn die Primärfarbe in ihrem RGB-Raum liegt
          return [rot, grün, blau].join(",");
        } anders {
          rot += Math.round(Farbton * (255 - rot));
          grün += Math.round(Farbton * (255 - grün));
          blau += Math.round(Farbton * (255 - blau));
 
          rot = rot.toString(16);
          grün = grün.toString(16);
          blau = blau.toString(16);
 
          gibt `#${rot}${grün}${blau}` zurück;
        }
      };
 
      const shadeColor = (Farbe, Farbton) => {
        lass rot = parseInt(color.slice(0, 2), 16);
        lass grün = parseInt(color.slice(2, 4), 16);
        lass blau = parseInt(color.slice(4, 6), 16);
 
        rot = Math.round((1 - Farbton) * rot);
        grün = Math.round((1 - Farbton) * grün);
        blau = Math.round((1 - Farbton) * blau);
 
        rot = rot.toString(16);
        grün = grün.toString(16);
        blau = blau.toString(16);
 
        gibt `#${rot}${grün}${blau}` zurück;
      };
 
      const clusters = [Thema];
      für (lass i = 0; i <= 9; i++) {
        clusters.push(FarbtonFarbe(Thema, Nummer((i / 10).toFixed(2))));
      }
      clusters.push(Schattenfarbe(Design, 0,1));
      Rücklaufcluster;
    }
  }
};
</Skript>
 
<Stil>
.theme-picker .el-color-picker__trigger {
  vertikale Ausrichtung: Mitte;
}
 
.theme-picker-dropdown .el-color-dropdown__link-btn {
  Anzeige: keine;
}
.el-color-picker--klein .el-color-picker__trigger {
  Rand: keiner;
}
</Stil> 

Der obige Code ist bemerkenswert. Der Code im roten Feld fügt nach allen Knoten im Kopf ein neues Stil-Tag ein. Nach dem Verpacken hat es eine höhere Priorität, aber es gibt ein Problem. Die Farbe an einigen Stellen verschwindet direkt und wird leer, was sich auf den Stil auswirkt. Daher wird es in den Code im grünen Feld geändert. Allerdings ist die Priorität des Codes im grünen Feld nach dem Verpacken niedriger als die Priorität der ursprünglichen Stilfarbe, sodass die Stilpriorität je nach Projekt angepasst werden muss.

Auch dieser Code erfordert Aufmerksamkeit. Wenn das Unternehmen das externe Netzwerk direkt verwendet, können Sie direkt die dritte URL verwenden. Wenn das Unternehmen das interne Netzwerk verwendet, das nicht auf externe Webseiten zugreifen kann, können Sie den CSS-Stil der Elementversion des Projekts über die dritte URL herunterladen und die CSS-Datei im Projekt ablegen. Achten Sie jedoch darauf, sie in dem Ordner abzulegen, der nicht kompiliert wird. Mein Projekt verwendet vue cli4, daher wird die von mir dynamisch konvertierte CSS-Datei im öffentlichen Ordner abgelegt. Die Stildatei im Assets-Ordner wird kompiliert, sodass der Pfad 404 meldet. Die in diesem Block verwendete URL ist der Pfad des Stils, nachdem die Datei gepackt und kompiliert wurde. Dies ist erwähnenswert.

2. Wenn einige Stilfarben im Projekt kein Element verwenden, können Sie die Farbe in Vuex zwischenspeichern und sie dann über berechnete Eigenschaften im jeweiligen Schritt abrufen und dann dynamisch an den Stil binden.

vuex:

Verwendete Komponenten:

Damit ist dieser Artikel über den Beispielcode zur Implementierung dynamischer Skin-Änderungen mit vue+element abgeschlossen. Weitere relevante Inhalte zu dynamischen Skin-Änderungen mit vue+element 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:
  • Integrationspraxis des Vue+Element-Hintergrundverwaltungsframeworks
  • Verwenden Sie Element+vue, um Start- und Endzeitlimits zu implementieren
  • Antdesign-vue kombiniert mit sortablejs, um die Funktion zum Ziehen und Sortieren von zwei Tabellen zu erreichen
  • Detaillierte Erklärung zum Ziehen von Tabellenspalten mit Vue Element Sortablejs

<<:  Aufbau einer Docker+K8S-Clusterumgebung und verteilte Anwendungsbereitstellung

>>:  VS2019 stellt eine Verbindung zur MySQL8.0-Datenbank her – Tutorial mit Bildern und Text

Artikel empfehlen

Reines CSS zum Hinzufügen von Stil zur ausgewählten Implementierung (kein Skript)

Ändern Sie den Standardstil der Auswahl, normalerw...

So zeigen Sie die Zeitzone in MySQL an und ändern sie

Heute habe ich festgestellt, dass ein Programm ei...

Lösung für die falsche Ausrichtung des Eingabecursors in Chrome, Firefox und IE

Detaillierte Erklärung zur Fehlplatzierung des Ein...

Detaillierte Beschreibung von Shallow Copy und Deep Copy in js

Inhaltsverzeichnis 1. js-Speicher 2. Abtretung 3....

MySQL-Datenbank löscht doppelte Daten und behält nur eine Methodeninstanz bei

1. Problemeinführung Nehmen Sie ein Szenario an, ...

Eine kurze Einführung in den allgemeinen Prozess der Web-Frontend-Webentwicklung

Ich sehe viele Anfänger in der Front-End-Entwicklu...

Ein IE-Absturzfehler

Code kopieren Der Code lautet wie folgt: <styl...

So implementieren Sie den Vue-Mausrad-Scrolling-Umschalt-Routing-Effekt

Eine Root-Routing-Komponente (die Root-Routing-Ko...

So extrahieren Sie Zeichenfolgenelemente aus nicht festen Positionen in MySQL

Vorwort Hinweis: Die Testdatenbankversion ist MyS...

CSS3-Kategoriemenüeffekt

Die CSS3-Kategoriemenüeffekte sind wie folgt: HTM...

HTML Einführungstutorial HTML Tag Symbole schnell beherrschen

Randbemerkung <br />Wenn Sie nichts über HTM...