Vueはテーマ切り替えのための複数のアイデアを実装します

Vueはテーマ切り替えのための複数のアイデアを実装します

テーマを動的に変更する

最初に解決する必要があるのは、どのテーマを表示する必要があるかを把握し、動的に切り替える方法です。私が選択した方法は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つのメインファイルに分割しました。

  • _variable.scss 変数管理ファイル
  • var()はCSS3で提案されたスタイル変数を宣言するためのメソッドです。
  • var(属性名, 属性値) 属性値は文字列にはできないことに注意してください
// テーマの切り替え $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で定義された変数を変更することができます
document.getElementsByTagName("body")[0].style.setProperty("プロパティ名", "置き換えられたプロパティ値f");

// テーマの切り替え 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 の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • VUEプロジェクトでテーマ切り替えを実装するさまざまな方法
  • Vue + Scss でテーマカラーを動的に切り替えてスキニングを実現するサンプルコード
  • Vue コンポーネント ライブラリのオンライン テーマ エディターの実装アイデア
  • Vueオンライン動的切り替えテーマカラースキーム
  • ショッピングモールテーマを開発するためのvue+elementのサンプルコード
  • Vue+webpack テーマ変更 N ソリューションの長所と短所の分析
  • Vue でウェブサイトのルーティングに基づいてページのテーマカラーを決定する方法
  • VueのelementUIはカスタムテーマメソッドを実装します

<<:  Linux での MySQL のインストールに関する詳細なチュートリアル

>>:  組み込み移植 docker エラー問題 (概要)

推薦する

URLに基​​づいてリクエストを転送するnginxの実装の実践経験

序文これは fastdfs を使用してイントラネット外部に展開された分散ファイルシステムであるためで...

MySQLからClickHouseに移行する5つの方法

データ移行は、MySQL から ClickHouse にインポートする必要があります。概要プランは以...

Vue は div の高さをドラッグ可能にします

この記事では、divのドラッグ可能な高さを実現するためのVueの具体的なコードを参考までに共有します...

CSS3 フリップカード番号サンプルコード

今日会社から課題をもらったのですが、効果図は以下のとおりです。 どのような効果を実現したいかは特に決...

sqlmap インジェクションの詳細なグラフィック説明

目次1. この Web サイトには SQL インジェクションの脆弱性がある可能性があることが判明しま...

Vue-Jest自動テストの基本構成の詳しい説明

目次インストール構成よくある間違い事前テスト作業依存関係の扱いインスタンスとDOMを生成する要約する...

Win10にmysql8.0.15 winx64をインストールしてサーバーに接続する際に問題が発生しました

1. mysql-8.0.15をダウンロード、インストール、設定する1. 公式サイト (https:...

JavaScript カウントダウン プロンプト ボックス

この記事の例では、カウントダウンプロンプトボックスを実装するためのJavaScriptの具体的なコー...

JavaScriptのループの違いについての詳細な説明

目次序文列挙可能なプロパティ反復可能なオブジェクトforEachメソッドとmapメソッドチェーン呼び...

zabbix を使用して ogg プロセスを監視する (Linux プラットフォーム)

以前作成されたデータベースの ogg プロセスは、発見されるまでの約半月間ダウンしていました。起動で...

MySQL における ESCAPE キーワードの使用法の詳細な説明

MySQL エスケープエスケープとは、エスケープ文字の本来の意味を意味します。エスケープ文字の目的は...

MySQL複合クエリの詳細な説明

UNIONの使用ほとんどの SQL クエリは、1 つ以上のテーブルからデータを返す単一の SELEC...

CSS3で背景画像にカラーマスクを追加する方法

以前、開発中に背景レイヤーにカラーマスクを追加する必要のあるプロジェクトに遭遇しました。ここでは、背...

ウェブフロントエンドエンジニアにおすすめのヒント

まず、Webフロントエンドエンジニアの価値についてお話ししましょう。現在、Web製品のインタラクショ...

Vue イベントの $event パラメータ = イベント値の場合

テンプレート <el-table :data="データリスト"> &...