WeChatミニプログラム:カスタムコンポーネントのデータ転送

WeChatミニプログラム:カスタムコンポーネントのデータ転送

転載リンクアドレス:[https://segmentfault.com/a/1190000014474289?utm_source=index-hottest](https://segmentfault.com/a/1190000014474289?utm_source=index-hottest)

I.はじめに

アプレットに再利用可能なUIと特定の機能がある場合は、カスタムコンポーネントを使用してカプセル化できます。(UIのみを再利用する必要がある場合は、テンプレートを使用できます)次に、親コンポーネントと子コンポーネントのデータ転送方法、および単純なコンポーネントと複雑なコンポーネントの例について説明します。
[この記事を最初に書いたとき、私はまだ小さなプログラムの初心者だったので、調査して要約するために公式文書を調べましたが、多くの欠点と誤りがあります。1年の降水量の後(今年は小さなプログラムではなく主にvueを書いていますが)、初心者が私の記事のために迂回するのを防ぐために、比較的多くのビューでこの記事を再編成することにしました。

次に、親コンポーネントと子コンポーネント間でデータを転送する方法

1.親コンポーネントはデータを子コンポーネント
parent.wxmlに渡します

<my-component name="{
   
   {name}}" age="{
   
   {age}}"></my-component>

parent.js

data: {
  name: 'Peggy',
  age: 25
}

child.js

properties: {
  name: {
    type: String,
    value: '小明'
  },
  age: Number
}

親コンポーネントは値をプロパティの形式で子コンポーネントに渡し、子コンポーネントはプロパティで値を受け取り、データ型のタイプとデフォルト値の値を指定できます。
これは 、wxmlでは{ {name}}の形式で直接使用でき 、jsではthis.properties.nameとして取得できます。

2.子コンポーネントは、値
child.jsを親コンポーネントに渡します

methods: {
  changeName() {
    this.triggerEvent('changeName', {
      name: '李四'
    })
  }
}

parent.wxml

<my-component name="{
   
   {name}}" age="{
   
   {age}}" bindchangeName="changeName"></my-component>

parent.js

changeName(event) {
  console.log(event.detail)
  // { name: '李四' }
}

子コンポーネントは、this.triggerEventメソッドを使用して親コンポーネントにデータを渡します。このメソッドは3つのパラメーターを受け入れます
。this.triggerEvent( 'myevent'、myEventDetail、myEventOption);

myeventはメソッド名、
myEventDetailはコンポーネントの外部に渡されるデータ、
myEventOptionはバブリングするかどうかのオプション、設定できる3つのパラメーターがあります。

bubbles    默认false 事件是否冒泡
composed 默认false 事件是否可以穿越组件边界
capturePhase 默认false 事件是否拥有捕获阶段

親コンポーネントは、イベントbindchangeName = "changeName"をリッスンします。changeNameメソッドにはイベントパラメーターがあり、コンポーネントから渡される値はevent.detailから取得できます。

3.シンプルなコンポーネント(カウンター)

ここに画像の説明を挿入
1.コンポーネント機能の紹介
このコンポーネントは、テイクアウトソフトウェアで一般的に使用され、購入したい商品の数量を記録します。初期化時のプラス記号は1つだけです。プラス記号をクリックすると、数字とマイナス記号が表示され、最後に数字がコンポーネントに送信されて外部で使用されます。

2.コンポーネントの作成
最初にルートディレクトリにコンポーネントフォルダ(推奨)を作成し、次にnum-controllerフォルダ(私が取ったコンポーネント名)を作成し、このフォルダを右クリックして新しいコンポーネントを作成します。名前はインデックスです。
ここに画像の説明を挿入
/components/num-controller/index.wxml

<view class="num-controller">
  <image src="images/minus.png" class="{
   
   {num <= min ?'hide': ''}}" bindtap="sub"></image>
  <text class="num">{
   
   {num}}</text>
  <image src="images/plus.png" bindtap="add"></image>
</view>

このコードは、2つのボタンと1つの数値を加算および減算するためのものです。
/components/num-controller/index.json

{
  "component": true,
  "usingComponents": {}
}

このファイルは、コンポーネントの作成時にこのコードを自動的に書き込みます。
/components/num-controller/index.js

Component({
  /**
   * 组件的属性列表
   */
  properties: {
    nameId: {
      type: String
    },
    num: {
      type: Number,
      value: 0
    },
    int: {
      type: Number,
      value: 1
    },
    min: {
      type: Number,
      value: 0
    }
  },

  /**
   * 组件的初始数据
   */
  data: {

  },

  /**
   * 组件的方法列表
   */
  methods: {
    numChange() {
      this.triggerEvent('numChange', {
        num: this.properties.num,
        nameId: this.properties.nameId
      })
    },
    add() {
      this.setData({
        num: this.properties.num + this.properties.int
      })
      this.numChange()
    },
    sub() {
      this.setData({
        num: this.properties.num - this.properties.int
      })
      this.numChange()
    }
  }
})

コンポーネント内に4つのプロパティを定義しました。プロパティは、親コンポーネントから子コンポーネントに渡されるプロパティです。
nameIdは、子コンポーネントの一意性を識別するために使用されます。親コンポーネントに複数のカウンターがある場合、子コンポーネントが変更されたデータを親コンポーネントに渡したいときに使用できます。numはカウンター内
の番号を表します。デフォルトは0です
。intは加算を表します。一度に変更する量。デフォルトは1です
。minはカウンターの最小値を表します。マイナス記号はこの値と等しくなると消え、デフォルトは0です。

同時に、2つのメソッドがサブコンポーネントで定義されてい
ます。プラス記号をクリックしてトリガーし、最初にサブコンポーネント内の番号を変更し、同時にnumChangeメソッドをトリガーして変更された番号を外部に転送します。コンポーネントの;
マイナス記号をサブクリックしてトリガーし、最初に内部サブコンポーネント番号を変更し、同時にnumChangeメソッドをトリガーして、変更された番号をコンポーネントの外部に渡します。

3.コンポーネントの
紹介index.wxmlにコンポーネントを紹介したい場合:

<num-controller nameId="num1" num="{
   
   {num1}}" bindnumChange="numChange"></num-controller>
<num-controller nameId="num2" num="{
   
   {num2}}" int="{
   
   {5}}" min="{
   
   {5}}" bindnumChange="numChange"></num-controller>
<num-controller nameId="num3" num="{
   
   {num3}}" int="{
   
   {100}}" bindnumChange="numChange"></num-controller>

index.json

{
  "usingComponents": {
    "num-controller": "/components/num-controller/num-controller"
  }
}

ページ内のコンポーネントを使用するには、jsonファイルにコンポーネントを登録する必要があります。
index.js

Page({
  data: {
    num1: 0,
    num2: 10,
    num3: 100
  },
  numChange(event) {
    const {num, nameId} = event.detail
    this.setData({
      [nameId]: num
    })
  }
})

データ内のnum1、num2、およびnum3は、コンポーネントの外部から渡されたnumです。numChangeメソッドでは、event.detailを使用して、コンポーネント内のthis.triggerEventを介して渡されたデータを取得し、それに応じて論理的な変更を加えることができます。ビジネス要件に。

第四に、複雑なコンポーネント(フィルターパネル)

ここに画像の説明を挿入
これはセカンダリメニューです。左側(レベル1)をクリックすると、右側(レベル2)の表示が変わります。
1.コンポーネントを作成し、コンポーネント
内にインポートします:
/components/filter-panel/index.wxml

<view class="filter-panel">
  <view class="panel-container">
    <view class="panel-left">
      ...
    </view>

    <view class="panel-right">
      ...
    </view>
  </view>
</view>

/components/filter-panel/index.json

{
  "component": true,
  "usingComponents": {}
}

外部コンポーネント:
index.wxmlにコンポーネントを導入したい場合:

<filter-panel></filter-panel>

このようにして、コンポーネントは正常に導入されました〜(実際、コンポーネント化は非常に快適で、後で多くの労力を節約できます)
2。コンポーネントと外部間のデータ転送
(1)固定データレンダリング
外部コンポーネント:
index.wxml

<filter-panel list="{
   
   {list}}" active="{
   
   {active}}"></filter-panel>

index.js

data: {
  list: [
    ['附近', '地铁站'],
    [['不限', '1km', '2km', '3km'], ['江汉路', '积玉桥', '洪山广场', '楚河汉街', '光谷广场']]
  ],
  active: [0, 0]
},

コンポーネントの内部:

/components/filter-panel/index.js

Component({
  /**
   * 组件的属性列表
   */
  properties: {
    list: Array,
    active: Array
  },
  /**
   * 组件的方法列表
   */
  methods: {
    ...
  }
})

コンポーネントの外部からコンポーネントの内部にデータを転送する場合は、外部から参照するときに属性として直接渡します。
ここでは、2つの属性を渡しました
。listは、2次選択パネルによってレンダリングされたデータです。
アクティブは、ユーザーが選択したオプションデータです。

これまでは正常に表示できましたが、クリックして表示しても選択した項目が実現していません。

(2)変数データのレンダリング
コンポーネントのアクティブなアイテムを制御するアクティブな外部データ:[0、0]は、コンポーネントを介して属性の形式で内部に渡されます。

/components/filter-panel/index.wxml

<view class="filter-panel">
  <view class="panel-container">
    <view class="panel-left">
      <ul>
        <li 
          class="{
   
   {active[0] == index? 'active': ''}}" 
          wx:for="{
   
   {list[0]}}" 
          wx:key="{
   
   {index}}" 
          wx:index="index" 
          data-index="{
   
   {index}}"
          bindtap="changeLevel1"
        >
          {
   
   {item}}
        </li>
      </ul>
    </view>

    <view class="panel-right">
      <ul>
        <li 
          class="{
   
   {active[1] == index? 'active': ''}}" 
          wx:for="{
   
   {list[1][active[0]]}}" 
          wx:key="{
   
   {index}}" 
          wx:index="index" 
          data-index="{
   
   {index}}"
          bindtap="changeLevel2"
        >
          {
   
   {item}}
        </li>
      </ul>
    </view>
  </view>
</view>

/components/filter-panel/index.js

Component({
  /**
   * 组件的属性列表
   */
  properties: {
    list: Array,
    active: Array
  },
  /**
   * 组件的方法列表
   */
  methods: {
    changeLevel() {
      this.triggerEvent('changeLevel', {
        level1: this.properties.active[0],
        level2: this.properties.active[1]
      })
    },
    changeLevel1(event) {
      const index = event.target.dataset.index
      this.setData({
        active: [index, 0]
      })
      this.changeLevel()
    },
    changeLevel2(event) {
      const level2 = 'active[1]'
      const index = event.target.dataset.index
      this.setData({
        [level2]: index
      })
      this.changeLevel()
    }
  }
})

(3)
コンポーネント内のデータは外部に転送されます。このコンポーネントでは、changeLevelメソッドを定義しました。第1レベルのメニューまたは第2レベルのメニューをクリックするたびに、this.triggerEventメソッドを使用して使用するコンポーネントの外側へのアクティブな値。

/components/filter-panel/index.js

 methods: {
      changeLevel() {
        this.triggerEvent('changeLevel', {
          level1: this.properties.active[0],
          level2: this.properties.active[1]
        })
      },
      changeLevel1(event) {
        const index = event.target.dataset.index
        this.setData({
          active: [index, 0]
        })
        this.changeLevel()
      },
      changeLevel2(event) {
        const level2 = 'active[1]'
        const index = event.target.dataset.index
        this.setData({
          [level2]: index
        })
        this.changeLevel()
      }
    }

5.まとめ
このプロジェクトでは、コンポーネント間のデータ転送を使用しないため、コンポーネントと外部の転送は比較的簡単ですが、データの状態の変化について明確に考える必要があります。

転載リンクアドレス:https://segmentfault.com/a/1190000014474289?utm_source=index-hottest

おすすめ

転載: blog.csdn.net/wangyanxin928/article/details/96479333