微信小程序:自定义关注公众号组件样式

简介: 尽管关注公众号组件的样式固定且不可修改,但产品经理的需求却需要个性化的定制。在这种情况下,我们需要寻找解决方案,以满足这些特殊需求,尽管这可能有点棘手。

概述

official-account关注公众号组件本身样式是固定的,也不支持修改样式。尽管关注公众号组件的样式固定且不可修改,但产品经理的需求却需要个性化的定制。在这种情况下,我们需要寻找解决方案,以满足这些特殊需求,尽管这可能有点棘手。

背景

official-account:公众号关注组件。当用户扫小程序码打开小程序时,开发者可在小程序内配置公众号关注组件,方便用户快捷关注公众号,可嵌套在原生组件内。更多配置及使用方法请前往微信官方文档

基础库 2.18.1 起,公众号关注组件显示场景值变更如下:

小程序场景值命中以下值时,可展示关注公众号组件:

  1. 1011 扫描二维码
  2. 1017 前往小程序体验版的入口页
  3. 1025 扫描一维码
  4. 1047 扫描小程序码
  5. 1124 扫“一物一码”打开小程序

小程序热启动场景值命中以下值时,冷启动场景值在【1011、1017、1025、1047、1124】中,可展示关注公众号组件:

  1. 1001 发现栏小程序主入口,「最近使用」列表
  2. 1038 从另一个小程序返回
  3. 1041 从插件小程序返回小程序
  4. 1089 微信聊天主界面下拉,「最近使用」栏
  5. 1090 长按小程序右上角菜单唤出最近使用历史
  6. 1104 微信聊天主界面下拉,「我的小程序」栏
  7. 1131 浮窗
  8. 1187 新版浮窗,微信8.0起

Tips

  1. 使用组件前,需前往小程序后台,在设置 -> 关注公众号中设置要展示的公众号。注:设置的公众号需与小程序为同主体或关联主体。
  2. 在一个小程序的生命周期内,只有从以下场景进入小程序,才具有展示引导关注公众号组件的能力:
    1. 当小程序从扫小程序码场景(场景值1047,场景值1124)打开时。
    2. 当小程序从聊天顶部场景(场景值1089)中的「最近使用」内打开时,若小程序之前未被销毁,则该组件保持上一次打开小程序时的状态。
    3. 当从其他小程序返回小程序(场景值1038)时,若小程序之前未被销毁,则该组件保持上一次打开小程序时的状态。
  3. 为便于开发者调试,基础库 2.7.3 版本起开发版小程序增加以下场景展示公众号组件:
    1. 开发版小程序从扫二维码(场景值 1011)打开 — 体验版小程序打开
  4. 组件限定最小宽度为300px,高度为定值84px
  5. 每个页面只能配置一个该组件。

效果图对比

官方

Snipaste_2023-09-11_17-00-09

自定义

Snipaste_2023-09-11_17-11-00

实现示例(微信小程序原生)

  • components文件夹中自定义组件:wx-official-account

    <!--wxml-->
    <view class="wx-official-account" wx:if="{
         {show}}" style="bottom:{
         {bottom}};opacity:{
         {opacity}}">
      <view class="background">
        <view class="left">
          <image class="img" src="{
         {icon}}"></image>
          <view class="left-cont">
            <view class="title">{
         {
         name}}</view>
            <view class="desc">{
         {
         desc}}</view>
          </view>
        </view>
        <view class="btn">{
         {
         isConcern ? '查看': '关注'}}<official-account class="official-account" id="official_account"></official-account></view>
      </view>
      <image class="icon-close" src="https://acup.oss-cn-hangzhou.aliyuncs.com/video/webapp/images/edu_weapp/icon3-close-g.png" catchtap="close"></image>
    </view>
    <!--js-->
    Component({
         
      options: {
         
        addGlobalClass: true
      },
      properties: {
         
        icon: {
         
          type: String,
          value: '' // 公众号ICON链接
        },
        name: {
         
          type: String,
          value: '' // 公众号名称
        },
        desc: {
         
          type: String,
          value: '' // 公众号简介
        },
        bottom: {
         
          type: [String, Number],
          value: 'calc(env(safe-area-inset-bottom))' // 关注公众号组件bottom
        },
        isConcern: {
         
          type: Boolean,
          value: false // 是否关注公众号
        },
        max: {
         
          type: [String, Number],
          value: 3 // 最大关闭次数
        }
      },
      lifetimes: {
         
        attached: function () {
         
          setTimeout(() => {
         
            this.init()
          }, 800)
        }
      },
      data: {
         
        show: true,
        opacity: 0
      },
      methods: {
         
        // 这里是一个自定义方法
        init() {
         
          let that = this
          const query = wx.createSelectorQuery().in(this)
          query.select('#official_account').boundingClientRect(res => {
         
            if (res.width && res.height) {
         
              that.check();
            } else {
         
              that.setData({
         show: false})
            }
          }).exec()
        },
        async check() {
         
          try {
         
            const num = wx.getStorageSync('CLOSE_OFFICIAL_ACCOUNT');
            const {
         max, isConcern} = this.data;
            if (+num >= max) {
         
              this.setData({
         show: false})
              return false;
            }
            this.setData({
         show: !isConcern})
            const {
         show} = this.data;
            if (show) this.setData({
         opacity: 1})
          } catch (e) {
         
            this.setData({
         show: false})
          }
        },
        close() {
         
          this.setData({
         show: false})
          const storageAccount = wx.getStorageSync('CLOSE_OFFICIAL_ACCOUNT');
          const num = storageAccount ? +storageAccount + 1 : 1;
          wx.setStorageSync('CLOSE_OFFICIAL_ACCOUNT', num);
        }
      }
    });
    <!--wxss-->
    .wx-official-account {
         
      background: url("https://acup.oss-cn-hangzhou.aliyuncs.com/video/webapp/images/edu_weapp/img3-official-account.png") no-repeat;
      background-size: 100% 100%;
      position: fixed;
      z-index: 1000;
      left: 50%;
      transform: translateX(-50%);
      display: flex;
      align-items: center;
      justify-content: space-between;
      padding: 84rpx 28rpx 28rpx;
      border-radius: 12rpx;
      font-weight: 400;
    }
    .wx-official-account .img {
         
      width: 80rpx;
      height: 80rpx;
      display: block;
    }
    .wx-official-account .title {
         
      font-size: 32rpx;
      color: #0A0A0A;
    }
    .wx-official-account .desc {
         
      font-size: 22rpx;
      color: #ABAFB3;
    }
    .wx-official-account .btn {
         
      position: relative;
      width: 104rpx;
      height: 56rpx;
      line-height: 56rpx;
      padding: 0;
      border-radius: 4rpx;
      overflow: hidden;
      text-align: center;
      font-size: 32rpx;
      color: #711920;
      border: 2rpx solid #711920;
    }
    .wx-official-account .btn .official-account {
         
      position: absolute;
      z-index: 1001;
      right: 0;
      top: 0;
      opacity: 0;
      max-width: 616rpx;
      max-height: 56rpx;
    }
    .wx-official-account .icon-close {
         
      position: absolute;
      z-index: 1001;
      right: 28rpx;
      top: 32rpx;
      width: 28rpx;
      height: 28rpx;
    }
    .background {
         
      width: 616rpx;
      height: 120rpx;
      background: #FFFFFF;
      border-radius: 8rpx;
      display: flex;
      align-items: center;
      justify-content: space-between;
      padding: 0 16rpx;
    }
    .background .left {
         
      display: flex;
      align-items: center;
    }
    .left-cont {
         
      margin-left: 20rpx;
    }
    .left-cont .title {
         
      font-weight: 400;
      font-size: 32rpx;
      color: #0A0A0A;
      margin-bottom: 2rpx;
    }
    .left-cont .desc {
         
      max-width: 370rpx;
      font-weight: 400;
      font-size: 22rpx;
      color: #ABAFB3;
      overflow: hidden;
      text-overflow: ellipsis;
      white-space: nowrap;
    }
    
  • 组件调用

    • xxx.json中引入该组件
    {
         
      "usingComponents": {
         
        "custom-official-account": "/components/wx-official-account/index"
      }
    }
    
    • xxx.wxml中使用改组件
    <custom-official-account isConcern="{
          {isWxLook}}"></custom-official-account>
    
    • xxx.js中定义参数
    Page({
         
      data: {
         
          isWxLook: false // 是否微信关注
      },
      onLoad(options) {
         
        // 请求接口判断是否关注公众号,如果已关注,则不再显示此组件
        getSubscribe({
         userId}).then(res => {
         
          if (res.code === 0) {
         
            this.setData({
         
              isWxLook: res.data === 1
            })
          }
        })
      }
    })
    

总结

主要思路是通过一系列操作来实现自定义的关注按钮,覆盖在官方的关注公众号组件上,以实现一种特定的界面效果。以下是文章的主要内容总结:

1. 显示组件并设置透明度为0: 首先,通过某种方式让自定义组件显示在页面上,但将其透明度设置为0,使其在页面上不可见。

2. 判断组件的宽高: 接着检测自定义组件的宽度和高度。这一步的目的是确认页面上是否有足够的空间来容纳自定义组件,以免它会影响页面布局。

3. 判断是否已关注公众号: 接下来,会检查用户是否已经关注了官方的公众号。这一检查可以通过API调用或其他方式来实现。

4. 控制组件的显示: 基于用户是否已经关注公众号的结果,决定是否显示自定义组件。如果用户已关注,自定义组件保持不可见;如果用户未关注,自定义组件会变得可见。

5. 实现自定义关注按钮: 自定义组件被放置在官方的关注按钮上层,透明度设置为0,以实现自定义的关注按钮效果。用户在界面上看到的是自定义按钮,但实际上点击的是位于它下面的官方组件的按钮。

通过这一系列操作,成功地实现了一个覆盖在官方关注按钮上的自定义关注按钮,提供了一种创造性的用户界面效果。这篇博客主要总结了实现这一效果的主要思路和步骤,对于想要定制用户界面的开发者和设计师来说,可能会提供有用的参考和灵感。

如果有更好的实现思路或者方法,请留言☞评论区,欢迎大家讨论。

目录
相关文章
|
7天前
|
人工智能 自然语言处理
使用企业微信或公众号自动回复图片消息
AppFlow支持企业微信和公众号接收图片消息,并提供两种回复方式。方式一:直接回复图片消息,用户发送图片后立即收到回复,但无法继续追问。方式二:先保存图片,待用户发送文字后再一并处理并回复。配置步骤包括选择模板、配置鉴权信息、设置执行动作参数及发布连接流。详细操作可参考相关文档。
使用企业微信或公众号自动回复图片消息
|
1月前
|
人工智能 小程序 API
【一步步开发AI运动小程序】十三、自定义一个运动分析器,实现计时计数02
本文介绍如何利用“云智AI运动识别小程序插件”开发AI运动小程序,详细解析了俯卧撑动作的检测规则构建与执行流程,涵盖卧撑和撑卧两个姿态的识别规则,以及如何通过继承`sports.SportBase`类实现运动分析器,适用于小程序开发者。
|
1月前
|
人工智能 小程序 API
【一步步开发AI运动小程序】十二、自定义一个运动分析器,实现计时计数01
随着AI技术的发展,AI运动APP如雨后春笋般涌现,如“乐动力”、“天天跳绳”等,推动了云上运动会、线上健身等热潮。本文将指导你从零开始开发一个AI运动小程序,利用“云智AI运动识别小程序插件”,介绍运动识别原理、计量方式及运动分析器基类的使用,帮助你在小程序中实现运动计时和计数功能。下篇将继续探讨运动姿态检测规则的编写。
|
2月前
|
API
如何在公众号里制作微信报名表
微信万能表单不仅可以制作各种报名单,也可以用作问卷调查,商品发布,登记汇总等,可以根据自己需求,来添加组件,比如姓名、手机号、性别、报名的时间、报名的图片等,因为微信报名表涉及的用途比较广泛,所以很多商家在做微信公众号报名表的时候,针对性不会太强,没有什么局限性,应用还是起来比较方便的
113 12
|
2月前
|
小程序 前端开发 JavaScript
在线课堂+工具组件小程序uniapp移动端源码
在线课堂+工具组件小程序uniapp移动端源码
68 0
在线课堂+工具组件小程序uniapp移动端源码
|
3月前
|
小程序 数据可视化 JavaScript
微信小程序:轻松实现时间轴组件
本文介绍了如何在微信小程序中实现一个可视化时间轴组件。该组件适用于展示用户资金流动、投资结算等时间节点,帮助用户直观了解资金去向。时间轴支持自定义节点形状、显示序号、倒序排列等功能,并通过插槽灵活定义动态内容。文中详细介绍了组件的设计与使用方法,以及如何结合动态 slot 实现自定义操作。该组件为展示用户资金信息提供了美观、易用的解决方案。
112 1
微信小程序:轻松实现时间轴组件
|
3月前
|
应用服务中间件 网络安全 Apache
Discuz! X3.5 开启ssl证书加密后微信、公众号无消息、支付宝通讯中断等
Discuz! X3.5 开启ssl证书加密后微信、公众号无消息、支付宝通讯中断等、支付宝支付实际支付成功,显示未支付等,都属于通讯中断,需要联系DZ官方付费修改程序,屏蔽防CC!
82 4
|
3月前
|
小程序
微信小程序动态tabBar实现:基于自定义组件,灵活支持不同用户角色与超过5个tab自由组合(更新版)
微信小程序动态tabBar实现:基于自定义组件,灵活支持不同用户角色与超过5个tab自由组合(更新版)
808 1
|
3月前
|
JSON 小程序 JavaScript
uni-app开发微信小程序的报错[渲染层错误]排查及解决
uni-app开发微信小程序的报错[渲染层错误]排查及解决
910 7
|
3月前
|
小程序 JavaScript 前端开发
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
894 1

热门文章

最新文章