微信小程序头像怎么改

微信小程序头像怎么改,第1张

主要步骤

获取用户头像

模板

合成

一、获取用户头像

制作自定义头像的第一步就是先选择。在海豚趣图的交互设计中,用户有三种选择的方式:微信头像、本地相册和相机拍摄。获取用户头像的产品设计如下图所示:

1、由于微信官方不再支持通过 wxgetUserInfo 接口来获取用户信息,我们必须通过使用 button 组件并将 open-type 指定为 getUserInfo 类型来获取或展示用户信息。

为优化用户体验,使用 wxgetUserInfo 接口直接d出授权框的开发方式将逐步不再支持。从2018年4月30日开始,小程序与小游戏的体验版、开发版调用 wxgetUserInfo 接口,将无法d出授权询问框,默认调用失败。正式版暂不受影响。

上图中d出底部菜单的交互方式无法通过 wxshowActionSheet 来实现(因为该接口只能指定字符串文本,不能使用 button, navigator 等组件)。

因此,只能通过自定义 actionSheet 组件来实现以上功能。

mmp-action-sheet 组件

以下是 mmp-action-sheet 组件的代码。

indexwxml

<view hidden="{{!actionShow}}" class="mask {{mask}}" bindtap="actionHide">  <view class="actionSheet animated {{animation}}">

   <slot></slot>

   <button class="close" bindtap="actionHide">{{closeText}}</button>

 </view></view>

2、通过 slot 在 action-sheet 中插入自定义的内容,比如 button、navigator 等。

indexwxss

mask{  position: fixed;  top: 0;  left: 0;  width:100%;  height: 100%;  background: rgba(0, 0, 0, 05);  z-index: 999;

}actionSheet{  width: 100%;  position: absolute;  top: 100%;  z-index: 1000;  overflow: hidden;

}actionSheet button,actionSheet navigator{  color: #000;  text-align: center;  background: #fff;  border-radius: 0;  line-height: 35;  font-size: 32rpx;  border-bottom: 1rpx solid rgb(236, 236, 236);  opacity: 1;

}actionSheet button:active,actionSheet navigator:active{  color:#000;  background: rgb(236, 236, 236);

}actionSheet button::after,actionSheet navigator::after{  border: none;  border-radius: 0;

}actionSheet close{  border-bottom: none;  border-bottom: 50rpx solid #fff;  border-top: 16rpx solid rgb(236, 236, 236);

}animated {  animation-timing-function: ease-out;  animation-duration: 02s;  animation-fill-mode: both;

}@keyframes fadeInBottom {from{   transform: translate3d(0, 0, 0);

}  to {    transform: translate3d(0, -100%, 0);

 }

}fadeInBottom {  animation-name: fadeInBottom;

}@keyframes fadeOutBottom {from{   transform: translate3d(0, -100%, 0);

}  to {    transform: translate3d(0, 0, 0);

 }

}fadeOutBottom {  animation-name: fadeOutBottom;

}@keyframes fadeIn {from{   opacity: 0;

}  to {     opacity: 1;

 }

}fadeIn {  animation-name: fadeIn;

}@keyframes fadeOut {from{   opacity: 1;

}  to {     opacity: 0;

 }

}fadeOut {  animation-name: fadeOut;

}

indexjs

Component({  properties: {    actionSheetStatus: {      type: Boolean,      value: false,

     observer(newVal) {

       if (newVal) {

         thissetData({            actionSheetStatus: true,            animationMask: 'fadeIn',            animationSheet: 'fadeInBottom'

         })

       } else {          thissetData({            actionSheetStatus: false,            animationMask: 'fadeOut',            animationSheet: 'fadeOutBottom'

         })

       }

     }

   },    closeText: {      type: String,      value: '取消'

   }

 },  data: {    animationMask: 'fadeIn',    animationSheet: 'fadeInBottom'

 },  methods: {

   closeActionSheet() {

     thissetData({        animationMask: 'fadeOut',        animationSheet: 'fadeOutBottom'

     })

     setTimeout(() => {

       thissetData({actionSheetStatus: false})

     }, 300)

   }

 }

})

组件只有两个参数:

actionSheetStatus 指定组件的初始展示状态,默认为false,表示不显示组件。

closeText 指定关闭按钮的名字,默认为 取消。

indexjson

{  "component": true,  "usingComponents": {}

}

接下来在页面中调用组件,在组件中插入了3个 button 组件来实现来获取用户头像:

<action-sheet actionSheetStatus="{{actionSheetStatus}}">

   <button open-type="getUserInfo" bindgetuserinfo="bindGetUserInfo">使用微信头像</button>

   <button bindtap="pickPic" data-source-type="album">使用本地相册</button>

   <button bindtap="pickPic" data-source-type="camera">拍照</button>

 </action-sheet>

以上我们通过自定义组件 mmp-action-sheet 就解决了原生的 actionsheet 无法指定 button,从而无法获取用户微信头像的问题。

该组件我已经发布到 npm 包,需要用到的同学可以通过 npm 安装,也可以在 github 上查看源码和使用文档。

二、模板

有了原图,接下来我们需要选择模板。如果模板数量不多或者模板变化不频繁,我们可以直接把模板放在本地。鉴于我提供的模板比较多,放在本地会增大小程序源码的大小,我把模板上传到了小程序的云存储中,通过云函数来动态获取模板,方便以后模板扩展。

云函数 tpl 的代码如下:

// 云函数入口文件const cloud = require('wx-server-sdk')

cloudinit()// 云函数入口函数exportsmain = async (event, context) => {  const wxContext = cloudgetWXContext()  // 1 获取数据库引用

 const db = clouddatabase()  const MAX_LIMIT = 100

 // 2 构造查询语句

 const countResult = await dbcollection('template')count()  const total = countResulttotal  // 计算需分几次取

 const batchTimes = Mathceil(total / 100)  const tasks = []  for (let i = 0; i < batchTimes; i++) {    const promise = dbcollection('template')skip(i MAX_LIMIT)limit(MAX_LIMIT)get()

   taskspush(promise)

 }  return (await Promiseall(tasks))reduce((acc, cur) => {    return {

     data: accdataconcat(curdata),

     errMsg: accerrMsg,

   }

 })

}

页面中调用云函数拉取模板:

getTpl() {    const self = this

   // 调用云函数获取模板

   wxcloudcallFunction({

     name: 'tpl'

   })then(res => {

     selfsetData({

       templates: resresultdata

     })

   })

}

三、问题

到这里模板的获取逻辑已经没有问题了,但在开发过程中遇到了一个问题。模板的链接我使用的是云文件ID,当有大量并行加载的时候,只有部分能够显示,我看了一下dom节点其实都已经存在了,image的src的地址也都是正确的。

1、微信官方自230开始已经支持在image中使用云文件ID。云文件ID的格式为: cloud://xxxxxx/templates/01png。

我猜测可能是对微信云存储并发请求过多导致的(有知道的同学可以告知),因为我试了一下将云文件ID换成正常的>

由此可知,可以想到有三种可行的解决方案:

2、将模板存储到外部OSS,使用>

3、使用 wxgetTempFileURL 用云文件 ID 换取真实链接,也就是>

4、控制图的并行加载数量。我的实践是将并行加载数量控制在20,当用户滚动的时候再发起下一次请求。

在开发中遇到在wxss中给view标签设置了背景色

但是在界面上拉或者下拉的时候,上拉下来出来原本超出屏幕显示区域的部分,背景色还是白色

在界面对应的json文件中,添加如下配置

backgroundColor 指的窗体背景颜色,而不是页面的背景颜色,即窗体下拉刷新或上拉加载时露出的背景

1、在微信开发者工具中,打开appjson文件,在pages数组中增加showwxml页面相关文件的代码,以加粗显示,代码如下:

{

"pages":[

"pages/index/index",

"pages/show/show",

"pages/logs/logs"

],

"window":{

"backgroundTextStyle":"light",

"navigationBarBackgroundColor": "#ccc",

"navigationBarTitleText": "WeChat",

"navigationBarTextStyle":"black"

}

}

2、在indexwxml文件中,在类为usermotto的view组件中添加绑定属性catchtap='enterShow',以加粗显示,代码如下:

<!--indexwxml-->

<view class="container">

<view class="userinfo">

<button wx:if="{{!hasUserInfo && canIUse}}" open-type="getUserInfo" bindgetuserinfo="getUserInfo"> 获取头像昵称 </button>

<block wx:else>

<image bindtap="bindViewTap" class="userinfo-avatar" src="{{userInfoavatarUrl}}" background-size="cover"></image>

<text class="userinfo-nickname">{{userInfonickName}}</text>

</block>

</view>

<view class="usermotto" catchtap='enterShow'>

<text class="user-motto">{{motto}}</text>

</view>

</view>

3、在indexjs文件中,将data中motto的值改为“点击进入”。编写实现跳转的自定义函数enterShow,加粗显示,代码如下:

//indexjs

//获取应用实例

const app = getApp()

Page({

data: {

motto: '点击进入',

userInfo: {},

hasUserInfo: false,

canIUse: wxcanIUse('buttonopen-typegetUserInfo')

},

//事件处理函数

enterShow:function(){

wxnavigateTo({

url: '/show/show',

})

4、 在showwxml中,输入跳转后页面显示的信息,代码如下:

<view>

<text>这是跳转后的页面</text>

</view>

5、然后在indexxwml中点击测试就可以了。

说明:在上面的页面跳转自定义函数enterShow中,也可以使用wxredirectTo实现跳转。两者的区别:redirectTo将关闭当前页面,跳转到指定页面,页面左上角没有返回的箭头按钮;而navigateTo将保留页面,跳转到指定页面,页面左上角有返回的箭头按钮。

扩展资料

其实在小程序后台很早就有个wxopenUrl的函数,普通开发者没有调用权限,这次微信给自家的小程序开放权限,旨在测试这一功能可能的风险。因为这一功能如果全部开放,将会给小程序用户带来很大的安全隐患。居心不良的开发者可能会将用户引流至一些不安全页面。

小程序的审核难度也会变得很大。因为微信除了审核小程序本身的页面跳转和内容,还需要审核外链的链接,并且还不一定能够审核清楚。

先前看到网上不少大神写的demo,其菜单栏主要以 A,B,C,D等字母为主,即A,B,C,D等字母为对应该项携带的 id(id不能为汉字或纯数字)。而笔者现在写的项目菜单栏为汉字,所以需要改变数据格式,进而需要改变 wxml 中的循环嵌套和获取。以下为成型后效果,希望对读者有帮助。

实现该功能的思路:通过点击左侧滑栏的某一项,获取到该元素携带的 id ,然后动态传给右侧滑栏的 scroll-into-view ,从而实现右侧滑栏对应的该元素运动置顶。

以下为完整数据

数据格式:

/ pages/listers/listerswxss /

/ pages/list-1/list-1wxss /

/ 总体主盒子 /

container {

position: relative;

width: 100%;

height: 1220rpx;

background-color: #f0f4f7;

color: #939393;

}

/ 左侧栏主盒子 /

nav_left{

/ 设置行内块级元素(没使用定位) /

display: inline-block;

width: 100%;

height: 100%;

/ 主盒子设置背景色为灰色 /

background: #fff;

text-align: center;

/ position: fixed; /

left: 0;

top: 0;

border-top: 1rpx solid #dedede;

}

/ 左侧栏list的item /

nav_left nav_left_items{

background: #fff;

/ 每个高30px /

height: 80rpx;

/ 垂直居中 /

line-height: 80rpx;

/ 再设上下padding增加高度,总高42px /

padding: 15rpx 0;

/ 只设下边线 /

border-bottom: 1px solid #dedede;

/ 文字14px /

font-size: 29rpx;

color: #101010;

font-weight:

}

/ 左侧栏list的item被选中时 /

nav_left nav_left_itemsactive{

/ 背景色变成白色/

background: #f0f4f7;

color: #ed1000;

}

/ 右侧栏主盒子 /

scroll_right{

/ 右侧盒子使用了绝对定位 /

position: fixed;

top: 0;

right: 0;

overflow: auto;

flex: 1;

/ 宽度75%,高度占满,并使用百分比布局 /

width: 75%;

height: 100%;

padding: 20rpx;

box-sizing: border-box;

background-color: #f0f4f7;

border-top: 1rpx solid #dedede;

}

mink::after{

display:block;content:'';clear:both;

}

jiul,jiul image{

width: 100%;

height: 170rpx;

}

minl{

font-size: 29rpx;

color: #777;

text-align: left;

line-height: 60rpx;

float: left;

background: #f0f4f7;

width: 100%;

/ height: 50rpx; /

}

mink{

width: 100%;

background: #fff;

height: 100%;

}

/ 右侧栏list的item /

nav_right_items{

/ 浮动向左 /

float: left;

/ 每个item设置宽度是3333% /

width: 50%;

/ height: 160rpx; /

text-align: center;

color: #4a4a4a;

background: #fff;

}

nav_right_items image{

/ 被设置宽高 /

width: 60px;

height: 50px;

margin-top: 15rpx;

}

nav_right_items text{

/ 给text设成块级元素 /

display: block;

margin-top: 5rpx;

margin-bottom: 10rpx;

font-size: 26rpx;

/ 设置文字溢出部分为 /

overflow: hidden;

white-space: nowrap;

text-overflow: ellipsis;

}

/ 自定义其他点击态样式类 /

other-navigator-hover{

background:#fff;

}

scroll_left{

width:25%;

height:100%;

background:#fff;

text-align:center;

position: fixed;

left: 0;top: 0

}

一张分成四(n)个区域,各自显示拼成一张,可以用background-position指定显示的区域。然后再wxnavigateTo跳转到不同的页面。这种方法不太好,但是目前只想出这种

小程序开发方法:

1、常规代码式

一般有技术实力的公司开发小程序是依照微信官方的代码形式开发,这种方法优点就是,制作出的小程序界面、样式排列各不相同,功能也比较丰富。但缺点就是需要专业的开发者和UI设计师。开发难度和成本比较高。这种常规的方式显然不适合线下的传统中小企业。

2、使用第三方小程序开发工具

这种方式是使用第三方的小程序开发工具,这类工具一般都不需要编程。区别于微信小程序官方的代码编辑器,这类工具是图形化的界面。做小程序就像做PPT一样。把、文字、音乐等等东西插入,然后设置它们的效果,编辑好后,使用这类工具直接自动小程序代码,把生成的小程序代码上传到微信审核就可以上线自己的小程序了。

以上就是关于微信小程序头像怎么改全部的内容,包括:微信小程序头像怎么改、小程序下拉刷新或上拉加载时背景色、微信小程序怎么设置点图片跳转到别一个页面等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9678096.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存