微信小程序用户修改昵称不生效

一 问题重现

在开发微信小程序时,我遇到了一个问题。当用户手动输入昵称并提交时,一切正常。

然而,在这情况下会出现问题。当用户点击输入框时,微信系统会提示“用微信昵称”。若用户选择此提示,昵称输入框会自动填充当前微信昵称,然后点击保存按钮,实际上nickname输入框是没有数据的。

问题重现一下,在input输入框上我添加了监听事bindinput=”onChangeNickname”.

如下:

<form bindsubmit="save">
...
<input type="nickname" class="weui-input" name="nickname" placeholder="请输入昵称"  bindinput="onChangeNickname" value="{{nickname}}"/>
...
<button form-type="submit" type="primary" style="margin-top: 100rpx;">保存</button>
</form>

js逻辑如下:

Page({
  data: {
    nickname:'',
  },
  onChangeNickname(e:any){
   const nickname = e.detail.value;
   this.setData({nickname})
  },
  save() {
    const nickname = this.data.nickname;
    wx.request({
      ...
      //api逻辑
    })
  }
})

这个监听事件只在用户正常输入时起作用,如果想上面说的那样选择系统的“用微信昵称”,其实这个nickname是没变化的。

二 操作如虎

(这段也没解决问题,如果想解决问题直接第三段)

1,审核完后出发函数

从小程序的文档获得input的一个属性bindnicknamereview,不管是输入还是自动填充,在审核完昵称后触发bindnicknamereview

bindnicknamereview用户昵称审核完毕后触发,仅在 type 为 “nickname” 时有效,event.detail = { pass, timeout }

天真的我以为昵称审核完后,触发事件bindnicknamereview,会返回昵称,然而并没有,所以这个方式也不行。

2,提交

然后我一通搜索,在”表单组件form“文档发现这么一句话

当点击 form 表单中 form-type 为 submit 的 button 组件时,会将表单组件中的 value 值进行提交,需要在表单组件中加上 name 来作为 key。

这样的话获取输入框的内容,就不需要从data获取了,直接我们从bindsubmit这个监听来获取nickname以及其他的参数。

save(e) {
    const { nickname, avatar } = e.detail.value;
    wx.request({
      ...
      //api逻辑
    })
}

三,解决问题

//wxml
<!--pages/set-profile/index.wxml 设置用户的头像和昵称-->
<view>
  <form bindsubmit="save">
    <!-- 头像 -->
    <button class="avatar-wrapper" open-type="chooseAvatar" bind:chooseavatar="onChooseAvatar">
      <image class="avatar" src="{{avatar}}"></image>
    </button> 
    <!-- 头像隐藏域 -->
    <input type="text" name="avatar" value="{{avatar}}" type="text" hidden="true" />
    <mp-form>
      <mp-cells>
        <mp-cell title="昵称">
          <input type="nickname" class="weui-input" name="nickname" placeholder="请输入昵称" value="{{nickname}}"/>
        </mp-cell>
      </mp-cells>
    </mp-form>
    <button form-type="submit" type="primary" style="margin-top: 100rpx;">保存</button>
  </form>
</view>
import config from "../../wxconfig";

const defaultAvatarUrl = "https://mmbiz.qpic.cn/mmbiz/icTdbqWNOwNRna42FI242Lcia07jQodd2FJGIYQfG0LAJGFxM4FbnQP6yfMxBgJ0F3YRqJCJ1aPAK2dQagdusBZg/0";

Page({
  data: {
    token: "",
    nickname: "",
    avatar: "",
    userProfile: {},
  },
  
  onLoad() {
    const token = wx.getStorageSync("token");
    const userProfile = wx.getStorageSync("userProfile");
    let avatar, nickname;
    if (userProfile) {
      avatar = userProfile.avatar;
      nickname = userProfile.nickname;
    } else {
      avatar = defaultAvatarUrl;
      nickname = "";
    }
    this.setData({
      token,
      nickname,
      avatar,
      userProfile,
    });
  },

  onChooseAvatar(e) {
    const { avatarUrl } = e.detail;
    wx.uploadFile({
      url: config.baseUrl + "/api/v1/upload",
      filePath: avatarUrl,
      name: "file",
      header: {
        Authorization: "Bearer " + this.data.token,
      },
      formData: {
        mediaType: "avatar",
      },
      success: (res) => {
        const mydata = JSON.parse(res.data);
        if (mydata.status == 1) {
          const newAvatar = mydata.data.url;
          this.setData({
            avatar: newAvatar,
          });
        } else {
          wx.showToast({
            title: "上传失败",
            icon: "error",
          });
        }
      },
      fail: (err) => {
        wx.showToast({
          title: err.message,
          icon: "error",
        });
      },
    });
  },

  save(e) {
    const { nickname, avatar } = e.detail.value;
    wx.request({
      method: "POST",
      url: config.baseUrl + "/api/v1/setprofile",
      header: {
        Authorization: "Bearer " + this.data.token,
      },
      data: {
        nickname,
        avatar,
      },
      success: (res) => {
        if (res.data.status == 1) {
          wx.showToast({
            title: "保存成功",
            icon: "success",
            duration: 2000,
          });
          const userProfile = { ...this.data.userProfile, avatar, nickname };
          this.setData({
            userProfile,
          });
          wx.setStorageSync("userProfile", userProfile);
        }
      },
    });
  },
});

评论

发表回复