在小程序開發的第30天,整個版本的項目可以說是差不多手工,但是總體的項目大小已經非常接近限度,所以說項目的優化勢在必行,所以我給大家分享關於我在項目實戰中總結的小程序組件的使用:
我給大家分享的是一個底部彈框的一個組件,點擊頭部切換效果如圖:
因為在很多頁面都需要這樣的一個切換,底部彈框效果,所以說我們需要進行一個封裝。這里大家跟緊我
第一步:先創建components文件夾,防止整個項目的所有的組件。
第二步:在component文件夾中右鍵創建組件,名稱為dialog。
目錄如下:
接下來我們就需要對我們的彈出框組件進行設置了。
第三步:在dialog.wxml中寫入彈出框代碼:
<!-- 下拉列表彈出框 -->
<view wx:if="{{state}}" class='drop-bot' bindtap='closer'>
<view scroll-y="true" class="box {{first_click?'show':'hide'}} {{state?'open':'close'}}">
<view style='height: 100%;' class="item_list">
<scroll-view class='scroll' scroll-y="true" style='height: 275rpx'>
<view wx:for="{{account}}" wx:key="{{index}}" class=' li {{style}}' data-index="{{index}}" catchtap='select'>{{item.name}} </view>
</scroll-view>
<view class='li' catchtap='closer'>取消</view>
</view>
</view>
</view>
第四步:在dialog.wxss中寫入樣式代碼:
/* 下拉框的實現 */
.drop-bot {
width: 100%;
height: 100%;
position: fixed;
bottom: 0;
left: 0;
background: rgba(0, 0, 0, .4);
z-index: 1000;
}
.drop-bot .box{
width: 100%;
border-top: 1px solid #ddd;
overflow: hidden;
height: 0;
animation-fill-mode: forwards;
position: fixed;
bottom: 0;
left: 0;
font-family: Monaco;">#fff;
}
.item_list .li.style {
font-family: Monaco;">#f1f1f1;
}
.item_list .li{
width: 100%;
height: 90rpx;
line-height: 90rpx;
overflow: auto;
white-space: nowrap;
display: flex;
justify-content: center;
align-items: center;
border-bottom: 1rpx solid #ebebeb;
}
@keyframes slidedown{
from {
height: 0;
}
to {
height: 365rpx;
}
}
@keyframes slideup{
from {
height: 365rpx;
}
to {
height: 0;
}
}
.open{
animation: slidedown .5s;
}
.close{
animation: slideup .5s;
}
.hide{
display: none;
}
.show{
display: block;
}
注:彈出框的出現是從底部划出所以實現思路是:
通過css3動畫實現高度從0=》某一高度的變化,通過添加不同類名引用不同的動畫,0-365為出現,365-0為消失,當然我們也可以通過定位,改變其top值也是可以的。
第五步:為組件配置json,默認不用配置如下:
{
"component": true,
"usingComponents": {}
}
第六步:配置組件的業務邏輯:
// 彈出框組件
Component({
/**
* 組件的屬性列表
*/
properties: {
account: {
type: Array,
value: []
},
accountName: {
type: String,
value: ""
}
},//存放公共數據的地方,可以供調用方傳遞數據
/**
* 組件的初始數據
*/
data: {
state: false,
first_click: false,
},//私有屬性的地方,data中的數據只有組件可以訪問,外部無法訪問
/**
* 組件的方法列表
*/
methods: {
closer: function (e) {
this.setData({
state: false,
})
},//點擊遮罩層消失
select: function (e) {
var oIndex = e.currentTarget.dataset.index;
var oAccount = this.data.account[oIndex].name;//這里需要的數據有調用方傳遞到properties
this.setData({
state: false,
})
this.triggerEvent("action",oAccount);//將該方法拋出
},//選擇下拉的用戶名稱
toggle: function () {
var list_state = this.data.state,
first_state = this.data.first_click;
if (!first_state) {
this.setData({
first_click: true
});
}
if (list_state) {
this.setData({
state: false
});
} else {
this.setData({
state: true
});
}
},//調出彈出框事件
}//存放事件的地方
})
至此組件的配置也就結束了,下來我們需要進行調用方文件的配置:
第七步在pages中創建右鍵創建index目錄,在該目錄中創建page命名為index
第八步:配置index.wxml:
<!-- 觸發下拉事件的按鈕 -->
<view class='header' bindtap="toggle"><text>{{accouontName}}</text><text>切換</text></view>
<!-- 組件:下拉彈出框 -->
<template-dialog id="dialog" account="{{account}}" accountName="{{accountName}}" bind:action="switchAccount"></template-dialog>
注:
給頭部添加點擊事件toggle(toggle為dialog組件內方法)
在需要調用的頁面中添加摸板,摸板的標簽就是我們在json中配置的template-dialog名稱,
模板中id是在該頁面中給調用的摸板起一個名稱,用於在js中調用(只能用id)
account和accountName是我們將index中的數據傳輸到組件中,以供事件的正常執行。
bind:action="selected"是調用組件拋出的方法
為什么說toggle和action同為組件的方法我們卻只在這里生命action呢?
因為toggle雖是組件的方法,但我們只需要對他進行調用就可以,不需要進行任何的數據的傳輸,而action所代表的select事件則是需要我們在調用的時候進行 的數據的傳輸。
第九步:配置index.wxss:
.header {
width: 100%;
height: 90rpx;
padding: 0 24rpx;
box-sizing: border-box;
font-family: Monaco; font-size: 11pt;">#16cc80;
display: flex;
justify-content: space-around;
align-items: center;
}
第十步:我們配置他的json文件:
{
"usingComponents": {
"template-dialog": "/components/dialog/dialog"
}
}
注:
"template-dialog"是我們在調用摸板時給摸板所起的名稱,后面為其路徑
十一:下來就是我們的業務邏輯:
Page({
data: {
accountName: "",
account: [
{ "name": "李小冉" },
{ "name": "李冰" },
{ "name": "李浩然" },
{ "name": "李宗盛" },
],
},
onReady: function (e) {
this.dialog = this.selectComponent("#dialog");//通過給組件所起的id調用組件
},
toggle: function (e) {
this.dialog.toggle()
}, //給頭部添加的調出下拉框的事件
switchAccount: function (options) {
this.setData({
accountName: options.detail
})
}, //組件內部的方法將options傳遞過來的數據使用上
})
下來我們的一個彈出框組件的編寫,調用就算完成了,實現並不復雜,關鍵時對組件的各個屬性的了解。
各位同路人,記得看思路哦。
