小道具
このページは、コンポーネントの基本を読んでいることを前提としています。コンポーネントについてまだよく知らない場合は、最初に読むことをお勧めします。
#ディレクトリ
- #Prop Type ##静的または動的 Prop
- 数値を渡します
#プロップケース (キャメルケースとケバブケース)
HTML 内の属性名では大文字と小文字が区別されないため、ブラウザはすべての大文字を小文字として解釈します。これは、DOM でテンプレートを使用する場合、キャメルケース プロップ名には同等のケバブケース (ダッシュ区切りの命名) 名を使用する必要があることを意味します。 Vue.component('blog-post', {
// 在 JavaScript 中是 camelCase 的
props: ['postTitle'],
template: '<h3>{{ postTitle }}</h3>'
})
<!-- 在 HTML 中是 kebab-case 的 -->
<blog-post post-title="hello!"></blog-post>
もう一度、文字列テンプレートを使用する場合、この制限は適用されません。存在しない。
Prop type
これまでのところ、Listed 形式の文字列配列のみを確認してきました。 props: props: ['title', 'likes', 'isPublished', 'commentIds', 'author']
ただし、通常は、各プロパティに指定された値の型を持たせる必要があります。この時点で、オブジェクト形式でプロップをリストできます。これらのプロパティの名前と値は、プロップのそれぞれの名前とタイプです: props: {
title: String,
likes: Number,
isPublished: Boolean,
commentIds: Array,
author: Object,
callback: Function,
contactsPromise: Promise // or any other constructor
}
これは、コンポーネントのドキュメントを提供するだけでなく、ユーザーがブラウザの JavaScript コンソールからプロンプトを表示されたときに、間違ったタイプがプロンプトされる場合にドキュメントを提供します。このページの残りの部分では、型チェックとその他のプロパティの検証
について説明します。
静的または動的 Prop を渡す
次のように、静的な値を prop に渡すことができることはすでにご存知でしょう。
<blog-post title="My journey with Vue"></blog-post>
また、v-bind
を通じて prop を動的に割り当てることができることもご存知でしょう。たとえば:
<!-- 动态赋予一个变量的值 --> <blog-post v-bind:title="post.title"></blog-post> <!-- 动态赋予一个复杂表达式的值 --> <blog-post v-bind:title="post.title + ' by ' + post.author.name" ></blog-post>
上記の 2 つの例では、渡す値はすべて文字列です。タイプ. ですが、実際には、任意のタイプの値を prop に渡すことができます。
#番号を入力してください
<!-- 即便 `42` 是静态的,我们仍然需要 `v-bind` 来告诉 Vue --> <!-- 这是一个 JavaScript 表达式而不是一个字符串。--> <blog-post v-bind:likes="42"></blog-post> <!-- 用一个变量进行动态赋值。--> <blog-post v-bind:likes="post.likes"></blog-post>
ブール値を渡す
<!-- 包含该 prop 没有值的情况在内,都意味着 `true`。--> <blog-post is-published></blog-post> <!-- 即便 `false` 是静态的,我们仍然需要 `v-bind` 来告诉 Vue --> <!-- 这是一个 JavaScript 表达式而不是一个字符串。--> <blog-post v-bind:is-published="false"></blog-post> <!-- 用一个变量进行动态赋值。--> <blog-post v-bind:is-published="post.isPublished"></blog-post>
##配列を渡す<!-- 即便数组是静态的,我们仍然需要 `v-bind` 来告诉 Vue -->
<!-- 这是一个 JavaScript 表达式而不是一个字符串。-->
<blog-post v-bind:comment-ids="[234, 266, 273]"></blog-post>
<!-- 用一个变量进行动态赋值。-->
<blog-post v-bind:comment-ids="post.commentIds"></blog-post>
オブジェクトを渡す<!-- 即便对象是静态的,我们仍然需要 `v-bind` 来告诉 Vue -->
<!-- 这是一个 JavaScript 表达式而不是一个字符串。-->
<blog-post
v-bind:author="{
name: 'Veronica',
company: 'Veridian Dynamics'
}"
></blog-post>
<!-- 用一个变量进行动态赋值。-->
<blog-post v-bind:author="post.author"></blog-post>
オブジェクトのすべてのプロパティを props として渡したい場合は、パラメータ # なしで v-bind## を使用できます ( # を置き換えます) ##v-bind:prop-name
)。たとえば、特定のオブジェクトpost:
post: { id: 1, title: 'My Journey with Vue' }
の場合、次のテンプレート:
<blog-post v-bind="post"></blog-post>
は次と同等です:
<blog-post v-bind:id="post.id" v-bind:title="post.title" ></blog-post>
一方向のデータ フロー
すべてのプロップは、親プロップと子プロップの間で 一方向の下向きバインディングを形成します : 親プロパティへの更新は子コンポーネントに下流に流れますが、その逆はありません。これにより、子コンポーネントが親コンポーネントの状態を誤って変更し、アプリケーションのデータ フローが理解しにくくなるのを防ぐことができます。
さらに、親コンポーネントが更新されるたびに、子コンポーネント内のすべてのプロパティが最新の値に更新されます。これは、子コンポーネント内の props を変更すべきではないということを意味します。これを行うと、Vue はブラウザーのコンソールに警告を発行します。
プロップを変更しようとする一般的な状況は 2 つあります:
1.このプロップは初期値を渡すために使用され、サブコンポーネントはそれをローカル値として使用したいと考えます。使用するプロップデータ。 この場合、ローカル データ属性を定義し、このプロパティを初期値として使用することが最善です:
props: ['initialCounter'], data: function () { return { counter: this.initialCounter } }2.
このプロパティはプリミティブ値として渡され、変換が必要です。
この場合、この prop の値を使用して計算プロパティを定義するのが最善です:props: ['size'], computed: { normalizedSize: function () { return this.size.trim().toLowerCase() } }JavaScript ではオブジェクトと配列は参照によって渡されることに注意してください。またはオブジェクト タイプ プロパティ、子コンポーネント内のオブジェクトまたは配列自体を変更すると、親コンポーネントの状態に 影響します。
プロパティの検証
既知のタイプなど、コンポーネントのプロパティの検証要件を指定できます。要件が満たされていない場合、Vue はブラウザー コンソールに警告を表示します。これは、他の人が使用するコンポーネントを開発する場合に特に役立ちます。
プロパティの検証方法をカスタマイズするには、文字列の配列の代わりに、
props
の値の検証要件を含むオブジェクトを提供します。例:Vue.component('my-component', { props: { // 基础的类型检查 (`null` 和 `undefined` 会通过任何类型验证) propA: Number, // 多个可能的类型 propB: [String, Number], // 必填的字符串 propC: { type: String, required: true }, // 带有默认值的数字 propD: { type: Number, default: 100 }, // 带有默认值的对象 propE: { type: Object, // 对象或数组默认值必须从一个工厂函数获取 default: function () { return { message: 'hello' } } }, // 自定义验证函数 propF: { validator: function (value) { // 这个值必须匹配下列字符串中的一个 return ['success', 'warning', 'danger'].indexOf(value) !== -1 } } } })prop の検証が失敗すると、Vue (開発環境のビルド バージョン) はコンソール警告を生成します。
これらのプロパティは、コンポーネント インスタンスが作成される 前に検証されるため、インスタンスのプロパティ (data
、
computed など) が検証されることに注意してください。など) は、
defaultまたは
validator関数では使用できません。
#型チェック
typeは次のネイティブ コンストラクターに含めることができます。 :
- 文字列
##数値
##ブール値
配列
##オブジェクト
日付
関数
シンボル
- を通じてチェックされます。たとえば、既製のコンストラクター
さらに、
instanceoftype
はカスタム コンストラクターにすることもでき、function Person (firstName, lastName) { this.firstName = firstName this.lastName = lastName }がある場合、
new に渡されることを確認できます。人を使用して、
Vue.component('blog-post', { props: { author: Person } })author
プロパティの値がが作成されました。
#非プロパティ属性
非プロパティ属性がコンポーネントに渡されます、ただし、コンポーネントには、対応するプロップによって定義された特性がありません。 ただし、明示的に定義された props はサブコンポーネントに情報を渡すのに適しているため、コンポーネント ライブラリの作成者は、コンポーネントがどのようなシナリオで使用されるかを常に予測できるわけではありません。このため、コンポーネントは任意の属性を受け入れることができ、これらの属性はコンポーネントのルート要素に追加されます。 たとえば、サードパーティの
<input> を必要とするブートストラップ プラグインを介して、サードパーティの
<bootstrap-date-input>コンポーネントを使用するとします。 ;
はdata-date-picker
機能を使用します。この属性をコンポーネント インスタンスに追加できます:<bootstrap-date-input data-date-picker="activated"></bootstrap-date-input>これにより、この
data-date-picker="activated"属性がルート上の
。
既存の機能を置き換え/マージ
Imagine
<bootstrap-date -input> テンプレートは次のとおりです:
<input type="date" class="form-control">日付ピッカー プラグインのテーマをカスタマイズするには、次のような特別なクラス名を追加する必要がある場合があります:
<bootstrap-date-input data-date-picker="activated" class="date-picker-theme-dark" ></bootstrap-date-input>この場合、2 つの異なる
class の値を定義します。
:ほとんどの機能では、外部から提供されます。コンポーネントの値は、コンポーネント内で内部的に設定される値。したがって、
#form-control
、コンポーネントのテンプレートに設定されます
date-picker-theme-dark
、コンポーネントの親から渡されます
type="text"
が渡されると、
type="date"は置き換えられて破棄されます。幸いなことに、
class属性と
style属性はもう少し賢いものです。つまり、両側の値が結合されて最終値が得られます:
form-control date-picker-テーマ-ダーク。
属性継承を無効にする
ルートが必要ない場合コンポーネントの要素 属性を継承するには、コンポーネントのオプションで inheritAttrs: false を設定できます。例:
$attrsこれは、コンポーネントに渡される属性名と属性値を含む、インスタンスの
Vue.component('my-component', { inheritAttrs: false, // ... })属性での使用に特に適しています。例:
inheritAttrs: falsehas
{ required: true, placeholder: 'Enter your username' }および
注:$attrs
を使用すると、これらの属性をどの要素に割り当てるかを手動で決定できます。基本コンポーネント
:Vue.component('base-input', { inheritAttrs: false, props: ['label', 'value'], template: ` <label> {{ label }} <input v-bind="$attrs" v-bind:value="value" v-on:input="$emit('input', $event.target.value)" > </label> ` })inheritAttrs: falseオプション
は # バインディングには影響しません
style と class。
このモードでは、どの要素が実際のルート要素であるかを気にすることなく、基本コンポーネントを生の HTML 要素のように使用できます:
<base-input v-model="username" required placeholder="Enter your username" ></base-input>