テーマを動的に変更する最初に解決する必要があるのは、どのテーマを表示する必要があるかを把握し、動的に切り替える方法です。私が選択した方法は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 のインストールに関する詳細なチュートリアル
データのバックアップ操作は非常に簡単です。次のコマンドを実行します。 docker run --vo...
目次序文やることリストやるだけ地図を準備するインスタンスをバックアップ用に保存するタイマーカルーセル...
実は多くの会社がユーザー権限ツリーに似た機能を持っています。最近、追加、削除、修正のツリー構造を書き...
MySQL スロー ログは、MySQL DBA やその他の開発および運用担当者が細心の注意を払う必要...
ps: 環境はタイトル通りです依存関係をインストールする yum インストール openssl-de...
XHTML には多くのタグがありますが、頻繁に使用されるのはごくわずかであり、習得する必要があるのは...
簡単に言うと、ウェアハウスとして使用される仮想マシンの IP は 192.168.149.129 で...
多くの人が MySQL の起動時にこのエラーに遭遇しています。まず、このエラーの前提は、サービス ス...
目次序文なぜいくらですか?パラメータの数デフォルトパラメータ残りのパラメータ要約する序文今日は関数の...
1. Docker とは何ですか?仮想マシンについては誰もが知っています。Windows に Li...
しばらくReactを勉強した後、実践してみたいと思います。そこで、個人のブログのウェブサイトを再構築...
目次1. 変数意味のある名前を使う不必要なコンテキストを追加しないようにするハードコードされた値を避...
1. ダウンロードアドレスhttps://dev.mysql.com/downloads/mysql...
コードをコピーコードは次のとおりです。 <ヘッド> <meta http-equi...
1. ベクターマップベクター グラフィックスは直線と曲線を使用してグラフィックスを表します。これらの...