網(wǎng)絡(luò)運維和網(wǎng)站開發(fā)聚合廣告聯(lián)盟
?這一節(jié)完成基本信息的編輯和保存
首先完成用戶頭像的獲取
頭像選擇
需要將?button?組件?open-type
?的值設(shè)置為?chooseAvatar
,當(dāng)用戶選擇需要使用的頭像之后,可以通過?bindchooseavatar
?事件回調(diào)獲取到頭像信息的臨時路徑。
從基礎(chǔ)庫2.24.4版本起,若用戶上傳的圖片未通過安全監(jiān)測,不觸發(fā)bindchooseavatar
?事件。
<!-- 用戶頭像 --><view class="user_avatar_wrap"><button class="avatar-wrapper" open-type="chooseAvatar" bind:chooseavatar="onChooseAvatar"><image src="{{userInfo.avatarUrl}}" mode="widthFix" /></button> </view>
onChooseAvatar(e) {const { avatarUrl } = e.detailapp.globalData.userInfo.avatarUrl = avatarUrl this.setData({userInfo: {avatarUrl: avatarUrl,nickName: this.data.userInfo.nickName,userId: this.data.userInfo.userId}})},
日期組件
使用微信小程序的原生組件picker
使用示例如下:
<view class="section"><view class="section__title">日期選擇器</view><picker mode="date" value="{{date}}" start="2015-09-01" end="2017-09-01" bindchange="bindDateChange"><view class="picker">當(dāng)前選擇: {{date}}</view></picker>
</view>
date: '2016-09-01',bindDateChange: function(e) {console.log('picker發(fā)送選擇改變,攜帶值為', e.detail.value)this.setData({date: e.detail.value})},
首先修改頁面和樣式
userInfo.wxml
<view class="user_birthday"><picker class="birthday_picker" mode="date" value="{{date}}" start="1900-09-01" end="2100-09-01" bindchange="bindDateChange"><view class="picker"><text class="birthday_text">生日</text><block wx:if="{{!dateStatus}}"><text class="selectBirthday">請選擇生日</text><view class="next_icon iconfont icon-xiayiyeqianjinchakangengduo"> </view></block><block wx:if="{{dateStatus}}">{{date}}</block></view> </picker></view>
userInfo.less
.user_birthday{display: flex;margin: 30rpx;border-bottom: 1rpx solid #f5f5ed;.birthday_picker{width: 100%;.picker{display: flex;.birthday_text{flex: 1;color: #615839;font-size: 30rpx;}.selectBirthday{}.next_icon{color: #666; }} } }}
userInfo.js
data: {userInfo: {nickName: '',avatarUrl: '',userId: ''},date: '2000-09-01',dataStatus: false},
bindDateChange(e){console.log('picker發(fā)送選擇改變,攜帶值為', e.detail.value)this.setData({date: e.detail.value,dateStatus: true})},
性別和地區(qū)
也采用picker組件實現(xiàn)效果
?userInfo.wxml
<view class="user_sex"><picker bindchange="bindSexChange" value="{{index}}" range="{{array}}" class="sex_picker"><view class="picker"><text class="sex_text">性別</text><block wx:if="{{!sexStatus}}"><text class="selectSex">請選擇性別</text><view class="next_icon iconfont icon-xiayiyeqianjinchakangengduo"> </view></block><block wx:if="{{sexStatus}}">{{array[index]}}</block></view></picker>
</view>
<view class="user_address"><picker class="region_picker" mode="region" bindchange="bindRegionChange" value="{{region}}" custom-item="{{customItem}}"><view class="picker"><text class="region_text">地區(qū)</text><block wx:if="{{!regionStatus}}"><text class="selectRegion">請選擇地區(qū)</text><view class="next_icon iconfont icon-xiayiyeqianjinchakangengduo"> </view></block><block wx:if="{{regionStatus}}">{{region[0]}} {{region[1]}} {{region[2]}}</block></view></picker>
</view>
userInfo.less
.user_sex{margin: 30rpx;border-bottom: 1rpx solid #f5f5ed;.sex_picker{.picker{display: flex;.sex_text{flex: 1;color: #615839;font-size: 30rpx;}.selectSex{}.next_icon{color: #666; }} }}.user_address{margin: 30rpx;.region_picker{.picker{display: flex;.region_text{flex: 1;color: #615839;font-size: 30rpx;}.selectRegion{}.next_icon{color: #666; }} }
}
}.phone_wrap{background-color: #fff;border-radius: 25rpx;.userId_wrap{display: flex;margin: 30rpx;border-bottom: 1rpx solid #f5f5ed;text{flex: 1;color: #615839;font-size: 30rpx;}.next_icon{color: #666;}}
userInfo.js
// pages/userInfo/userInfo.js
const app = getApp()
Page({/*** 頁面的初始數(shù)據(jù)*/data: {userInfo: {nickName: '',avatarUrl: '',userId: ''},date: '2000-09-01',dateStatus: false,sexStatus: false,regionStatus: false,array: ['男', '女', '未知'],index: 0,region: ['廣東省', '廣州市', '海珠區(qū)'],customItem: '全部'},/*** 生命周期函數(shù)--監(jiān)聽頁面加載*/onLoad(options) {this.setData({userInfo: {nickName: app.globalData.userInfo.nickName,avatarUrl: app.globalData.userInfo.avatarUrl,userId: app.globalData.userInfo.userId}})},bindRegionChange: function (e) {this.setData({region: e.detail.value,regionStatus: true})},bindSexChange(e){this.setData({index: e.detail.value,sexStatus: true})},bindDateChange(e){console.log('picker發(fā)送選擇改變,攜帶值為', e.detail.value)this.setData({date: e.detail.value,dateStatus: true})},onChooseAvatar(e) {const { avatarUrl } = e.detailapp.globalData.userInfo.avatarUrl = avatarUrl this.setData({userInfo: {avatarUrl: avatarUrl,nickName: this.data.userInfo.nickName,userId: this.data.userInfo.userId}})},/*** 生命周期函數(shù)--監(jiān)聽頁面初次渲染完成*/onReady() {},/*** 生命周期函數(shù)--監(jiān)聽頁面顯示*/onShow() {},/*** 生命周期函數(shù)--監(jiān)聽頁面隱藏*/onHide() {},/*** 生命周期函數(shù)--監(jiān)聽頁面卸載*/onUnload() {},/*** 頁面相關(guān)事件處理函數(shù)--監(jiān)聽用戶下拉動作*/onPullDownRefresh() {},/*** 頁面上拉觸底事件的處理函數(shù)*/onReachBottom() {},/*** 用戶點擊右上角分享*/onShareAppMessage() {}
})
獲取用戶手機號
獲取手機號需要小程序的授權(quán),這個功能要錢,而且需要條件
體驗額度:每個小程序賬號將有1000次體驗額度,用于開發(fā)、調(diào)試和體驗。該1000次的體驗額度為正式版、體驗版和開發(fā)版小程序共用,超額后,體驗版和開發(fā)版小程序調(diào)用同正式版小程序一樣,均收費;
使用步驟:
步驟1:需要將?button?組件?open-type
?的值設(shè)置為?getPhoneNumber
,當(dāng)用戶點擊并同意之后,通過?bindgetphonenumber
?事件獲取回調(diào)信息;
步驟2:將?bindgetphonenumber
?事件回調(diào)中的動態(tài)令牌code
傳到開發(fā)者后臺,并在開發(fā)者后臺調(diào)用微信后臺提供的?phonenumber.getPhoneNumber?接口,消費code
來換取用戶手機號。每個code
有效期為5分鐘,且只能消費一次。
注:getPhoneNumber
?返回的?code
?與?wx.login
?返回的?code
?作用是不一樣的,不能混用。
注意
從基礎(chǔ)庫2.21.2開始,對步驟2中換取手機號信息的方式進(jìn)行了安全升級,上述為新方式使用指南。(舊方式目前可以繼續(xù)使用,但建議開發(fā)者使用新方式,以增強小程序安全性)另外,新方式不再需要提前調(diào)用wx.login
進(jìn)行登錄
代碼示例
<button open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber"></button>
Page({getPhoneNumber (e) {console.log(e.detail.code) // 動態(tài)令牌console.log(e.detail.errMsg) // 回調(diào)信息(成功失敗都會返回)console.log(e.detail.errno) // 錯誤碼(失敗時返回)}
})
通過調(diào)用接口獲取手機號
接口英文名
getPhoneNumber
功能描述
該接口用于將code換取用戶手機號。 說明,每個code只能使用一次,code的有效期為5min。
調(diào)用方式
HTTPS 調(diào)用
POST https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=ACCESS_TOKEN
請求數(shù)據(jù)示例
{
"code": "e31968a7f94cc5ee25fafc2aef2773f0bb8c3937b22520eb8ee345274d00c144"
}
返回數(shù)據(jù)示例
{"errcode":0,"errmsg":"ok","phone_info": {"phoneNumber":"xxxxxx","purePhoneNumber": "xxxxxx","countryCode": 86,"watermark": {"timestamp": 1637744274,"appid": "xxxx"}}
}
使用input來手動輸入
<!-- 手機號設(shè)置 --><view class="phone_wrap"><view class="userId_wrap"><text>ID</text>{{userInfo.userId}}</view><view class="user_telPhone"><text class="phoneNumber_text">手機號</text><input type="text" class="phoneNumber_input" placeholder="請輸入手機號" placeholder-style="text-align: right" bindblur="phoneNumberMethod"/></view></view>
.user_telPhone{display: flex;margin: 30rpx;.phoneNumber_text{flex: 1;color: #615839;font-size: 30rpx;}.phoneNumber_input{height: auto;width: 175rpx;}}
data{phoneNumber: ''
},phoneNumberMethod(e){const data = e.detail.value;if(data.length == 0){wx.showToast({title: '請輸入手機號',icon:'none'})}if(data.length != 11 || !/^1[3456789]\d{9}$/.test(data)){wx.showToast({title: '請輸入正確的手機號',icon:'none'})}this.setData({phoneNumber: data})},
最后展示當(dāng)前效果