テーマを動的に変更する最初に解決する必要があるのは、どのテーマを表示する必要があるかを把握し、動的に切り替える方法です。私が選択した方法はqueryStringです。 URL を開いたときに、末尾に ?theme=xx を追加し、この xx を読み取って保存することができます。 最初の方法: 動的コンポーネントテーマのルートは変更されておらず、コンポーネント内のスタイルと機能のみが変更されている場合は、コンポーネントをコピーして変更し、遅延読み込みと動的コンポーネントを通じて実装できます。 // ページコンポーネント <テンプレート> <div> <コンポーネント:is="テーマ名" /> </div> </テンプレート> <スクリプト> エクスポートデフォルト{ 名前: 'ホーム'、 コンポーネント:{ theme1:()=>import('@/theme/theme1/a')、 theme2:()=>import('@/theme/theme2/a')、 }, 計算:{ テーマ名(){ `theme${this.$store.state.themeId}` を返します } } } </スクリプト> コンポーネントでは、ほとんどのコンポーネントが実際には論理的に同じであるため、スクリプト部分を抽出しました。多少の違いがあっても、テーマ 2 のコンポーネントで直接変更して、テーマ 1 への影響を軽減できます。 //アクション.js エクスポートデフォルト{ 名前:'テーマ1', .... } <テンプレート> <div class="theme1"></div> </テンプレート> <スクリプト> '../componentAction/action' からアクションをインポートします action.name='テーマ1' デフォルトのアクションをエクスポートする </スクリプト> <スタイルスコープ> </スタイル> この実装の利点は、サブコンポーネントのスタイル スコープを通じてスタイルの分離を実現でき、同時に機能データも分離されることです。たとえば、2 つのサブコンポーネントのスワイパーは互いに影響を及ぼしません。 同時に、遅延読み込みでは読み込み時にホームページのサイズも縮小されます。 後からテーマを追加するのは単なる模倣になってしまいます。 2番目の方法はルーティング分離ですルーティングの分離は、実際には theme1 にルートの配列を記述し、 theme2 にルートのセットを記述するのと同じくらい簡単です。 // ルータ.js { パス:'/theme3', 名前:'theme3Index', コンポーネント: () => import('../views/theme3/Index.vue'), 子供たち:[ { パス: '/theme3/entry', 名前: 'theme3Entry', コンポーネント: () => import('../views/theme3/entry.vue'), } ] } この方法は、実は最後の手段です。主にルートが変わったためにこれを使用します。例えば、以前は直接 a.vue にアクセスしていたのですが、今はその前に追加のエントリページがあるので、ルートを変更するしかありません。 この方法により、より優れた分離も実現されます。 要約する上記2つのアイデアは、現在の弊社のビジネスに対する私の考えであり、参考としてのみご提供させていただいております。 実際、これら 2 つの方法には、コードの冗長性という共通の問題があります。各コンポーネントは必然的に以前のテーマのコードを引き継ぎます。ロジックコードのほとんどは抽出できますが、CSS とテンプレートは抽出できません。 テーマが毎回 dom と機能ブロックを追加し、毎回 v-if が使用される場合、将来的にコードの保守がより困難になります。そのため、テーマごとにコードを分割することにしました。 CSSに基づく2つの追加メソッド方法1: 複数のCSSセット<!-- 中央 --> <テンプレート> 親クラス名を動的に取得し、親クラスを複数回定義する <div :class="className"> <div class="switch" v-on:click="chang()"> {{ className == "box" ? "ライトを点灯する" : "ライトを消す" }} </div> </div> </テンプレート> <スクリプト> エクスポートデフォルト{ 名前:「センター」、 データ() { 戻る { クラス名: "ボックス" }; }, メソッド: { // クラスを変更する 変更() { this.className === "ボックス" ? (this.className = "boxs") : (this.className = "box"); } }, }; </スクリプト> <スタイル lang="scss"> クラスがboxの場合は、witchのCSSを使用します @import "./style/witch.scss"; クラスがボックスの場合は、黒いCSSを使用します @import "./style/black.scss"; .スイッチ{ 位置: 固定; 上: 4px; 右: 10px; zインデックス: 50; 幅: 60ピクセル; 高さ: 60px; 背景: #fff; 行の高さ: 60px; 境界線の半径: 20%; } </スタイル> 各 CSS ファイルのスタイルはほぼ同じですが、最も外側の親が .box と .boxs と異なる点が異なります。 方法2: SCSSで変数を動的に切り替える2つのメインファイルに分割しました。
// テーマの切り替え $bgColor:var(--backgroundColor,rgb(255,255,255)); $fontColor:var(--fontColor,rgb(0,0,0)); $bgmColor:var(--backgroundMColor,rgb(238,238,238)); テーブルカラーを rgb(218,218,218) に設定します。 $borderColor:var(--borderColor,rgb(238,238,238)); $tablesColor:var(--tablesColor,rgb(255,255,255)); $inputColor:var(--inputColor,rgb(255,255,255)) vue.config.js の _variable.scss ファイルのグローバル設定を作成しましたが、コンポーネントには導入しませんでした。 css: { ローダーオプション: { // このファイルはテーマ切り替えファイルです sass: { prependData: `@import "./src/styles/_variable.scss";`, }, }, }, パブリックスタイル.js このメソッドはvarで定義された変数を変更することができます // テーマの切り替え const cut = (cutcheack) => { document.getElementsByTagName("body")[0].style.setProperty("--backgroundColor", cutcheack ? "#121212" : "#fff"); document.getElementsByTagName("body")[0].style.setProperty("--fonntColor", cutcheack ? "#cecece" : "#333"); document.getElementsByTagName("body")[0].style.setProperty("--backgroundMColor", cutcheack ? "#333" : "#eee"); document.getElementsByTagName("body")[0].style.setProperty("--tableColor", cutcheack ? "#000" : "#d8d8d8"); document.getElementsByTagName("body")[0].style.setProperty("--tablesColor", cutcheack ? "#222" : "#fff"); document.getElementsByTagName("body")[0].style.setProperty("--inputColor", cutcheack ? "#666" : "#fff"); document.getElementsByTagName("body")[0].style.setProperty("--borderColor", cutcheack ? "#666" : "#fff"); }; デフォルトのカットをエクスポートします。 コンポーネントで使用される <!-- ホーム --> <テンプレート> <div クラス = 'ホーム'> <el-switch v-model="cutcheack" active-color="#333" inactive-color="#13ce66" active-text="テーマ" @change="スイッチ"></el-switch> </div> </テンプレート> <スクリプト> 「../../utils/publicStyle.js」から切り取ってインポートします。 エクスポートデフォルト{ 名前: "ホーム", データ() { 戻る { cutcheack: false, //テーマスイッチ}; }, メソッド: { // 左のナビゲーションを非表示または表示 // テーマを切り替える switches() { カット(this.cutcheack); }, }, }; </スクリプト> <スタイル lang='scss' スコープ> 。家 { 高さ: 100%; 幅: 100%; 背景:$bgColor; .el-コンテナ{ 高さ: 100%; 色:$fontColor; } } </スタイル> 上記は、Vue でテーマ切り替えを実装するためのさまざまなアイデアを共有する詳細な内容です。Vue テーマ切り替えの詳細については、123WORDPRESS.COM の他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
<<: Linux での MySQL のインストールに関する詳細なチュートリアル
序文これは fastdfs を使用してイントラネット外部に展開された分散ファイルシステムであるためで...
データ移行は、MySQL から ClickHouse にインポートする必要があります。概要プランは以...
この記事では、divのドラッグ可能な高さを実現するためのVueの具体的なコードを参考までに共有します...
今日会社から課題をもらったのですが、効果図は以下のとおりです。 どのような効果を実現したいかは特に決...
目次1. この Web サイトには SQL インジェクションの脆弱性がある可能性があることが判明しま...
目次インストール構成よくある間違い事前テスト作業依存関係の扱いインスタンスとDOMを生成する要約する...
1. mysql-8.0.15をダウンロード、インストール、設定する1. 公式サイト (https:...
この記事の例では、カウントダウンプロンプトボックスを実装するためのJavaScriptの具体的なコー...
目次序文列挙可能なプロパティ反復可能なオブジェクトforEachメソッドとmapメソッドチェーン呼び...
以前作成されたデータベースの ogg プロセスは、発見されるまでの約半月間ダウンしていました。起動で...
MySQL エスケープエスケープとは、エスケープ文字の本来の意味を意味します。エスケープ文字の目的は...
UNIONの使用ほとんどの SQL クエリは、1 つ以上のテーブルからデータを返す単一の SELEC...
以前、開発中に背景レイヤーにカラーマスクを追加する必要のあるプロジェクトに遭遇しました。ここでは、背...
まず、Webフロントエンドエンジニアの価値についてお話ししましょう。現在、Web製品のインタラクショ...
テンプレート <el-table :data="データリスト"> &...