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 エラー問題 (概要)

推薦する

Mysql GTID Mha 設定方法

Gtid + Mha + Binlog サーバー構成: 1: テスト環境OS: CentOS 6.5...

mysql8.0.20 のダウンロードとインストールおよび発生した問題 (図とテキスト)

1.ブラウザでmysqlを検索してダウンロードしてインストールしますアドレス: https://d...

Linux 上で Python3.6 をコンパイルしてインストールするための詳細なチュートリアル

1. まず、公式ウェブサイト https://www.python.org/downloads/so...

Linuxターミナルでファイルを作成する2つの一般的な方法を簡単に理解する

mkdir コマンドを使用して新しいディレクトリを作成できることは誰もが知っていますが、多くの場合、...

WeChat アプレットのカスタム下部ナビゲーション バー コンポーネント

この記事の例では、WeChatアプレットの下部ナビゲーションバーコンポーネントの具体的な実装コードを...

MySQL の自動増分主キーが使い果たされた場合の対処方法

面接では、次のようなシナリオを経験する必要があります。インタビュアー: 「MySQL を使用したこと...

Vueはタブ切り替えの虫眼鏡効果を実装します

この記事では、タブ切り替えの虫眼鏡効果を実現するためのVueの具体的なコードを例として紹介します。具...

Vue3のいくつかの利点についての簡単な説明

目次1. ソースコード1.1 モノレポ1.2 タイプスクリプト2. パフォーマンス2.1 ソースコー...

jQueryは画像追従効果を実現します

この記事では、画像フォロー効果を実現するためのjQueryの具体的なコードを参考までに紹介します。具...

Mysqlは日付範囲の抽出方法を指定します

データベースを操作する過程では、いくつかの指標を日付別にまとめたり、一定期間内の合計金額をカウントし...

HTMLポップアップ透明レイヤーインスタンスのサイズを設定でき、比例することができます

コードをコピーコードは次のとおりです。 <!DOCTYPE html PUBLIC "...

Linux で iostat コマンドを使用するチュートリアル

序文運用・保守を行う人がスキルを持っていなければ、サーバーを操作するのに恥ずかしさを感じてしまうと言...

Mac Docker x509証明書の問題を解決する

質問最近、プライベートミラーセンターにログインする必要がありましたが、ログイン時にエラーメッセージが...

ESXI の仮想マシンにワークステーションをインストールするときに発生するネットワーク障害の解決策

問題の説明ESXI で Windows にワークステーションをインストールした後、内部の仮想マシンは...

Vue でインデックスをキー属性値として使用することが推奨されないのはなぜですか?

目次序文キーの役割差分アルゴリズムにおけるキーの役割ヘッドノードを同期するテールノードを同期する新し...