動的なクラス名をコンポーネントに追加できることは、非常に強力な機能です。これにより、カスタム テーマを作成したり、コンポーネントの状態に基づいてクラスを追加したり、スタイルに依存するコンポーネントのさまざまなバリエーションを作成したりすることが容易になります。
動的クラス名の追加は、prop :class="classname"
をコンポーネントに追加するのと同じくらい簡単です。 classname
が何に評価されるかは、コンポーネントに追加されるクラス名になります。
もちろん、Vue の動的クラスを使用してできることはさらにたくさんあります。この記事では、次のことについて詳しく説明します。
Vue では、静的クラスと動的クラスをコンポーネントに追加できます。
静的クラスは決して変更されない退屈なクラスであり、コンポーネント内に常に存在します。一方、アプリケーションに動的クラスを追加したり削除したりすることもできます。
静的クラスの追加は、通常の HTML での追加とまったく同じです
<template> <span class="description"> This is how you add static classes in Vue. </span> </template>
動的クラスは非常に似ていますが、Vue の特別な属性構文 v-bind## を使用する必要があります#、JS 式をクラスにバインドするには:
<template> <span v-bind:class="'description'"> This is how you add static classes in Vue. </span> </template>
v-bind 構文が JS 値として渡すものをすべて受け入れるためです。引用符を追加すると、Vue がそれを文字列として扱うようになります。
v-bind:
<template> <span :class="'description'"> This is how you add static classes in Vue. </span> </template>
<template> <span class="description" :class="theme" > This is how you add static classes in Vue. </span> </template> export default { data() { return { theme: 'blue-theme', }; } }; ---------------------------------------- .blue-theme { color: navy; background: white; }
theme がコンテンツです。クラス名の変数を適用します。
v-bind は任意の JS 式を受け入れることができるため、これを使用して非常に優れた処理を行うことができます。私のお気に入りは、テンプレートで三項式を使用することです。これは非常にクリーンで読みやすい傾向があります。
<template> <span class="description" :class="darkMode ? 'dark-theme' : 'light-theme'" > This is how you add dynamic classes in Vue. </span> </template>
darkMode が
true の場合、
dark-theme がクラス名として使用されます。それ以外の場合は、
ライトテーマを選択します。
<template> <span class="description" :class="[ fontTheme, darkMode ? 'dark-theme' : 'light-theme', ]" > This is how you add dynamic classes in Vue. </span> </template>
fontTheme の値は、フォントの外観を変更するクラス名です。前の例では、
darkMode 変数を使用して、
dark-theme と
light-theme を切り替えることができます。
<template> <span class="description" :class="{ 'dark-theme': darkMode, 'light-theme': !darkMode, ]" > This is how you add dynamic classes in Vue. </span> </template>
dark-theme と
light-theme という 2 つのキーが含まれています。以前に実装したロジックと同様に、
darkMode の値に基づいてこれらのテーマを切り替えたいと考えています。
darkMode が
true の場合、
dark-theme が動的クラス名として要素に適用されます。ただし、
!darkMode 値が
false であるため、
light-them は適用されません。
<template> <MovieList :movies="movies" :genre="genre" /> </template>
:class 属性を追加するだけです。
<template> <MovieList :movies="movies" :genre="genre" :class="darkMode ? 'dark-theme' : 'light-theme'" /> </template>
MovieList## のルート要素に直接配置されているためです。 # クラスをセットアップします。 コンポーネントに
を設定すると、Vue はこれらのプロパティを、コンポーネントの props
セクションで指定されたプロパティと比較します。一致するものがあれば、通常の小道具として渡されます。それ以外の場合、Vue はそれをルート DOM 要素に追加します。 ここで、
は class
属性を指定していないため、Vue はルート要素に設定する必要があることを認識しています。 ただし、動的クラス名を使用すると、さらに高度な処理を行うことができます。
クラス名をすばやく生成する
さまざまな種類のボタンすべてに 20 の異なる CSS スタイルを提供する
Button コンポーネントがあるとします。 <p>你可能不想花一整天的时间把每一项都写出来,也不想把开关的逻辑都写出来。相反,我们将动态生成要应用的类的名称。</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:js;toolbar:false;"><template>
<span
class="description"
:class="theme"
>
This is how you add static classes in Vue.
</span>
</template>
export default {
data() {
return {
theme: &#39;blue-theme&#39;,
};
}
};
.blue-theme {
color: navy;
background: white;
}</pre><div class="contentsignin">ログイン後にコピー</div></div><p>我们可以设置一个变量来包含我们想要的任何类名的字符串。如果我们想对<code>Button
组件执行此操作,则可以执行以下简单操作:
<template> <button @click="$emit('click')" class="button" :class="theme" > {{ text }} </button> </template> export default { props: { theme: { type: String, default: 'default', } } }; .default {} .primary {} .danger {}
现在,使用Button
组件的任何人都可以将theme
属性设置为他们想要使用的任何主题。
如果没有设置任何类,它将添加.default
类。如果将其设置为primary
,则会添加.primary
类。
最终,模板中的表达式将变得过于复杂,并将开始变得非常混乱和难以理解。幸运的是,我们有一个简单的解决方案,就是使用计算民属性:
<template> <MovieList :movies="movies" :genre="genre" :class="class" /> </template> export default { computed: { class() { return darkMode ? 'dark-theme' : 'light-theme'; } } };
这不仅易于阅读,而且还可以轻松添加新功能并在将来进行重构。
英文原文地址:https://forum.vuejs.org/t/add-a-dynamically-generated-class-name-to-components-class-attribute-from-mixin/27626
为了保证的可读性,本文采用意译而非直译。
相关推荐:
更多编程相关知识,请访问:编程教学!!
以上がVueでクラス名を動的に追加する方法を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。