问题:在微信小程序官方文档中,有一个获取用户收货地址 wx.chooseAddress 的api,我在使用的时候有一个问题,就是在点击 获取收获地址 后点击 取消,然后不能继续点击这 获取收获地址 ,这里得清缓存后才能再次点击。
解决:要先获取用户收货地址需要用户点击授权,获取权限的api: wx.getSetting ,可以通过这个api去判断用户是否点击的是 确定 还是 取消 ,然后再去做一下的判断。
<!--页面代码-->
<view class="revice_address_row">
<view class="address_btn">
<button bindtap="handleChooseAddress" type="primary" plain>获取收货地址</button>
</view>
<view>
{{user.name}}{{user.cityName}}
</view>
</view>
// js代码
Page({
data:{
user:{
name:"",
cityName:""
}
},
//点击 收获地址
handleChooseAddress(){
// 获取用户收货地址 (有小bug,点击后点取消,然后不能再次点击)
// wx.chooseAddress({
// success:(result)=>{
// console.log(result)
// }
// })
// 正确流程:
// 1.获取 权限状态
wx.getSetting({
success: (result) => {
console.log(result)
// 2. 获取权限状态
// 主要发现一些 属性名很怪异的时候 都要使用 [] 形式来获取属性
const scopeAddres=result.authSetting["scope.address"];
// 判断用户的权限状态
if(scopeAddres===true||scopeAddres===undefined){
wx.chooseAddress({
success: (result1) => {
console.log(result1)
//获取数据
this.setData({
user:{
name:result1.userName,
cityName:result1.cityName
}
})
}
});
}else{
// 3. 用户 以前拒绝过授予权限 先引导用户打开权限页面
wx.openSetting({
success: (result2) => {
// 4.可以调用 获取收获地址代码
wx.chooseAddress({
success: (result3) => {
console.log(result3)
// 获取数据
this.setData({
user:{
name:result3.userName,
cityName:result3.cityName
}
})
}
});
}
});
}
}
});
}
})
点击确定后的流程:
下面的用户信息就显示出来了
点击取消后的流程:
点击取消后再次点击获取收获地址,会进入权限设置,后面的按钮打开,然后点击返回,就可以获取到用户的信息了(走了确定的流程)
↓↓↓代码嵌套看起来复杂怎么办,优化一下↓↓↓
1.创建一个asyncWx.js文件,封装起来,以后维护也方便:
/**
* promise 形式 getSetting
*/
export const getSetting = () => {
return new Promise((resolve, reject) => {
wx.getSetting({
success: (result) => {
resolve(result);
},
fail: (err) => {
resolve(err);
}
});
})
}
/**
* promise 形式 chooseAddress
*/
export const chooseAddress = () => {
return new Promise((resolve, reject) => {
wx.chooseAddress({
success: (result) => {
resolve(result);
},
fail: (err) => {
resolve(err);
}
});
})
}
/**
* promise 形式 openSetting
*/
export const openSetting = () => {
return new Promise((resolve, reject) => {
wx.openSetting({
success: (result) => {
resolve(result);
},
fail: (err) => {
resolve(err);
}
});
})
}
在页面js引入:
import { getSetting, chooseAddress, openSetting } from "../../utils/asyncWx.js"
Page({
data: {
user: {
name: "",
cityName: ""
}
},
//点击 收获地址
async handleChooseAddress() {
try {
//1.获取权限 权限状态
const res1 = await getSetting();
const scopeAddres = res1.authSetting["scope.address"];
//2.判断 权限状态
if (scopeAddres === false) {
//3.先诱导用户打开授权页面
await openSetting()
}
//4.调用获取收获地址 api
const address = await chooseAddress();
console.log(address);
this.setData({
user: {
name: address.userName,
cityName: address.cityName
}
})
// 5.将地址存入缓存中
wx.setStorageSync("address", address);
} catch (error) {
console.log(error)
}
})
现在是不是变的方便又简洁了呀!
这是简单的获取用户地址的方法以及流程。