ホームページ ウェブフロントエンド jsチュートリアル Vue で style のスコープ属性を使用する方法

Vue で style のスコープ属性を使用する方法

Jun 23, 2018 pm 05:55 PM
style vue

この記事では主に Vue の style のスコープ属性を紹介しますが、これは非常に優れていると編集者が考えているので、参考にしてください。エディターをフォローして見てみましょう

vue コンポーネントでは、スタイルをプライベート化 (モジュール化) し、グローバル世界を汚染しないようにするために、スタイル タグにscoped 属性を追加して、現在のスタイルにのみ属することを示すことができます。これは非常に良い方法ですが、注意して使用する必要があるのはなぜですか?パブリック コンポーネント (サードパーティ ライブラリまたはプロジェクトでカスタマイズされたコンポーネント) のスタイルを変更する必要がある場合、スコープを指定するとさらに困難が発生し、さらに複雑さが必要になることが多いためです。

プライベート化されたスタイルのスコープ付き実装の原則

なぜ複雑さが増すと思いますか?それでは、モジュール実装の原則から始めましょう。命名の便宜上、この種のコンポーネントをモジュールプライベートコンポーネントと呼び、その他のスコープ外のコンポーネントをモジュール一般コンポーネントと呼ぶことにします。

DOM 構造を調べると、vue が DOM 構造と CSS スタイルに重複しない一意のタグを追加して、一意性を確保し、スタイルのプライベート化とモジュール化の目的を達成していることがわかりました。具体的なレンダリング結果を例を挙げて説明します。

パブリックコンポーネントボタンコンポーネント

パブリックコンポーネントボタンは、スタイルをモジュール化するためにそれにスコープ属性を追加します

//button.vue
<template>
  <p class="button-warp">
    <button class="button">text</button>
  </p>
</template>
...
<style scoped>
  .button-warp{
    display:inline-block;
  }
  .button{
    padding: 5px 10px;
    font-size: 12px;
    border-radus: 2px;
  }
</style>
ログイン後にコピー

ブラウザはボタンコンポーネントをレンダリングします

によってレンダリングされるHTML部分のボタンコンポーネントブラウザと CSS 部分は次のとおりです:

<p data-v-2311c06a class="button-warp">
  <button data-v-2311c06a class="button">text</button>
</p>
ログイン後にコピー
.button-warp[data-v-2311c06a]{
  display:inline-block;
}
.button[data-v-2311c06a]{
  padding: 5px 10px;
  font-size: 12px;
  border-radus: 2px;
}
ログイン後にコピー

上記の言葉からわかるように、コンポーネント スタイルのモジュール化を実現するために、スコープ付き属性が追加されたコンポーネントに対して 2 つのプロセスが実行されます:

  1. 重複しないデータを追加するHTML DOM ノード属性 (data-v-2311c06a など) にその一意性を示す

  2. 各 CSS セレクター (コンパイルおよび生成された CSS ステートメント) の最後に、現在のコンポーネントのデータ属性セレクター (例: as [ data-v-2311c06a]) を使用してスタイルをプライベート化します

CSS スタイルが優先されることは誰もが知っていますが、スコープ付きのこの操作によりコンポーネント スタイルをモジュール化するという目的は達成されますが、次のような結果が生じます。増加: 理論上、このスタイルを変更したい場合は、このスタイルをカバーするためにより高いウェイトが必要になります。これは、複雑さを増す要素の 1 つです。

他のコンポーネントはボタンコンポーネントを参照します

上記は単一コンポーネントのレンダリングの結果を分析していますが、コンポーネントが相互に呼び出した後の結果はどうなるでしょうか?具体的には 2 つの状況に分けられます: モジュール一般コンポーネントがモジュール プライベート コンポーネントを参照する (モジュール プライベート コンポーネントがモジュール一般コンポーネントを参照するのと本質的に同じ)。

例: button コンポーネントが content.vue コンポーネントで使用されている場合、content.vue コンポーネントがスコープ属性を追加するかどうかでレンダリング結果にどのような違いがありますか?

//content.vue
<template>
  <p class="content">
    <p class="title"></p>
    <!-- v-button假设是上面定义的组件 -->
    <v-button></v-button>
  </p>
</template>
...
<style>
  .content{
    width: 1200px;
    margin: 0 auto;
  }
  .content .button{
    border-raduis: 5px;
  }
</style>
ログイン後にコピー

モジュールの一般コンポーネント (スコープされていない) は、モジュールのプライベート コンポーネントを参照します

スコープされた属性がスタイルに追加されていない場合、レンダリングされる HTML と CSS は次のようになります:

<p class="content">
  <p class="title"></p>
  <!-- v-button假设是上面定义的组件 -->
  <p data-v-2311c06a class="button-warp">
    <button data-v-2311c06a class="button">text</button>
  </p>
</p>
ログイン後にコピー
/*button.vue渲染出来的css*/
.button-warp[data-v-2311c06a]{
  display:inline-block;
}
.button[data-v-2311c06a]{
  padding: 5px 10px;
  font-size: 12px;
  border-radus: 2px;
}
/*content.vue渲染出来的css*/
.content{
  width: 1200px;
  margin: 0 auto;
}
.content .button{
  border-raduis: 5px;
}
ログイン後にコピー

コンテンツ コンポーネントでは、ボタンの border-raduis 属性が変更されていますが、重みの関係により、コンポーネント内のスタイルが引き続き有効になります (この時点では、外部スタイルはオーバーライドされます)。したがって、スタイルを変更するという目的を達成したい場合は、変更したいスタイルの重みを増やす必要があります (セレクター レベル、ID セレクター、並列セレクター、重要などを追加します)

モジュール プライベート コンポーネント (スコープ付きのコンポーネントを追加) ) 参照モジュールのプライベートコンポーネント

scoped 属性を追加するとどうなるでしょうか?最初に分析したルールによると (これも当てはまります):

最初にすべての DOM ノードにデータ属性を追加します

次に CSS セレクターの最後にデータ属性セレクターを追加します

その後、レンダリングされた HTML と CSS は次のようになりますそれぞれ:

<p data-v-57bc25a0 class="content">
  <p data-v-57bc25a0 class="title"></p>
  <!-- v-button假设是上面定义的组件 -->
  <p data-v-57bc25a0 data-v-2311c06a class="button-warp">
    <button data-v-2311c06a class="button">text</button>
  </p>
</p>
ログイン後にコピー
/*button.vue渲染出来的css*/
.button-warp[data-v-2311c06a]{
  display:inline-block;
}
.button[data-v-2311c06a]{
  padding: 5px 10px;
  font-size: 12px;
  border-radus: 2px;
}
/*content.vue渲染出来的css*/
.content[data-v-57bc25a0]{
  width: 1200px;
  margin: 0 auto;
}
.content .button[data-v-57bc25a0]{
  border-raduis: 5px;
}
ログイン後にコピー

上記 2 つの状況では、レンダリング結果が大きく異なることがはっきりとわかります。

コンテンツ内にボタンコンポーネントのスタイルを変更したいコードを追加しましたが、よく見ると、 .content .button 文の最後にコンテンツコンポーネントのスコープ付きタグが追加されているため、最後の文は実際にはDOM ノードにはまったく影響しないため、この場合、コンテンツ内に記述したスタイルは button.vue コンポーネントに影響を与えないため、これは恥ずかしいことです。 。 。 。

もちろん、この問題も解決できます。つまり、グローバル スタイルを直接追加して変更することもできますが、これは必然的にすべての場所のコンポーネントに影響を与えるため、スコープ付き属性のないスタイルを追加するには別の方法が必要です。 content.vue コンポーネント。これは、プライベート スタイル用とパブリック スタイル用の 2 つのスタイルを追加することを意味します。これは間違いなくちょっとひどいもので、どちらの解決策も重量という 1 つの問題を回避できません。 ! !

rreee

これは規制に準拠していますか?このように書くことができないことを私は見ていなかったようで、それが効果を発揮しました。 。 。しかし、これでは思考が複雑になり、少し面倒になります。

スコープ付きのレンダリング ルールを要約する

スコープ付き

  1. の 3 つのレンダリング ルールを要約する HTML DOM ノードに非反復データ属性 (形式: data-v-2311c06a) を追加して、その一意性を表現します

  2. 各 CSS セレクター (コンパイルおよび生成された CSS ステートメント) の最後に現在のコンポーネントのデータ属性セレクター ([data-v-2311c06a] など) を追加して、スタイルをプライベート化します

  3. コンポーネントが内部の場合他のコンポーネントが含まれている場合、現在のコンポーネントのデータ属性のみが他のコンポーネントの最も外側のタグに追加されます

解決策

参照先のサードパーティライブラリの場合、相手がスコープ付きを使用している場合、追加することはできません本当にスタイルを変更する必要がある場合は、スコープ外のコンポーネントでスタイルを変更するか、グローバル スタイルを直接変更するのが最善です。

保守するコンポーネントについては、コンポーネントのスタイルがあらゆる状況に対応できるかどうかを明確に考える必要があります。本当に追加する必要がある場合、このコンポーネントを使用する開発者の作業は間違いなく増加します。

もちろん、この問題に対するより良い解決策がある場合は、教えてください。

興味深い事実

スコープを使用する場合は、スコープのこの機能に注意する必要があります。私はバグだと思ったので、 という問題を提起しました。非常に横暴な返答
スコープ付きデザイン 本来の目的は、デザイン上の理由から、現在のコンポーネントのスタイルが他のコンポーネントのスタイルを変更しないようにすることです。ということで、もちろんこの問題は終了しました

以上が皆さんのためにまとめたもので、今後皆さんのお役に立てれば幸いです。

関連記事:

Nodejsの暗号モジュールのセキュリティ知識について(詳細なチュートリアル)

Angularでドロップダウンボックスのファジークエリ関数を実装する方法

jsでスライド検証を必要とするログインを実装する方法

以上がVue で style のスコープ属性を使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

VUEのボタンに関数を追加する方法 VUEのボタンに関数を追加する方法 Apr 08, 2025 am 08:51 AM

HTMLテンプレートのボタンをメソッドにバインドすることにより、VUEボタンに関数を追加できます。 VUEインスタンスでメソッドを定義し、関数ロジックを書き込みます。

VueでBootstrapの使用方法 VueでBootstrapの使用方法 Apr 07, 2025 pm 11:33 PM

vue.jsでBootstrapを使用すると、5つのステップに分かれています。ブートストラップをインストールします。 main.jsにブートストラップをインポートしますブートストラップコンポーネントをテンプレートで直接使用します。オプション:カスタムスタイル。オプション:プラグインを使用します。

vue.jsでJSファイルを参照する方法 vue.jsでJSファイルを参照する方法 Apr 07, 2025 pm 11:27 PM

vue.jsでJSファイルを参照するには3つの方法があります。タグ;; mounted()ライフサイクルフックを使用した動的インポート。 Vuex State Management Libraryを介してインポートします。

VueでWatchの使用方法 VueでWatchの使用方法 Apr 07, 2025 pm 11:36 PM

Vue.jsの監視オプションにより、開発者は特定のデータの変更をリッスンできます。データが変更されたら、Watchはコールバック関数をトリガーして更新ビューまたはその他のタスクを実行します。その構成オプションには、すぐにコールバックを実行するかどうかを指定する即時と、オブジェクトまたは配列の変更を再帰的に聴くかどうかを指定するDEEPが含まれます。

Vueによる前のページに戻る方法 Vueによる前のページに戻る方法 Apr 07, 2025 pm 11:30 PM

vue.jsには、前のページに戻る4つの方法があります。$ router.go(-1)$ router.back()outes&lt; router-link to =&quot;/&quot; Component Window.history.back()、およびメソッド選択はシーンに依存します。

Vue Multi-Page開発とはどういう意味ですか? Vue Multi-Page開発とはどういう意味ですか? Apr 07, 2025 pm 11:57 PM

VUEマルチページ開発は、VUE.JSフレームワークを使用してアプリケーションを構築する方法です。アプリケーションは別々のページに分割されます。コードメンテナンス:アプリケーションを複数のページに分割すると、コードの管理とメンテナンスが容易になります。モジュール性:各ページは、簡単に再利用および交換するための別のモジュールとして使用できます。簡単なルーティング:ページ間のナビゲーションは、単純なルーティング構成を介して管理できます。 SEOの最適化:各ページには独自のURLがあり、SEOに役立ちます。

Vueのバージョンを照会する方法 Vueのバージョンを照会する方法 Apr 07, 2025 pm 11:24 PM

Vue Devtoolsを使用してブラウザのコンソールでVueタブを表示することにより、Vueバージョンを照会できます。 NPMを使用して、「NPM List -G Vue」コマンドを実行します。 package.jsonファイルの「依存関係」オブジェクトでVueアイテムを見つけます。 Vue CLIプロジェクトの場合、「Vue -Version」コマンドを実行します。 &lt; script&gt;でバージョン情報を確認してくださいVueファイルを参照するHTMLファイルにタグを付けます。

Function Intercept Vueの使用方法 Function Intercept Vueの使用方法 Apr 08, 2025 am 06:51 AM

VUEの関数傍受は、指定された期間内に関数が呼び出され、パフォーマンスの問題を防ぐ回数を制限するために使用される手法です。実装方法は次のとおりです。LodashLibrary:Import {Debounce}から「Lodash」からインポート。 debounce関数を使用して、インターセプト関数を作成します。インターセプト関数を呼び出すと、制御関数は500ミリ秒でせいぜい1回呼び出されます。

See all articles