В фактической разработке апплета WeChat получение псевдонима и аватара пользователя является общей функцией, но поскольку API апплета WeChat зависит от разных базовых библиотек, это требование необходимо решать по-разному.
API wx.getUserInfo впервые использовался для получения информации о пользователе.,Однако новая версия мини-программы, выпущенная после 24:00 28 апреля 2021 года, больше не сможет получать личную информацию пользователя (аватар, никнейм, пол и регион).,А почему это было пересмотрено таким образом?,Это официальное объяснение:Многие разработчики используют компоненты для вызова всплывающего окна getUserInfo при открытии мини-программы. Если пользователь нажимает кнопку «Отклонить», мини-программа не может быть использована. Это прерывает нормальное использование мини-программы и не способствует ее использованию. приобретение новых пользователей.
На самом деле, понятно, что первоначальная цель этого API — облегчить разработчикам его разработку и использование, но это привело к злоупотреблениям этим API (хотя это в значительной степени вызвано необоснованными потребностями бизнеса). В конце концов, пользовательский опыт стоит на первом месте. Если вы не можете его контролировать, то его можно только отключить.
Взгляните на самый ранний пример кода метода реализации, который выглядит следующим образом.
wx.getSetting({
success(res) {
if (res.authSetting['scope.userInfo']) {
// Уже авторизован и можно позвонить напрямую getUserInfo Получить аватар Никнейм
wx.getUserInfo({
success: function (res) {
console.log('Информация о пользователе', res.userInfo)
That.setData({
avatarUrl: res.userInfo.avatarUrl,
nickName: res.userInfo.nickName
})
}
})
}
}
})
Но теперь в userInfo, возвращаемом обратным вызовом, nickName всегда был пользователем WeChat, а avatarUrl всегда был серым аватаром по умолчанию.
См. картинку ниже
Последний метод — использование апплета WeChat для предоставления открытых возможностей и функции заполнения ников аватара.
Дело в том,
open-type="chooseAvatar" Получить аватар
type="nickname" получает никнейм
Следует отметить, что его необходимо активировать нажатием на действие.
Полный код реализации
// wxml
<view data-weui-theme="{{theme}}">
<button class="avatar-wrapper" open-type="chooseAvatar" bind:chooseavatar="onChooseAvatar">
<image class="avatar" src="{{avatarUrl}}"></image>
</button>
<mp-form>
<mp-cells>
<mp-cell title="Никнейм">
<input bindinput="bindKeyInput" value="{{nickName}}" type="nickname" class="weui-input" placeholder="Пожалуйста, введите Никнейм"/>
</mp-cell>
</mp-cells>
</mp-form>
</view>
// js
const app = getApp()
Page({
data: {
avatarUrl: '',
nickName: ''
},
onLoad() {
let That = this
wx.getSetting({
success(res) {
if (res.authSetting['scope.userInfo']) {
// Уже авторизован и можно позвонить напрямую getUserInfo Получить аватар Никнейм
wx.getUserInfo({
success: function (res) {
console.log('Информация о пользователе', res.userInfo)
That.setData({
avatarUrl: res.userInfo.avatarUrl,
nickName: res.userInfo.nickName
})
}
})
}
}
})
},
onChooseAvatar(e) {
const {
avatarUrl
} = e.detail
this.setData({
avatarUrl,
})
},
bindKeyInput(e){
this.setData({
nickName: e.detail.value
})
}
})
//json
{
"usingComponents": {
"mp-form-page": "weui-miniprogram/form-page/form-page",
"mp-form": "weui-miniprogram/form/form",
"mp-cells": "weui-miniprogram/cells/cells",
"mp-cell": "weui-miniprogram/cell/cell"
},
"pageOrientation": "auto"
}
// wxss
.avatar-wrapper {
padding: 0;
width: 56px !important;
border-radius: 8px;
margin-top: 40px;
margin-bottom: 40px;
}
.avatar {
display: block;
width: 56px;
height: 56px;
}
.container {
display: flex;
}
Решение: используйте событие размытия.
<input
bindinput="bindKeyInput"
bindblur="bindKeyBlur"
value="{{nickName}}"
type="nickname"
class="weui-input"
placeholder="Пожалуйста, введите Никнейм"/>
Потому что возможность заполнять никнеймы аватаров поддерживается только базовой библиотекой версий 2.21.2 и выше.
Ради строгости Чтобы добавить решение по версии Решите разные версиивопрос
Ключевые API wx.getSystemInfoSync().SDKVersion
const version = wx.getSystemInfoSync().SDKVersion;
<!--новая версия-->
isNewVersion() {
const version = wx.getSystemInfoSync().SDKVersion;
if (this.compareVersion(version, "2.21.2") >= 0) {
return true;
}
return false;
}
compareVersion(v1, v2) {
v1 = v1.split(".");
v2 = v2.split(".");
const len = Math.max(v1.length, v2.length);
while (v1.length < len) {
v1.push("0");
}
while (v2.length < len) {
v2.push("0");
}
for (let i = 0; i < len; i++) {
const num1 = parseInt(v1[i]);
const num2 = parseInt(v2[i]);
if (num1 > num2) {
return 1;
} else if (num1 < num2) {
return -1;
}
}
return 0;
}