微信小程序(五十三)修改用户头像与昵称

注释很详细,直接上代码

上一篇

新增内容:
1.外界面个人资料基本模块
2.资料修改界面同步问题实现(细节挺多,考虑了后期转服务器端的方便之处)

源码:

app.json

{
  "window": {
   
  },
  "usingComponents": {
    "van-icon": "@vant/weapp/icon/index",
    "van-cell": "@vant/weapp/cell/index",
    "van-field": "@vant/weapp/field/index"
  },
  "pages": [
    "pages/index/index",
    "pages/fixMessage/fixMessage"
  ]
}

app.js


App({
    userInfo:{//这里是默认的用户头像昵称信息
      avatar:'/static/images/avatar.jpg',
      nickName:'眨眼睛'
    }
 })
 

index.wxml

<!-- 图个方便咱样式全写行内了 -->
 <view style=" border-radius: 30rpx; " >
    <view style="padding:160rpx 0 0 0;display: flex;flex-direction: column; align-items: center;" bind:tap="onTap">
      <view>
        <image src="{{userInfo.avatar}}" mode="aspectFill" style="width: 100rpx ;height: 100rpx; border-radius: 50%;" />
      </view>

      <view style="margin-bottom: 20rpx;">
        <text style="color: pink;">{{userInfo.nickName}}</text>
      </view>
    </view>
  </view>

index.wxss

page{
 
  background-image: url(https://pic3.zhimg.com/v2-a76bafdecdacebcc89b5d4f351a53e6a_r.jpg?source=1940ef5c);
  background-size: 100% auto;
  background-repeat: no-repeat;
}

index.json

{
  "usingComponents": {
  },
  
  "navigationStyle": "custom"
}

index.js

Page({
  data: {
    userInfo:{//这里是默认的用户头像昵称信息
      avatar:'/static/images/avatar.jpg',
      nickName:'眨眼睛'
    }
  },
  onTap(){
    wx.navigateTo({//跳转到指定页面
      url: '/pages/fixMessage/fixMessage',
    })
  },
  onShow(){//在页面出现时同步全局数据(onshow很重要,要不然不能实现每次进入该页面都同步)
    const app=getApp()
    this.setData({
      ['userInfo.nickName']:app.userInfo.nickName,
      ['userInfo.avatar']:app.userInfo.avatar
    })
  }
})

fixMessage.wxml

<view>
  <!--手动控距 -->
  <view class="distance"/>

  <van-cell center title="头像" class="cell">
    <van-icon slot="right-icon" name="arrow" size="16" color="#b4b4b4"/>
      <!-- 这个按钮是透明隐藏的,为的是使用按钮自带的chooseAvatar(头像选择功能) -->
      <!-- 其实这里我有个不称意的地方,即没法使点击箭头van-icon时也触发按钮相同的操作,
      用调整透明按钮位置覆盖箭头和模拟点击的方法都没能很好的实现,友友们要是解决了别忘了私信眨眼睛让我涨涨知识 -->
      <button class="button" id="button" size="mini" plain="true" hover-class="none" open-type="chooseAvatar"
    bind:chooseavatar="chooseAvatar" >
    <image class="avatar" src="{{userInfo.avatar}}" mode="aspectFill"/>
    </button>
 
  </van-cell>

  <view class="distance"/>
<!-- 为什么这里用bind:blur捕获失去焦点的事件而非使用change捕获每一次变化呢
     原因:虽然我们这里只是本地进行操作但是在实际开发中数据其实是要传输到服务器的,
           总不能每改一个字将传一次吧 -->
  <van-field center label="昵称" input-align="right" 
  type="nickName" bind:blur="updateNickName" placeholder="请输入昵称" 
  value="{{nickName}}"></van-field>
</view>

fixMessage.wxss

page{
  margin: 0;
  padding: 0;
  background-color:#fafafa;
}

.distance{
  height: 15rpx;
}

.avatar{
  border-radius: 50%;
  width: 60rpx;
  height: 60rpx;
}

.button{
  border: none !important;
  position: relative;
  top: 15rpx;
  left:30rpx;
  width: 200rpx !important;
}

fixMessage.json

{
  "usingComponents": {

  },
  "navigationStyle": "default",
  "navigationBarBackgroundColor": "#ffffff",
  "navigationBarTitleText": "个人信息",
  "navigationBarTextStyle":"black"
}

fixMessage.js

// pages/fixMessage/fixMessage.js
Page({

  /**
   * 页面的初始数据
   */
  data: {
    userInfo:{
      avatar:'/static/images/avatar.jpg',//最开始的头像路径
      nickName:'眨眼睛'//最开始的昵称
    }
  },

  updateNickName(e){//失去焦点触发昵称修改
    const app=getApp()
    //同步昵称到全局变量
    app.userInfo.nickName=e.detail.value
  },
  chooseAvatar(e){//选择头像并先修改本地的头像路径实现当前界面头像更新,再同步到全局变量
    const app=getApp()
    this.setData({//这种写法别忘了['userInfo.avatar']
      ['userInfo.avatar']:e.detail.avatarUrl
    })
    app.userInfo.avatar=this.data.userInfo.avatar
  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {

  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady() {

  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow() {//在onShow时同步全局变量到当前页面(onshow很重要,要不然不能实现每次进入该页面都同步)
    const app=getApp()
    this.setData({
      ['userInfo.nickName']:app.userInfo.nickName,
      ['userInfo.avatar']:app.userInfo.avatar
    })
    console.log(app.userInfo.avatar)
  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide() {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload() {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh() {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom() {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage() {

  }
})

效果演示:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/438882.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

打造经典游戏:HTML5与CSS3实现俄罗斯方块

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

Android随手记

activity的生命周期 创建时 onCreate() - onStart() - onResume() - onPause() - onStop() - onDestroy() 切换时 a切换到b a.onCreate() - a.onStart() - a.onResume - a.onPause - b.onCreate() - b.onStart() - b.onResume() - a.onStop() b切换回a b.onPause() - a.onR…

设计模式之——简单工厂模式

上图为简单工厂模式的架构图。 1&#xff0c;产品&#xff08;Product&#xff09; 将会对接口进行声明。 2&#xff0c;具体产品&#xff08;Concrete Products&#xff09;是产品接口的不同实现。 3&#xff0c;创建者&#xff08;Concrete Creators&#xff09;将会重写基…

Docker基础教程 - 7 容器数据卷

更好的阅读体验&#xff1a;点这里 &#xff08; www.doubibiji.com &#xff09; 7 容器数据卷 什么是容器卷&#xff0c;为什么需要容器卷&#xff1f; 我们在运行容器的时候&#xff0c;产生的数据都是保存在容器内部的。如果使用Docker来运行mysql容器&#xff0c;数据…

macOS Sonoma 14.4(23E214)发布[附黑苹果/Mac系统镜像]

黑果魏叔3 月 8 日消息&#xff0c;苹果今日向 Mac 电脑用户推送了 macOS 14.4 更新&#xff08;内部版本号&#xff1a;23E214&#xff09;&#xff0c;本次更新距离上次发布隔了 29 天。 魏叔翻译 macOS 14.4 版本主要内容如下&#xff1a; macOS Sonoma 14.4 为你的 Mac 引…

遗传算法优化BP神经网络时间序列回归分析,ga-bp回归分析

目录 BP神经网络的原理 BP神经网络的定义 BP神经网络的基本结构 BP神经网络的神经元 BP神经网络的激活函数, BP神经网络的传递函数 遗传算法原理 遗传算法主要参数 遗传算法流程图 完整代码包含数据下载链接: 遗传算法优化BP神经网络时间序列回归分析,ga-bp回归分析(代码完…

子查询与连表查询

子查询与连表查询 标签:数据库 子查询 mysql> explain select e.empno,e.ename,(select dname from dept d where e.deptno d.deptno) as dname from emp e where e.deptno 1; -------------------------------------------------------------------------------------…

【Web安全】XSS攻击与绕过

【Web安全】XSS攻击与绕过 【Web安全靶场】xss-labs-master 1-20 文章目录 【Web安全】XSS攻击与绕过1. XSS攻击是啥&#xff1f;2. XSS如何发生&#xff1f;3. XSS分类3.1. 反射型3.2. 存储型3.3. DOM型 4. XSS攻击方式1. script标签2. img标签3. input标签4. details标签5.…

CAN总线及通讯的工作原理

一、CAN总线 CAN是控制器局域网络(Controller Area Network)的简称&#xff0c; 它是由研发和生产汽车电子产品著称的德国BOSCH公司开发的&#xff0c; 并最终成为国际标准&#xff08;ISO11519&#xff09;&#xff0c;是国际上应用最广泛的现场总线之一。 二、工作原理 …

大规模语言模型中新的思想和方法

大规模语言模型的发展引入了多项创新的思想和方法&#xff0c;这些创新对实际效果产生了深远的影响&#xff1a; 1. 深度神经网络架构创新 如Transformer模型的引入&#xff0c;利用自注意力机制解决了长序列输入的处理难题&#xff0c;使得模型能够更有效地捕获语言中的长距离…

2024年AI辅助研发:科技遇上创意,无限可能的绽放

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! 随着人工智能技术的持续突破与深度融合&#xff0c;2024年AI辅助研发正以前所未有的速度和规模&#xff0c;引领着科技界和工业界…

加密 / MD5算法 /盐值

目录 加密的介绍 MD5算法 盐值 加密的介绍 加密介绍&#xff1a;在MySQL数据库中, 我们常常需要对密码, 身份证号, 手机号等敏感信息进行加密, 以保证数据的安全性。 如果使用明文存储, 当黑客入侵了数据库时, 就可以轻松获取到用户的相关信息, 从而对用户或者企业造成信息…

Java学习笔记------内部类

类的五大成员 属性、方法、构造方法、代码块、内部类 内部类 格式&#xff1a; public class Outer{//外部类 public class Inner{//内部类 } } public class Test{//外部其他类 public static void main(String[] args) } inner类表示的事物是Outer类的一部分&#xf…

ABB机器人信号关联Cross Connection的具体方法示例

ABB机器人信号关联Cross Connection的具体方法示例 如下图所示,点击打开菜单,然后点击控制面板进入, 如下图所示,找到配置,点击进入, 如下图所示,找到“Cross Connection” 信号关联,点击进入, 如下图所示,选中“Cross Connection”后,点击下方的“显示全部”, 如下…

DFT应用:计算线性卷积

目录 一、计算两个有限长序列的线性卷积示例 二、无限长序列和有限长序列的卷积(重叠相加法) 实验1&#xff1a;数据实验 实验2&#xff1a;纯净语音加混响(音效) 二、无限长序列和有限长序列的卷积(重叠保留法) 实验1&#xff1a;数据实验 三、小结 一、计算两个有限长序…

吴恩达机器学习笔记十五 什么是导数 计算图 大型神经网络案例

假设函数 J(w)w^2&#xff0c;当 w3 时&#xff0c; J(w)3*39 当我们给w增加一个很小的量时&#xff0c;观察J(w)如何变化。 例如 w30.001&#xff0c; 则J&#xff08;w&#xff09;9.006001&#xff0c;因此当w3且增加一个变化量 ε 时&#xff0c;J(w)将会增加 6ε&#x…

非线形优化 Matlab和Python (含01规划)

MATLAB&#xff1a;fmincon 在matlab中&#xff0c;一般使用fmincon来解决非线性优化问题 [x,fval,exitflag,output,lambda,grad,hessian]fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options) 一般使用&#xff1a; [x,fval,exitflag]fmincon(fun,x0,A,b,Aeq,beq,lb,ub,non…

RestTemplate解析响应数据中文字符出现Unicode编码问题解决和源码剖析

问题 基于上篇文章&#xff0c;开发过程中又遇到一个restTemplate问题&#xff1a; restTemplate请求接口返回响应数据为json时&#xff0c;解析其中的中文字符出现Unicode编码 测试 接口如下&#xff1a; 测试代码&#xff1a; 觉得很奇怪&#xff0c;我的restTemplate配置…

排序算法——梳理总结

✨冒泡 ✨选择 ✨插入  ✨标准写法  &#x1f3ad;不同写法 ✨希尔排序——标准写法 ✨快排 ✨归并 ✨堆排 ✨冒泡 void Bubble(vector<int>& nums) {// 冒泡排序只能先确定最右边的结果&#xff0c;不能先确定最左边的结果for (int i 0; i < nums.size(); i){…

Effective C++ 学习笔记 条款16 成对使用new和delete时要采取相同形式

以下动作有什么错&#xff1f; std::string *stringArray new std::string[100]; // ... delete stringArray;每件事看起来都井然有序&#xff0c;使用了new&#xff0c;也搭配了对应的delete。但还是有某样东西完全错误&#xff1a;你的程序行为未定义。至少&#xff0c;str…