第二篇:自定義組件——購物車控件

本文將結(jié)合案例出牧,來闡述自定義組件實(shí)現(xiàn)掘宪。點(diǎn)擊我查看完整項(xiàng)目
先來上圖

自定義控件.png

這個(gè)是一個(gè)購物車的數(shù)量組件蛾扇。主要思路:
1、可以手動(dòng)的輸入具體的數(shù)量
2魏滚、可自定義設(shè)置最小值屁桑、和最大值。當(dāng)是最小值時(shí)栏赴,“-”號(hào)置灰,并不可點(diǎn)擊靖秩。當(dāng)是最大值時(shí)须眷,“+”號(hào)置灰,并不可點(diǎn)擊沟突。
3花颗、當(dāng)手動(dòng)輸入“0”開頭的數(shù)字時(shí),自行過濾惠拭,禁止輸入扩劝,只值輸入非0數(shù)字。
4职辅、當(dāng)手動(dòng)輸入數(shù)字大于最大值時(shí)棒呛,輸入框失去焦點(diǎn),默認(rèn)將輸入值置為最大值域携〈孛耄或者當(dāng)手動(dòng)輸入數(shù)字小于最小值時(shí),輸入框失去焦點(diǎn)秀鞭,默認(rèn)將輸入值置為最小值
5趋观、如果屬性值minNum最小值、或者maxNum最大值設(shè)置為NaN锋边,則表示最小值和最大值的大小沒有輸入的限制
6皱坛、默認(rèn)最小值和最大值是沒有限制的,可以隨便輸入

一豆巨、使用自定義組件的方式

1剩辟、js文件中:

輸入框數(shù)值變化最終響應(yīng)的函數(shù)
  showNumber: function (e) {
    var num = e.detail.num
  },

2、json文件中:

{
  "usingComponents": {
    /**
    *  key:自定義組件的別名,在使用組件時(shí)用到抹沪。相當(dāng)于Android自定義控件在xml文件中的申明的命名空間
    *  value: 自定義組件的全路徑
    */
    "component-option-num": "/component/optionNumber-component/optionNumber-component"
  }
}

3刻肄、wxml文件中:

 1、這里設(shè)置了最小值是0融欧,最大值是20敏弃。
 2、bindoptionNum:是由bind+"optionNum"自定義組件回調(diào)函數(shù)的名稱組成噪馏。當(dāng)自定義組件的函數(shù)回調(diào)是麦到,這個(gè)屬性指定的方法bindoptionNum將被響應(yīng)。并可以獲取傳入的值
 <component-option-num bindoptionNum="showNumber" minNum="0" maxNum="20"></component-option-num>

一欠肾、自定義組件的定義

1瓶颠、 對(duì)外提供的自定義屬性值

  /**
   * 組件的屬性列表
   */
  properties: {
  //最小值
     minNum:{
       type:Number,
       value: NaN
     },
//最大值
     maxNum:{
       type:Number,
       value:NaN
     },
  },

2、 組件內(nèi)部使用的數(shù)據(jù)

  /**
   * 組件的初始數(shù)據(jù)
   */
  data: {
    num: 0,                //輸入框顯示的數(shù)量
    disabledMin: false,    //"-"是否可點(diǎn)擊刺桃,true 不能點(diǎn)擊
    disabledMax:false    //"+"是否可點(diǎn)擊粹淋,true 不能點(diǎn)擊
  },

3、 增加數(shù)量方法

   _add: function (e) {
      let num = parseInt(this.data.num) + 1
      if (this.checkIsMaxNum(num)) {       
     /**
       * 大于最大數(shù)值瑟慈,將輸入框的值設(shè)置為最大值桃移,
       * 且"+"不能點(diǎn)擊、"-"可點(diǎn)擊
       */ 
        num = this.data.maxNum
        this.data.disabledMax = true 
        this.data.disabledMin = false
      }else {
        this.data.disabledMin = false
        this.data.disabledMax = false 
      }
      
      this.setData({
        num: num,
        disabledMin: this.data.disabledMin,
        disabledMax: this.data.disabledMax
      })
      //回調(diào)optionNum方法葛碧,將輸入框num值傳遞給使用該組件的函數(shù)
      this.triggerEvent('optionNum', { num: num })
    },

4借杰、減少數(shù)量

    _reduce: function (e) {
      let num, disabledMin, disabledMax
      num = parseInt(this.data.num) - 1
      if (this.checkIsMinNum(num)) { //小于最小數(shù)
       /**
     * 小于最小數(shù)值,將輸入框的值設(shè)置為最小值进泼,
     * 且"-"不能點(diǎn)擊蔗衡、"+"可點(diǎn)擊
     */ 
        num = this.data.minNum
        disabledMin = true
        disabledMax = false
      }else{
        disabledMin = false
        disabledMax = false
      }
      this.setData({
        num: num,
        disabledMin: disabledMin,
        disabledMax: disabledMax
      })
      //回調(diào)optionNum方法,將輸入框num值傳遞給使用該組件的函數(shù)
      this.triggerEvent('optionNum',{num:num})
    },

5乳绕、手動(dòng)輸入數(shù)量

    _input: function (e) {
      let val = e.detail.value
      //1绞惦、先用正則校驗(yàn)輸入的第一個(gè)數(shù)字,當(dāng)手動(dòng)輸入“0”開頭的數(shù)字時(shí)刷袍,自行過濾翩隧,禁止輸入,只值輸入非0數(shù)字
      var num = val.replace(/^[0]+[0-9]*$/gi, "")
       /**
     * 大于最大數(shù)值呻纹,將輸入框的值設(shè)置為最大值堆生,且"+"不能點(diǎn)擊、"-"可點(diǎn)擊雷酪。反之亦然
     */ 
      if (this.checkIsMinNum(num)) {  //小于最小數(shù)
        this.data.disabledMin = true
        this.data.disabledMax = false
      } else if (this.checkIsMaxNum(num)) {    //大于最大數(shù)
        this.data.disabledMax = true
        this.data.disabledMin = false
      } else {
        this.data.disabledMin = false
        this.data.disabledMax = false
      }
      this.setData({
        num: num,
        disabledMin: this.data.disabledMin,
        disabledMax:this.data.disabledMax
      })
      this.triggerEvent('optionNum', { num: num })
    },

6淑仆、失去焦點(diǎn)

  _blur:function(e){
      let val = e.detail.value
      let num = val.replace(/^[0]+[0-9]*$/gi, "")
      let disabledMin, disabledMax
      if (this.checkIsMinNum(num)) {    //輸入的數(shù)量 小于最小的數(shù),則輸入框顯示最小值
        num = this.data.minNum
        disabledMin = true
        disabledMax = false
      } else if (this.checkIsMaxNum(num)) {     //輸入的數(shù)量 大于最大的數(shù)哥力,則輸入框顯示最大值
        this.data.disabledMax = true
        num = this.data.maxNum
        disabledMin = false
        disabledMax = true
      } else {     //輸入的數(shù)量 大于最小的數(shù)蔗怠,則輸入框顯示輸入值
        disabledMin = false
        disabledMax = false
      }
      this.setData({
        num: num,
        disabledMin: disabledMin,
        disabledMax: disabledMax
      })
      this.triggerEvent('optionNum', { num: num })
    },

附自定義組件的全部代碼

1墩弯、js中的代碼

// component/optionNumber-component/optionNumber-component.js
Component({
  /**
   * 組件的屬性列表
   */
  properties: {
     minNum:{
       type:Number,
       value: NaN
     },

     maxNum:{
       type:Number,
       value:NaN
     },
  },

  /**
   * 組件的初始數(shù)據(jù)
   */
  data: {
    num: 0,
    disabledMin: false,
    disabledMax:false
  },

  lifetimes:{
    // 初始化數(shù)據(jù)
    attached:function(){
      let num, disabledMin, disabledMax
      if (this.checkIsMinNum(this.data.num)) { //小于最小數(shù)
        num = this.data.minNum
        disabledMin = true
        disabledMax = false
      } else if (this.checkIsMaxNum(this.data.num)){     //大于最大數(shù)
        num = this.data.maxNum
        disabledMax = true
        disabledMin = false
      }else {
        num = this.data.num
        disabledMin = false
        disabledMax = false
      }
      this.setData({
        num: num,
        disabledMin: disabledMin,
        disabledMax: disabledMax
      })
    },
  },


  /**
   * 組件的方法列表
   */
  methods: {
    // 減少數(shù)量
    _reduce: function (e) {
      // console.log("_reduce======", this.data.maxNum)
      let num, disabledMin, disabledMax
      num = parseInt(this.data.num) - 1
      if (this.checkIsMinNum(num)) { //小于最小數(shù)
        num = this.data.minNum
        disabledMin = true
        disabledMax = false
      }else{
        disabledMin = false
        disabledMax = false
      }
      this.setData({
        num: num,
        disabledMin: disabledMin,
        disabledMax: disabledMax
      })
      // console.log("disabledMin======", this.data.disabledMin)
      this.triggerEvent('optionNum',{num:num})
    },

    // 增加數(shù)量
    _add: function (e) {
      let num = parseInt(this.data.num) + 1
      // console.log("_add======", this.data.maxNum)
      if (this.checkIsMaxNum(num)) {        //大于最大數(shù)
        num = this.data.maxNum
        this.data.disabledMax = true 
        this.data.disabledMin = false
      }else {
        this.data.disabledMin = false
        this.data.disabledMax = false 
      }
      this.setData({
        num: num,
        disabledMin: this.data.disabledMin,
        disabledMax: this.data.disabledMax
      })
      this.triggerEvent('optionNum', { num: num })
    },


    // 手動(dòng)輸入數(shù)量
    _input: function (e) {
      let val = e.detail.value
      var num = val.replace(/^[0]+[0-9]*$/gi, "")
      if (this.checkIsMinNum(num)) {  //小于最小數(shù)
        this.data.disabledMin = true
        this.data.disabledMax = false
      } else if (this.checkIsMaxNum(num)) {    //大于最大數(shù)
        this.data.disabledMax = true
        this.data.disabledMin = false
      } else {
        this.data.disabledMin = false
        this.data.disabledMax = false
      }
      this.setData({
        num: num,
        disabledMin: this.data.disabledMin,
        disabledMax:this.data.disabledMax
      })
      this.triggerEvent('optionNum', { num: num })
    },

  // 失去焦點(diǎn)
    _blur:function(e){
      // console.log("_confirm======")
      let val = e.detail.value
      let num = val.replace(/^[0]+[0-9]*$/gi, "")
      let disabledMin, disabledMax
      if (this.checkIsMinNum(num)) {    //輸入的數(shù)量 小于最小的數(shù),則輸入框顯示最小值
        num = this.data.minNum
        disabledMin = true
        disabledMax = false
      } else if (this.checkIsMaxNum(num)) {     //輸入的數(shù)量 大于最大的數(shù)寞射,則輸入框顯示最大值
        this.data.disabledMax = true
        num = this.data.maxNum
        disabledMin = false
        disabledMax = true
      } else {     //輸入的數(shù)量 大于最小的數(shù)渔工,則輸入框顯示輸入值
        disabledMin = false
        disabledMax = false
      }
      this.setData({
        num: num,
        disabledMin: disabledMin,
        disabledMax: disabledMax
      })
      this.triggerEvent('optionNum', { num: num })
    },

    // 檢查是否是最大數(shù)
    checkIsMaxNum: function (checkNum) {
      return this.data.maxNum != "NaN" && checkNum >= this.data.maxNum
    },
    // 檢查是否是最小數(shù)
    checkIsMinNum: function (checkNum) {
      return this.data.minNum != "NaN" && checkNum <= this.data.minNum
    }
  }
})

2、wxml中的代碼

<view class='optionView'>
  <button class="item" bindtap="_reduce" disabled="{{disabledMin}}" style="border:0;background:white" plain='true'>
    <image class="imgReduce" src="{{disabledMin ? '/images/icon/ic_reduce_grey.png' : '/images/icon/ic_reduce.png'}}"></image>
  </button>
  <view class="space">|</view>
  <view class="item">
    <input class="inputNum" type='number' maxlength='3' bindinput="_input" value="{{num}}" placeholder="0" confirm-type="確認(rèn)" bindblur="_blur" placeholder-style="font-size:26rpx;color:#C81432"></input>
  </view>
  <view class="space">|</view>
  <button class="item" bindtap="_add" disabled="{{disabledMax}}" style="margin-left:6rpx;border:0;background:white" plain='true'>
    <image class="imgAdd" src="{{disabledMax ? '/images/icon/ic_add_grey.png' : '/images/icon/ic_add.png'}}"></image>
  </button>
</view>

3桥温、wxss中的代碼

.optionView{
  height: 58rpx;
  width: 240rpx;
  display: flex;
  flex-direction: row;
  border: 1rpx solid #999;
  border-radius: 10rpx;
  justify-content: space-around;
  align-items: center;
  align-content: center;
  background: white;
  margin-right: 64rpx;
}

.item{
  flex: 1;
  display: flex;
  align-items: center;
  align-content: center;
  justify-content: space-around;
}
.space{
  height: 40rpx;
  width: 1rpx;
  color:  #999;
  font-size: 30rpx;
}
.imgAdd{
  width: 16rpx;
  height: 16rpx;
  padding-top: 14rpx;
  padding-bottom: 14rpx
}
.imgReduce{
  width: 16rpx;
  height: 3.5rpx;

  padding-top: 18rpx;
  padding-bottom: 18rpx
}
.inputNum{
    width: 70rpx;
    color: #C81432;
    font-size: 26rpx;
    text-align: center;
    padding-left: 10rpx;
    padding-right: 10rpx;
}
.textMax{
  margin-top: 45rpx;
  margin-bottom: 36rpx;
}

4引矩、json中的代碼

{
  "component": true,
  "usingComponents": {}
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市侵浸,隨后出現(xiàn)的幾起案子旺韭,更是在濱河造成了極大的恐慌,老刑警劉巖掏觉,帶你破解...
    沈念sama閱讀 222,681評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件区端,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡澳腹,警方通過查閱死者的電腦和手機(jī)织盼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來酱塔,“玉大人悔政,你說我怎么就攤上這事⊙泳桑” “怎么了?”我有些...
    開封第一講書人閱讀 169,421評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵槽地,是天一觀的道長(zhǎng)迁沫。 經(jīng)常有香客問我,道長(zhǎng)捌蚊,這世上最難降的妖魔是什么集畅? 我笑而不...
    開封第一講書人閱讀 60,114評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮缅糟,結(jié)果婚禮上挺智,老公的妹妹穿的比我還像新娘。我一直安慰自己窗宦,他們只是感情好赦颇,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著赴涵,像睡著了一般媒怯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上髓窜,一...
    開封第一講書人閱讀 52,713評(píng)論 1 312
  • 那天扇苞,我揣著相機(jī)與錄音欺殿,去河邊找鬼。 笑死鳖敷,一個(gè)胖子當(dāng)著我的面吹牛脖苏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播定踱,決...
    沈念sama閱讀 41,170評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼棍潘,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了屋吨?” 一聲冷哼從身側(cè)響起蜒谤,我...
    開封第一講書人閱讀 40,116評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎至扰,沒想到半個(gè)月后鳍徽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,651評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡敢课,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評(píng)論 3 342
  • 正文 我和宋清朗相戀三年阶祭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片直秆。...
    茶點(diǎn)故事閱讀 40,865評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡濒募,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出圾结,到底是詐尸還是另有隱情瑰剃,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布筝野,位于F島的核電站晌姚,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏歇竟。R本人自食惡果不足惜挥唠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望焕议。 院中可真熱鬧宝磨,春花似錦、人聲如沸盅安。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽别瞭。三九已至腌紧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間畜隶,已是汗流浹背壁肋。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工号胚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人浸遗。 一個(gè)月前我還...
    沈念sama閱讀 49,299評(píng)論 3 379
  • 正文 我出身青樓猫胁,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親跛锌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子弃秆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 1、通過CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫組件 SD...
    陽明先生_X自主閱讀 15,988評(píng)論 3 119
  • 親子日記第158 這幾天妞妞一直跟著我去門市必盖,開門后就給我打掃衛(wèi)生拌牲,拖地,拖完地還不讓我進(jìn)去說怕能臟了歌粥,等地...
    一年級(jí)七班王爍樺媽媽閱讀 141評(píng)論 0 3
  • 偶是韜華編輯孔瀾塌忽,現(xiàn)招寫手10名,審核題材不限失驶,字?jǐn)?shù)不限『不過土居,最好是500字以上也不需要太長(zhǎng)』,如果有想加入工作...
    噗分離閱讀 264評(píng)論 1 2
  • 不奉天旨不奉詔嬉探, 獨(dú)立此身自逍遙装盯。 顯圣二郎真君在, 不使妖猴上碧霄甲馋。
    xueshuai閱讀 401評(píng)論 0 1
  • 休閑成都定躏,奮進(jìn)完美。 少不入川老不出蜀芹敌,人人都說成都是一座來了就不想離開的城市痊远。 寬窄巷子,留下來的老墻氏捞、門洞碧聪、拴...
    孔祥延閱讀 236評(píng)論 0 0