[WeChat Mini Program] ライフサイクル、スロット、コンポーネント間の通信

ここに画像の説明を挿入

1. コンポーネントのライフサイクル

1.1 コンポーネントのすべてのライフサイクル機能

アプレット コンポーネントで使用できるすべてのライフ サイクルを次の表に示します。

ライフサイクル機能 パラメータ 説明
作成した なし コンポーネント インスタンスが作成された直後に実行される
添付 なし コンポーネント インスタンスがページ ノード ツリーに入ったときに実行されます。
準備 なし コンポーネントがビューレイヤーに配置された後に実行されます
移動した なし コンポーネント インスタンスがノード ツリー内の別の場所に移動したときに実行されます。
切り離された なし ページ ノード ツリーからコンポーネント インスタンスが削除されたときに実行されます。
エラーオブジェクト エラー コンポーネントメソッドがエラーをスローするたびに実行されます

1.2 コンポーネントの主なライフサイクル機能

アプレット コンポーネントには、作成、アタッチ、デタッチという 3 つの最も重要なライフサイクル機能があります。それぞれの特徴は次のとおりです。

  1. コンポーネント インスタンスが作成されると、作成されたライフサイクル関数がトリガーされます。この時点では、setData を呼び出すことはできません。通常、このライフサイクル関数では、カスタム属性フィールドをコンポーネントの this に追加するためにのみ使用する必要があります。

  2. コンポーネントが完全に初期化されてページ ノード ツリーに入ると、添付されたライフサイクル関数がトリガーされます. この時点で、this.data は初期化されています. このライフサイクルは非常に便利であり、初期化作業のほとんどはこの時点で実行できます. (初期データ取得リクエストの送信など)

  3. コンポーネントがページ ノード ツリーを離れた後、切り離されたライフサイクル関数がトリガーされます. ページを終了すると、ページ内の各カスタム コンポーネントの切り離されたライフサイクル関数がトリガーされます. このとき、いくつかのクリーニング作業を行うのが適しています.

/**
* 组件的初始数据
*/
data: {
    
    
_rgb:{
    
     // rgb 的颜色值对象
r:0,
g:0,
b:
},
fullColor: '0, 0, 0' //根据rgb对象的三个属性,动态计算fullColor 的值
},
})

ライフサイクル関数のパラメータ 説明
show コンポーネントのないページが表示されたときに実行されます
hide コンポーネントのないページが非表示になったときに実行されます
resize Object Size コンポーネントが配置されているページのサイズが変更されたときに実行されます

1.3 ライフタイム ノード

アプレット コンポーネントでは、ライフサイクル関数を Component コンストラクターの第 1 レベルのパラメーターで直接定義し、lifetimes フィールドで宣言できます (これが推奨される方法であり、優先度が最も高くなります)。サンプルコードは次のとおりです。

2. コンポーネントが配置されているページのライフサイクル

2.1 コンポーネントが配置されているページのライフサイクルとは

カスタムコンポーネントの動作は、ページの状態の変化に依存することがあります. このとき、コンポーネントが配置されているページのライフサイクルを使用する必要があります. 例: ページの show lifecycle 関数がトリガーされるたびに、ランダムな RGB カラー値を再生成できるようにしたいと考えています。カスタム コンポーネントには、コンポーネントが配置されているページのライフサイクル機能が 3 つあります。

// components/test3/test3.js
Component({
    
    
//旧式的定义方式
created() {
    
    
console.log('created'); //在组建实例进入页面节点树时执行
},
attached(){
    
    
console.log('attached'); //在组件实例被从页面节点树移除时执行
},
// 推荐用法
lifetimes:{
    
    
created() {
    
    
console.log('created~'); //在组建实例进入页面节点树时执行
},
attached(){
    
    
console.log('attached~');//在组件实例被从页面节点树移除时执行
},
}
})

2.2 pageLifetimes ノード

コンポーネントが配置されているページのライフサイクル関数は、pageLifetimes ノードで定義する必要があります。サンプル コードは次のとおりです。

2.3 ランダムな RGB カラー値を生成する

// components/test3/test3.js
Component({
    
    
pageLifetimes:{
    
    
show(){
    
    
console.log('show');
},
hide(){
    
    
console.log('hide');
},
resize(){
    
    
console.log('resize');
}
}

})
// components/test3/test3.js
Component({
    
    
/**
* 组件的方法列表
*/
methods: {
    
    
changeR(){
    
     //修改 rgb 对象上 r属性的值
this.setData({
    
    
'_rgb.r':this.data._rgb.r + 5 > 255? 255 : this.data._rgb.r
+ 5

3.スロット

3.1 スロットとは

カスタム コンポーネントの wxml 構造では、ノード (スロット) を提供して、コンポーネント ユーザーによって提供された wxml 構造を運ぶことができます。

changeG(){
    
     // 修改rgb对象上r属性的值
this.setData({
    
    
'_rgb.g':this.data._rgb.g + 5 >255 ?255 :this.data._rgb.g +
})
},
changeB(){
    
    //修改 rgb对象上b属性的值
this.setData({
    
    
'_rgb.b':this.data._rgb.b + 5 > 255? 255 :this.data._rgb.b
+
})
},
_randomColor() {
    
    
this.setData({
    
    
_rgb:{
    
    
r: Math.floor(Math.random() * 256),
g: Math.floor(Math.random() * 256),
b: Math.floor(Math.random() * 256)
}
})
}
},
pageLifetimes:{
    
    
show(){
    
    
console.log('show');
this._randomColor()
}
}
})

3.2 シングルスロット

アプレットでは、デフォルトで各カスタム コンポーネントに許可されるプレースホルダーは 1 つだけであり、この数の制限は単一スロットと呼ばれます。

コンポーネントに新しい test4 フォルダーを作成する ファイルに新しいコンポーネントを作成する

コンポーネント ディレクトリを app.json usingComponents に追加します。

"usingComponents": {
    
    
"my-test1":"/components/test/test",
"my-test2":"/components/test2/test2",
"my-test3":"/components/test3/test3",
"my-test4":"/components/test4/test4"
},

component.wxml で構造を定義する

<!--components/test4/test4.wxml-->
<view>
<view>
这里是组件的内部结构
</view>
<slot></slot>
</view>

ページの .wxml で構造を定義します。

<!--pages/home/home.wxml-->
<my-test4>
<view>
这是通过插槽填充的内容
</view></my-test4>

3.3 複数のスロットを定義する

コンポーネントの .wxml で複数のタグを使用して、異なる名前の異なるスロットを区別できます。スロット タグを component.wxml に追加して、各スロット タグの name 属性値を定義します。

// components/test4/test4.js
Component({
    
    
options: {
    
    
multipleSlots: true //在组件定义时选型中启用多slot支持
},
properties: {
    
    /* ... */},
data: {
    
    /* ... */},
methods: {
    
    /* ... */ }
})
<!--components/test4/test4.wxml-->
<view>
<slot name="before"></slot>
<view> 这里是组件的内部结构 </view>
<slot name="after"></slot>
</view>

4. 親コンポーネントと子コンポーネント間の通信

4.1 親コンポーネントと子コンポーネント間の通信の 3 つの方法

1.属性バインディング

親コンポーネントから子コンポーネントの指定されたプロパティにデータを設定するために使用され、JSON 互換のデータのみを設定できます

2. イベントバインディング

子コンポーネントが親コンポーネントにデータを渡すために使用され、任意のデータを渡すことができます

3. コンポーネント インスタンスを取得する

親コンポーネントは、 this.selectComponent() を介して子コンポーネント インスタンス オブジェクトを取得することもでき、子コンポーネントの任意のデータとメソッドに直接アクセスできます。

4.2 プロパティバインディング

属性バインディングは親から子への値の受け渡しに使用され、一般的なタイプのデータのみを渡すことができ、メソッドは子コンポーネントに渡すことができません
.home.jsでデータを定義します.

<my-test4>
<!-- 这部分内容将被放置在组件 <slot name="after">的位置上 -->
<view slot="after">这是通过插槽填充的内容</view>
<!-- 这部分内容将被放置在组件 <slot name="before">的位置上 -->
<view slot="before">~~~~~~~</view>
</my-test4>
// 父组件的data节点
data: {
    
    
count:0
}
home.js で構造を定義する

コンポーネントに新しい test5 フォルダーを作成する ファイルに新しいコンポーネントを作成する

コンポーネント ディレクトリを app.json usingComponents に追加します。

ホームページでこのコンポーネントを使用する

サブコンポーネントは、プロパティ ノードで対応するプロパティを宣言し、サブコンポーネント ボタンの自己インクリメントの効果を使用します。

// 父组件的.wxml结构
<my-test3 count="{
     
     {count}}"> </my-test3>
<view>-----</view>
<view>父组件中,count值为:{
   
   {count}}</view>
"usingComponents": {
    
    
"my-test1":"/components/test/test",
"my-test2":"/components/test2/test2",
"my-test3":"/components/test3/test3",
"my-test4":"/components/test4/test4",
"my-test5":"/components/test5/test5"
},
<my-test5 count="{
     
     {count}}"></my-test5>
<view>~~~~~~~~~~~</view>
<view>父组件中,count值是:{
   
   {count}}</view>
// components/test5/test5.js
Component({
    
    
/**
* 组件的属性列表
*/
properties: {
    
    
count:Number

4.3 イベントバインディング

子から親への値の受け渡しにはイベント バインディングが使用され、任意の型のデータを渡すことができます。使用する手順は次のとおりです。

ステップ 1 : 親コンポーネントの js で、カスタム イベントの形式で子コンポーネントに渡される関数を定義します。

  1. 親コンポーネントの js で、カスタム イベントの形式で子コンポーネントに渡される関数を定義します。

  2. 親コンポーネントの wxml で、手順 1 で定義した関数参照をカスタム イベントの形式で子コンポーネントに渡します。

  3. 子コンポーネントの js で、 this.triggerEvent ('カスタム イベント名', { /* パラメータ オブジェクト */ }) を呼び出して、親コンポーネントにデータを送信します。

  4. 親コンポーネントのjsでは、子コンポーネントから渡されたデータをe.detailで取得しています。

ステップ 2 : 親コンポーネント (home.wxml) の wxml で、ステップ 1 で定義した関数をカスタム イベントの形式で参照し、

子コンポーネントに渡されます。

バインドを使用: カスタム イベント名 (推奨: 明確な構造)

または、バインドの直後にカスタム イベント名を記述します。

ステップ 3 : サブコンポーネントの js で、 this.triggerEvent('custom event name', { /* parameter object */ }) を呼び出して、サブコンポーネント (test5.wxml) の .wxml 構造にデータを送信します。

子コンポーネントの js コード

//在父组件中定义sysncCount方法
// 将来,这个方法会被传递给子组件,供子组件进行调用
Page({
    
    
/**
* 页面的初始数据
*/
data: {
    
    
count:0
},
sysncCount(){
    
    
console.log('sysncCount');
},
 <my-test5 count="{
     
     {count}}" bind:sync="sysncCount"></my-test5>
<view>子组件中,count值是:{
   
   {count}}</view>
<button type="primary" bindtap="addCount">+1</button>
// components/test5/test5.js
Component({
    
    
methods: {
    
    
addCount(){
    
    
this.setData({
    
    
count:this.properties.count + 1
})
// 触发自定义事件,将数值同步给父组件
this.triggerEvent('sync',{
    
    value:this.properties.count})
}
}
})

親コンポーネントのjsでは、子コンポーネントから渡されたデータをe.detailで取得しています。

4.4 コンポーネントインスタンスの取得

親コンポーネントで this.selectComponent("id or class selector") を呼び出して、子コンポーネントのインスタンス オブジェクトを取得し、子コンポーネントのデータとメソッドに直接アクセスできます。this.selectComponent(“.my-component”) のように、呼び出し時にセレクターを渡す必要があります。
home.wxml は構造を定義します

sysncCount(e){
    
    
// console.log('sysncCount');
// console.log(e);
// console.log(e.detail.value);
this.setData({
    
    
count: e.detail.value
})
},
<my-test5 count="{
     
     {count}}" bind:sync="sysncCount" class="customA" id='cA'>
</my-test5>
<view>~~~~~~~~~~~</view>
<view>父组件中,count值是:{
   
   {count}}</view>
<button bindtap="getChild">获取子组件的实例对象</button>
// pages/home/home.js
Page({
    
    
/**
* 页面的初始数据
*/
data: {
    
    
count:0
},
sysncCount(e){
    
    
// console.log('sysncCount');
// console.log(e);
// console.log(e.detail.value);
this.setData({
    
    
count: e.detail.value
})
},
getChild(){
    
    
//切记不能传递标签选择器否自返回的是null
const child = this.selectComponent('.customA')
// console.log(child);
// 调用子组件的 setData方法
// child.setData({
    
    
// count:child.properties.count +1 //注意此处只能用child不能用this
// })
child.addCount()//调用子组件的addCount方法
},
})

おすすめ

転載: blog.csdn.net/2301_76710810/article/details/130247116