您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)微信小程序用組件創(chuàng)建select下拉選項(xiàng)框的方法,小編覺得挺實(shí)用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
我喜歡把共用的內(nèi)容都放在和pages文件同級的地方,所以有了下面的目錄結(jié)構(gòu)
先創(chuàng)建一個自定義名字的文件夾,例如我上面的Componet
再創(chuàng)建一個select文件夾,然后:右鍵這個文件夾,新建下面的這個Component。然后輸入需要創(chuàng)建的名稱,我這里為了方便就取了select的名字。然后就會自動創(chuàng)建4個文件,js、json、wxml、wxss。
注意:如果通過第一步創(chuàng)建的可直接跳過第二步。
通過第一步創(chuàng)建的組件的文件夾中,已經(jīng)自動配置好了。只需在引入組件的時候,在引入組件的頁面的json文件中配置組件的名稱和組件的位置。
如果自己手動創(chuàng)建組件的js、json、wxml、wxss這個文件,那么需要在json文件中填入 "component": true 表示自定義組件聲明。js文件中也需要寫成這種格式:
Component({ properties: { // 這里定義了innerText屬性,屬性值可以在組件使用時指定 innerText: { type: String, value: 'default value', } }, data: { // 這里是一些組件內(nèi)部數(shù)據(jù) someData: {} }, methods: { // 這里是一個自定義方法 customMethod: function(){} } })
注意:這里可以在 app.json 的 pages 中把組件所在的頁面放到第一位,這樣就能在組件的頁面編寫代碼了,比如我上面的目錄結(jié)構(gòu):就需要寫成 "Componet/select/select", 后面再是其它的頁面。這樣方便得多。
<view class='com-selectBox'> <view class='com-sContent' bindtap='selectToggle'> <view class='com-sTxt'>{{nowText}}</view> <image src='../../public/img/local/down.png' class='com-sImg' animation="{{animationData}}"></image> </view> <view class='com-sList' wx:if="{{selectShow}}"> <view wx:for="{{propArray}}" data-index="{{index}}" wx:key='' class='com-sItem' bindtap='setText'>{{item.text}}</view> </view></view>
(1) animation="{{animationData}}" 這個是下箭頭的動畫效果
(2) data-index="{{index}}" 這個是當(dāng)前元素被點(diǎn)擊時的索引
(3) selectToggle是模仿下拉選項(xiàng)框隱藏和顯示的事件。
(4) setText是模仿下拉選項(xiàng)框選擇子項(xiàng)之后,設(shè)置內(nèi)容的事件。
(5) selectShow是表示option選項(xiàng)顯示與否
2. 組件的wxss
.com-selectBox{ width: 200px; }.com-sContent{ border: 1px solid #e2e2e2; background: white; font-size: 16px; position: relative; height: 30px; line-height: 30px; }.com-sImg{ position: absolute; right: 10px; top: 11px; width: 16px; height: 9px; transition: all .3s ease; }.com-sTxt{ overflow: hidden; text-overflow: ellipsis; white-space: nowrap; padding:0 20px 0 6px; font-size: 14px; }.com-sList{ background: white; width: inherit; position: absolute; border: 1px solid #e2e2e2; border-top: none; box-sizing: border-box; z-index: 3; max-height: 120px; overflow: auto; }.com-sItem{ height: 30px; line-height: 30px; border-top: 1px solid #e2e2e2; padding: 0 6px; text-align: left; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 14px; }.com-sItem:first-child{ border-top: none; }
// Componet/Componet.jsComponent({ /** * 組件的屬性列表 */ properties: { propArray:{ type:Array, } }, /** * 組件的初始數(shù)據(jù) */ data: { selectShow:false,//初始o(jì)ption不顯示 nowText:"請選擇",//初始內(nèi)容 animationData:{}//右邊箭頭的動畫 }, /** * 組件的方法列表 */ methods: { //option的顯示與否 selectToggle:function(){ var nowShow=this.data.selectShow;//獲取當(dāng)前option顯示的狀態(tài) //創(chuàng)建動畫 var animation = wx.createAnimation({ timingFunction:"ease" }) this.animation=animation; if(nowShow){ animation.rotate(0).step(); this.setData({ animationData: animation.export() }) }else{ animation.rotate(180).step(); this.setData({ animationData: animation.export() }) } this.setData({ selectShow: !nowShow }) }, //設(shè)置內(nèi)容 setText:function(e){ var nowData = this.properties.propArray;//當(dāng)前option的數(shù)據(jù)是引入組件的頁面?zhèn)鬟^來的,所以這里獲取數(shù)據(jù)只有通過this.properties var nowIdx = e.target.dataset.index;//當(dāng)前點(diǎn)擊的索引 var nowText = nowData[nowIdx].text;//當(dāng)前點(diǎn)擊的內(nèi)容 //再次執(zhí)行動畫,注意這里一定,一定,一定是this.animation來使用動畫 this.animation.rotate(0).step(); this.setData({ selectShow: false, nowText:nowText, animationData: this.animation.export() }) } } })
(1) 組件的 properties 屬性是對外屬性,我理解的是可以當(dāng)做 data 數(shù)據(jù)來使用,它是一個含有三個屬性的對象,分別是 type
表示屬性類型、 value
表示屬性初始值、 observer
表示屬性值被更改時的響應(yīng)函數(shù)。type 是必填的,其它的可選。如果只有 type,可以寫成:屬性名:type類型。
(2) 組件的 data 和普通頁面的data一樣,是組件的內(nèi)部數(shù)據(jù),和 properties
一同用于組件的模版渲染。
(3) 組件的 method 是專門用于 事件響應(yīng)函數(shù) 和 任意的自定義方法。在這里面獲取數(shù)據(jù)有兩種方法:一種是獲取data里的數(shù)據(jù): this.data.屬性名;一種是獲取 properties 中的屬性值: this.properties.屬性名
(4) 創(chuàng)建animation動畫,作用在通過 true 和 false 切換顯示狀態(tài)的內(nèi)容上沒有過渡、沒有過渡、沒有過渡。
1. 引入前,需要在引入組件的頁面的json文件中配置,比如我要在 index.wxml 中引入,那么在 index.json 中我就需要配置:
"usingComponents": { "Select": "/Componet/select/select"}
(1) Select 是你定義的組件的名稱,后面的是組件所在的位置。 / 單斜杠表示根目錄,是絕對路徑。
(2) 如果出現(xiàn)下面這種說沒找到路徑的,一定是自己填寫的路徑不對,認(rèn)真查找。
2. 配置好后,就可以引入組件。
<Select prop-array='{{selectArray}}'></Select>
(1) prop-array 是我自定義的屬性名,這個是和組件所在的 js 中properties中的屬性是對應(yīng)的。在 properties
定義的屬性中,屬性名采用駝峰寫法(例如:propArray);在引入組件的 wxml
中,指定屬性值時則對應(yīng)使用連字符寫法(例如:prop-array="..."
)。
3. 最后就是傳入數(shù)據(jù)了。在引入組件的js的data中,添加:
selectArray: [{ "id": "10", "text": "會計類"}, { "id": "21", "text": "工程類"}]
最終結(jié)果:
如果引入兩個相同的組件,傳入的數(shù)據(jù)也相同:
<Select prop-array='{{selectArray}}'></Select><Select prop-array='{{selectArray}}'></Select>
這樣的方式組件并不會相互影響,都是獨(dú)立的。
對了,組件樣式的規(guī)則可以查看官方的規(guī)則
效果有了,最關(guān)鍵的是獲取選中的內(nèi)容。這個怎么實(shí)現(xiàn)呢,這時候需要組建間通信與事件了。
<Select prop-array='{{selectArray}}' bind:myget='getDate'></Select>
(1) 這里myget是自定義的子組件需要觸發(fā)的事件名,getDate是引入組件的頁面需要獲取傳過來的數(shù)據(jù)的自定義的事件名。
因?yàn)檫@里的select組件是點(diǎn)擊下拉列表的內(nèi)容才進(jìn)行內(nèi)容的更新,所以這里只需要在下拉列表里添加一個點(diǎn)擊事件,而原來已經(jīng)設(shè)置了setText事件。所以只需要在setText函數(shù)里面寫觸發(fā)事件就行了。
在setText函數(shù)的內(nèi)容里加上:
var nowDate={ id:nowIdx, text:nowText }this.triggerEvent('myget', nowDate)
(1) 這里的 myget 和 bind:myget ,名稱一定要對應(yīng)。
(2) nowDate是需要傳回的數(shù)據(jù),不一定要弄成對象,想傳什么傳什么,我這里只是演示而已。我試了一下也可以傳函數(shù)。。。
3. 引入組件的頁面的js
添加引入組件時,自定義的函數(shù):
getDate:function(e){ console.log(e.detail) }
e的內(nèi)容為:
傳過來的值就在detail里面。
到此,一個完整的select組件就完成了。
更新:
如果要select組件默認(rèn)顯示傳入的第一個數(shù)據(jù),做法是:
(1) 在select組件的wxml頁面,在class為com-sTxt的view標(biāo)簽中,原來的 {{ nowText }} 改為 {{ nowText==' ' ? propArray[0].text : nowText }}。
(2) 然后在 select 組件 js文件 中原來nowText的值修改為 ‘ ’ 空。
(3) 這樣的話就表示如果最初nowText為空,就顯示傳入數(shù)據(jù)的第一個值,否則就是選中的值
關(guān)于微信小程序用組件創(chuàng)建select下拉選項(xiàng)框的方法就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。