Vue.js コンポーネントの使用法と開発例のチュートリアル

高洛峰
リリース: 2016-12-08 11:57:38
オリジナル
1353 人が閲覧しました

コンポーネント

コンポーネントは、HTML 要素を拡張し、再利用可能なコードをカプセル化できます。高レベルでは、コンポーネントは、vue.js のコンパイラーによって特別な機能を追加することもできます。 is 属性で拡張されたネイティブ HTML 要素。

Vue.js コンポーネントは、事前定義された動作を持つ ViewModel クラスとして理解できます。コンポーネントは多くのオプションを事前定義できますが、主なものは次のとおりです:

テンプレート (テンプレート): テンプレートは、データと最終的にユーザーに表示される DOM の間のマッピング関係を宣言します。

初期データ (data): コンポーネントの初期データ状態。再利用可能なコンポーネントの場合、これは通常プライベート状態です。

受け入れられる外部パラメータ (小道具): データはパラメータを通じてコン​​ポーネント間で転送および共有されます。パラメータはデフォルトで一方向 (上から下) にバインドされますが、明示的に双方向として宣言することもできます。

メソッド: データへの変更は通常、コンポーネントのメソッド内で実行されます。ユーザー入力イベントとコンポーネント メソッドは、v-on ディレクティブを通じてバインドできます。

ライフサイクルフック: コンポーネントは、作成、アタッチ、破棄などの複数のライフサイクルフック関数をトリガーします。これらのフック関数では、いくつかのカスタム ロジックをカプセル化できます。従来の MVC と比較すると、Controller のロジックがこれらのフック関数に分散されていることがわかります。

プライベートリソース (アセット): Vue.js では、ユーザー定義の命令、フィルター、コンポーネントなどを総称してリソースと呼びます。グローバルに登録されたリソースは名前の競合を引き起こしやすいため、コンポーネントは独自のプライベート リソースを宣言できます。プライベート リソースは、コンポーネントとそのサブコンポーネントによってのみ呼び出すことができます。

さらに、同じコンポーネント ツリー内のコンポーネントは、組み込みのイベント API を通じて通信することもできます。 Vue.js は、コンポーネントの定義、再利用、ネストのための完全な API を提供し、開発者がコンポーネントを使用してビルディング ブロックのようにアプリケーション インターフェイス全体を構築できるようにします。

コンポーネントは、コードの効率、保守性、再利用性を大幅に向上させます。

コンポーネントを使用する

登録

1. コンポーネント コンストラクターを作成します:

var MyComponent = Vue.extend({
//选项
})
ログイン後にコピー

2. コンストラクターをコンポーネントとして使用し、Vue.component(tag,constructor) に登録します:

Vue.component('my-component',MyComponent)
ログイン後にコピー

3. 親インスタンスのモジュールでカスタム要素 として使用します:

<div id = "example">
<my-component></my-component>
</div>
ログイン後にコピー

例:

<div id="example">
<my-component></my-component>
</div>
// 定义
var MyComponent = Vue.extend({
template: &#39;<div>A custom component!</div>&#39;
})
// 注册
Vue.component(&#39;my-component&#39;, MyComponent)
// 创建根实例
new Vue({
el: &#39;#example&#39;
})
ログイン後にコピー

レンダリング:

<div id = "example">
<div>A custom component!</div>
</div>
ログイン後にコピー

コンポーネントテンプレートは、マウント ポイントとしてのみ機能するカスタム要素を置き換えます。インスタンス オプション replace を使用して、置換するかどうかを決定できます。

部分登録

各コンポーネントをグローバルに登録する必要はありません:

var Child = Vue.extend({ /* ... */ })
var Parent = Vue.extend({
template: &#39;...&#39;,
components: {
// <my-component> 只能用在父组件模板内
&#39;my-component&#39;: Child
}
})
ログイン後にコピー

この種のカプセル化は他のリソースにも適しています。 、命令、フィルター、トランジションなど。

登録構文シュガー

// 在一个步骤中扩展与注册
Vue.component(&#39;my-component&#39;, {
template: &#39;<div>A custom component!</div>&#39;
})
// 局部注册也可以这么做
var Parent = Vue.extend({
components: {
&#39;my-component&#39;: {
template: &#39;<div>A custom component!</div>&#39;
}
}
})
ログイン後にコピー

コンポーネントオプションの問題

単にオブジェクトを使用する場合、Vue コンストラクターに渡されるオプションのほとんどは、data と el に加えて Vue.extend() でも使用できます。データ オプションとして Vue.extend() に渡されると、すべてのインスタンスが同じデータ オブジェクトを共有するため、データ オプションとして関数を使用し、この関数が新しいオブジェクトを返すようにする必要があります:

var MyComponent = Vue.extend({
data: function () {
return { a: 1 }
}
})
ログイン後にコピー

テンプレート解析

Vue テンプレートはブラウザーのネイティブ パーサーを使用する DOM テンプレートであるため、有効な HTML フラグメントである必要があります。一部の HTML 要素には、その中に配置できる要素に制限があります。

a には他のインタラクティブな要素を含めることはできません。 (ボタン、リンクなど)

ul と ol には li のみを直接含めることができます

select には option と optgroup のみを含めることができます

table には thead、tbody、tfoot、tr、caption、col、colgroup のみを直接含めることができます

tr は可能ですth と td のみを直接含めます

実際には、これらの制限により予期しない結果が生じる可能性があります。単純な場合には機能する可能性がありますが、ブラウザーがカスタム コンポーネントを検証するまでは、カスタム コンポーネントの展開の結果に依存することはできません。たとえば、

は、my-select コンポーネントが最終的に