1. 程式人生 > >小程式開發的一些經驗(自定義picker元件)

小程式開發的一些經驗(自定義picker元件)

最近這段時間接了一個小程式的開發,開發了一段時間,總結一些經驗,與大家交流下。

1.小程式的頭部title,可以在json裡配置,也可以動態修改。

2.微信小程式連續點選跳轉頁面會跳轉多個頁面,可以加個公共方法,可以加在util.js裡,比如:

let button = true

const buttonClicked =function() {

let that=this

that.button=false

setTimeout(function () {

that.button=true

}, 500)

}

module.exports = {

button,

buttonClicked

}

在這樣引入

const util = require('../../utils/util.js')

if (util.button) {

util.buttonClicked()

wx.navigateTo({

url: '../register/frist/frist',

})

}

路徑要對應自己的

3.wx.resquest預設是get,post請求要加header,你最好封裝下你的wx.resquest,以便以後做統一攔截,也可以加在util.js裡,比如:

//ajax post

const post=(url,data,callback,callbackError)=>{

wx.request({

url: url ,

method: "post",

header: { "Content-Type": "application/x-www-form-urlencoded" },

data: data,

success: function (res) {

if (res.data.success){

callback(res)

}else{

closeLoading()

let r = /登入過期/;

if (r.test(res.data.msg)) {

toastMsg(res.data.msg)

let time = setTimeout(function

() {

wx.navigateTo({

url: '/pages/login/login',

})

}, 1500)

} else {

toastMsg(res.data.msg)

}

}

},

fail:function(error){

closeLoading()

if (callbackError){

callbackError(error)

}

}

})

}

get,同理,引用跟第2點一樣。

4.引入圖片,你如果是用image引入本地圖片,在手機瀏覽沒有問題,但如果是用背景圖片的方式引入本地圖片,那就尷尬了,開發工具顯示沒問題,但在真機上瀏覽,你就會發現圖片不會顯示,解決辦法有2個:1改成image引入,再用絕對定位:2就是引入網路圖片比如http://www.xxx.com./test.png

5.上傳檔案wx.uploadFile。他的引數  filePath是Sring型別的,代表只能是路徑,且只能是一個路徑,所以不能一次上傳多張圖片。如果要上傳多張圖片,只能一張一張傳,可以用promisef封裝下wx.uploadFile,這樣就不會陷入回撥地獄。當然小程式也不支援formdata,所以這條一次上傳多條的路也死了,且也堵死了上傳blob型別的途徑,自然而然當你拿到base64的圖片,你無法轉成blob在傳給後臺,這是你只能post這個base64的字串給後臺,讓後臺去轉成圖片,後臺一般用byte[]接收,畢竟它很長。

6.一個自己寫的基於picker-view的picker元件,畢竟小程式自帶的picker元件連顏色都不能改。結構

wxml

view class='mypicker' hidden="{{!isShow}}">

<view class='shadow' bindtap='hidePicker'></view>

<view class='content'>

<view class='picker-head'>

<text class='cancle' bindtap='hidePicker'>取消</text>

<text class='sure' bindtap='_successEvent'>確認</text>

</view>

<picker-view class='picker-view' indicator-style="height: 100rpx;" value="{{value}}" bindchange="bindChange">

<!-- 一列picker -->

<block wx:if="{{column==='1'}}">

<picker-view-column>

<view wx:for="{{list}}" style="line-height: 68rpx">{{item.name}}</view>

</picker-view-column>

</block>

<!-- 兩列picker -->

<block wx:if="{{column==='2'}}">

<picker-view-column>

<view wx:for="{{list}}" style="line-height: 68rpx">{{item.name}}</view>

</picker-view-column>

<picker-view-column>

<view wx:for="{{secondClo}}" style="line-height: 68rpx">{{item.name}}</view>

</picker-view-column>

</block>

<!-- 三列picker -->

<block wx:if="{{column==='3'}}">

<picker-view-column>

<view wx:for="{{list}}" style="line-height: 68rpx">{{item.name}}</view>

</picker-view-column>

<picker-view-column>

<view wx:for="{{secondClo}}" style="line-height: 68rpx">{{item.name}}</view>

</picker-view-column>

<picker-view-column>

<view wx:for="{{thirdClo}}" style="line-height: 68rpx">{{item.name}}</view>

</picker-view-column>

</block>

</picker-view>

</view>

</view>

js

/ components/mypicher/mypicker.js

Component({

/**

* 元件的屬性列表

*/

properties: {

isShow: {

type: Boolean, // 型別(必填),目前接受的型別包括:String, Number, Boolean, Object, Array, null(表示任意型別)

value: false, // 屬性初始值(可選),如果未指定則會根據型別選擇一個

},

column: String,

value: {

type: Array, // 型別(必填),目前接受的型別包括:String, Number, Boolean, Object, Array, null(表示任意型別)

value: [0,0,0], // 屬性初始值(可選),如果未指定則會根據型別選擇一個

observer: function (newVal, oldVal) { // 屬性被改變時執行的函式(可選)

console.log(newVal, oldVal)

this.setData({

value: newVal

})

}

},

list:{//格式[{name:"",data:[{name:"",data:[]}]}]

type: Array, // 型別(必填),目前接受的型別包括:String, Number, Boolean, Object, Array, null(表示任意型別)

value: [], // 屬性初始值(可選),如果未指定則會根據型別選擇一個

observer: function (newVal, oldVal) { // 屬性被改變時執行的函式(可選)

let inx = this.data.value

console.log(newVal)

console.log(oldVal)

console.log(this.data.column)

if (this.data.column=="2"){

this.setData({

secondClo: newVal[inx[0]].data

})

}

if (this.data.column == "3") {

this.setData({

secondClo: newVal[inx[0]].data,

thirdClo: newVal[inx[0]].data[inx[1]].data

})

}

}

}

},

/**

* 元件的初始資料

*/

data: {

isShow:true,

secondClo:[],

thirdClo:[]

},

/**

* 元件的方法列表

*/

methods: {

bindChange: function (e) {

const newVal = e.detail.value

const oldVal = this.data.value

let data = this.data.list

if (this.data.column == "2") {

if (oldVal[0] != newVal[0]){

this.setData({

secondClo: data[newVal[0]].data

})

}

}

if (this.data.column == "3") {

if (oldVal[0] != newVal[0]) {

this.setData({

secondClo: data[newVal[0]].data,

thirdClo: data[newVal[0]].data[0].data

})

}

if (oldVal[1] != newVal[1]) {

this.setData({

thirdClo: data[newVal[0]].data[newVal[1]].data

})

}

}

this.setData({

value: e.detail.value

})

},

//隱藏picker

hidePicker() {

this.setData({

isShow: false

})

},

/*

* 內部私有方法建議以下劃線開頭

* triggerEvent 用於觸發事件

*/

_successEvent() {

console.log("addas")

//觸發成功回撥

this.setData({

isShow: false

})

var myEventDetail = this.data.value

console.log(this.data.value)

this.triggerEvent('myevent', myEventDetail)

}

}

})

wxss

.mypicker{

width: 100%;

height: 100%;

position: fixed;

left: 0;

top: 0;

z-index: 100

}

.shadow{

width: 100%;

height: 100%;

position: absolute;

left: 0;

top: 0;

background: #000;

opacity: 0.5

}

.content{

height: 590rpx;

width: 100%;

position: absolute;

left: 0;

bottom: 0;

background: #fff

}

.picker-view{

text-align: center;

width: 100%;

height: 400rpx;

line-height: 100rpx

}

.picker-head{

height: 80rpx;

line-height: 80rpx;

font-size: 40rpx;

border-bottom: 2rpx solid #ddd;

padding: 0 40rpx

}

.cancle{

color: #999

}

.sure{

color: #3B76D8;

float: right

}

json

{

"component": true,

"usingComponents": {}

}

引入使用比如是index

wxml

<my-picker column="{{pickerClo}}" list="{{pickerList}}" value="{{pickerValue}}" isShow="{{pickerIsShow}}" bindmyevent='myevent'></my-picker>

js

data: {

pickerValue: [0],//picker value值

pickerList: [1,2,3],//picker 資料

pickerIsShow: false,// 是否顯示 picker

pickerClo: "1",// picker 幾列

},

myevent:function(e){

console.log( e.detail)

},

json

{

"usingComponents": {

"my-picker": "../../../components/mypicker/mypicker"

}

}

7.小程式的web-view元件中的url不能有中文或“{}”,否則在ios的環境下會白屏。

8.圖片轉base64,這個方法有兩個,第一個是利用request這個方法在開發工具上ok,但是真機上會報錯,pass。

第二個是用canvas的canvasGetImageData屬性,具體方法可以百度,但你要引入兩個js"upng"和“pako”,但這個會轉成png格式大小,圖片的大小會變大。

以上就是我的經驗,還在開發中,也許會持續跟新,有問題可以提出來,希望可以和大家交流