微信小程序開發筆記(1.2)單項選擇框radio的使用

微信小程序開發筆記(1.2)單項選擇框radio的使用

radio與radio-group

我們先來看不使用radio-group的情況:

gif_1

這裏我設置了兩個單選項目radio,它們兩個是相互獨立的,選一個選項不會影響另一個選項的選擇。

<radio class="radio" value="r1" bindtap="change1" checked="{{choose1}}">教輔1</radio>
<radio class="radio" value="r2" bindtap="change2" checked="{{choose2}}">教輔2</radio>
Page({
  data: {
    choose1:false,
    choose2:false
  },
  change1: function (e) {
    var c1 = this.data.choose1
    this.setData({
      choose1: !c1,
      //choose2: c1
    })
  },
  change2: function (e) {
    var c2 = this.data.choose2
    this.setData({
      choose2: !c2,
      //choose1: c2
    })
  }
  
})

現在, 要實現單選的效果,即兩個選項當中只能選擇一個。

gif_2

需要修改一下所綁定的方法

Page({
  data: {
    choose1:false,
    choose2:false
  },
  change1: function (e) {
    var c1 = this.data.choose1
    this.setData({
      choose1: !c1,     
      choose2: c1
    })
  },
  change2: function (e) {
    var c2 = this.data.choose2
    this.setData({
      choose2: !c2,       
      choose1: c2
    })
  }
})

這時候可能有人想到:每一個radio綁定的都是不同的事件,假如有很多個radio,那豈不是要寫很多事件?

gif_3

因此我們修改一下思路:讓每一個radio都綁定同一個點擊事件。這就需要判斷出具體是哪個radio被點擊了,以便做出相應處理。要知道具體是哪個radio也不難,給每個radio加一個id就好了。

  <radio class="radio" data-id="0" checked="{{choose1}}" bindtap="changed">教輔1</radio>
  <radio class="radio" data-id="1" checked="{{choose2}}" bindtap="changed">教輔2</radio>
  <radio class="radio" data-id="2" checked="{{choose3}}" bindtap="changed">教輔3</radio>
Page({
  data: {
    choose1:false,
    choose2:false,
    choose3:false
  },
  changed: function(e){
    var chooseId = e.currentTarget.dataset.id
    //console.log(e.currentTarget.dataset.id)
    if(chooseId == 0){
      this.setData({
        choose1:true,
        choose2:false,
        choose3:false
      })
    }else if(chooseId == 1){
      this.setData({
        choose1:false,
        choose2:true,
        choose3:false
      })
    }else{
      this.setData({
        choose1: false,
        choose2: false,
        choose3: true
      })
    }
  }
    
})

當然,上面這個寫法也很不簡潔,這麼寫主要是爲了說明:此時的每一個radio依然是相互獨立的,我們只是利用了點擊事件來修改對應radio的狀態,實現了一次只能選擇一個的效果。也就是說,如果單單使用radio的話,拿來做單選還是複選都是可以的,只需要事件有相應變化。

下面是上一段代碼更爲簡潔的寫法,雖然使用數組後簡潔了很多,但是本質上沒有變化:radio之間是相互獨立的

 <radio class="radio" data-id="{{item.id}}" wx:for-items="{{items}}" wx:key="id" checked="{{item.choose}}" bindtap="change">{{item.name}}</radio>
Page({
  data: {
    items: [
      { id:0, name: '教輔1', choose:false },
      { id:1, name: '教輔2'},
      { id:2, name: '教輔3'},
    ]
  },
  change: function (e) {
    //console.log(e.currentTarget.dataset.id)
    var chooseId = e.currentTarget.dataset.id
    var itemsArray = this.data.items

    itemsArray.forEach(function (item, index) {
        item.choose = (chooseId == item.id ? true:false)
    })

    this.setData({
      items: itemsArray
    })
  }

})

下面看一下使用radio-group後

  <radio-group>
    <radio class="radio" wx:for-items="{{items}}" wx:key="id" value="{{item.id}}" checked="{{item.choose}}">{{item.name}}</radio>
  </radio-group>
Page({
  data: {
    items: [
      { id:0, name: '教輔1', choose:false },
      { id:1, name: '教輔2'},
      { id:2, name: '教輔3'},
    ]
  }
})

雖然效果上看沒有變化,但是可以發現,我們沒有綁定任何一個事件;單選的效果是radio-group自己實現的,不需要我們關心。也就是說,此時的每一個radio都是radio-group的一個子組件,他們之間是有聯繫的,當一個radio被選中時,其他的選項就會取消選中。

總結:如果是在多個選項中單選的話,使用radio-group更方便。如果只有單個選項的話,可以直接使用radio。

radio的屬性

img_1

  • value:radio的標識,類似於id的作用。但是只能在radio-group的change事件中讀取到這個value。在單個radio所綁定的tap事件中是讀取不到的。
  • checked:當前的radio是否選中。
  • disabled: 當前的radio是否禁用。被禁用的單選框不能使用。
  • color:選中後的radio呈現的顏色

radio-group的屬性

img_2
bindchange: radio-group選中的選項發生改變後觸發的事件。也就是用戶點擊到另一個選項後觸發的事件。這裏 detail 的 value 值是所選中的radio的value值。(不明白文檔上爲啥說是數組)

img_3
之前說,單選的效果是radio-group自己實現的。猜測跟我們使用id的原理一樣,通過e.detail.value知道了當前所選擇的radio,然後將該radio設置爲選中,其他radio設置爲未選中。

注:radio-group綁定的事件是bindchange,大概當前所選中的radio的value值就是整個radio-group的值,選中的radio發生變化,radio-group的值也發生變化,隨即觸發bindchange事件。

但radio綁定的事件是bindtap,因爲radio只能接收用戶的點擊事件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章