[自定义组件]微信小程序自定义组件实现缩略图和原图分离及可缩放效果

news2024/12/25 9:56:04

目录

  • 目标及基础环境
    • 背景
  • 实现原理
    • 左右滑动
    • 缩放
    • 图片菜单
  • 开发实现
    • 自定义组件
      • wxml组件结构
      • wxss 样式控制
      • js定义属性及回调
      • json声明为组件
    • 使用
      • 添加组件声明及地址
      • 声明为全局组件(也可声明为局部)
      • 声明为全局组件(也可以声明为全局组件)
      • 使用组件
    • 效果展示
  • 附:

目标及基础环境

背景

微信自带的 wx.previewImage()在图片预览时须传递所有图片的URL,当图片无法直接访问(如需携带cookies),须一次性下载所有图片,转换成本地地址后放入url参数中,此过程用户需要等待时间又比较长时,导致用户体验较差;
基于如上问题,自定义小程序组件实现如下功能:

  1. 模拟图片预览功能;
  2. 支持菜单、左右滑动预览上、下一张;
  3. 预览图与原图的分离显示,即可在需要时加载原图

实现原理

左右滑动

使用swiper、swiper-item组件实现左右滑动

缩放

使用movable-area、movable-view实现图片缩放

图片菜单

通过设置image组件的show-menu-by-longpress="true"实现菜单功能

开发实现

自定义组件

wxml组件结构

基于实现原理源代码如下:

<!--components/imgview/imgview.wxml-->
  <text class="self-closeImgview" bindtap="closeImgview">X</text>
  <swiper current="{{current}}" circular="true" style="width: 100%;height: 100%;background-color: rgba(0, 0, 0, 0.9);position: absolute;top: 0;">
    <block wx:for="{{imagelist}}" wx:key="id">
      <swiper-item style="width: 100%;height: 100%; ">
      <movable-area scale-area="true" style="margin-top: 5%;height: 90%;width: 100%;">
        <movable-view direction="all" scale="true" direction="true" style="height: 100%;width: 100%;">
          <image src="{{item.thumbUrl}}" mode="aspectFit" 	show-menu-by-longpress="{{showmenu}}" style="min-height: 100%;min-width: 100%;"></image>
        </movable-view>
      </movable-area>
        <view class="self-viewimg-control">
          <text>{{item.desc}}</text>
          <text class="self-viewimg-orginbtn" data-originurl="{{item.imgUrl}}" bindtap="vieworigin">查看原图</text>
        </view>
      </swiper-item>
    </block>
  </swiper>

wxss 样式控制

.self-viewimg-control {
  color: white;
  position: absolute;
  bottom: 30px;
  left: 2%;
  font-size: 0.85rem;
}
.self-viewimg-control text {
  display: inline-table
}
.self-viewimg-orginbtn {
  border-radius: 6px;
  padding: 1px;
  border: 1px solid white;
}
.self-closeImgview {
  position: absolute;
  right: 2%;
  top: 2%;
  border: 1px solid white;
  color: white;
  z-index: 9999;
  border-radius: 10px;
  display: block;
  width: 20px;
  height: 20px;
  text-align: center;
}

js定义属性及回调

注意组件中的属性定义

  • 组件的属性列表
    • current: 当前查看图片的索引号
    • showmenu: 是否展示图片菜单
    • imagelist: 图片数组对象
      • thumbUrl:缩略图地址,组件将展示此图地址,可左右滑动切换
      • imgUrl: 原图地址,用户点击“查看原图”加载原图显示
      • desc: 图片备注信息
    • changeStatus: 回调函数,用户通知父组件数据变化
Component({
  /**
   * 组件的属性列表
   * current: 当前查看图片的索引号
   * showmenu: 是否展示图片菜单
   * imagelist: 图片数组对象
   * 	thumbUrl:缩略图地址,组件将展示此图地址,可左右滑动切换
   *    imgUrl: 原图地址,用户点击“查看原图”加载原图显示
   *    desc: 图片备注信息
   * changeStatus: 回调函数,用户通知父组件数据变化
   */
  properties: {
    current: {
      defaultval: 1,
      type: Number
    },
    showmenu:{
      defaultval: false,
      type: Boolean
    },
    preview: {
      defaultval: true,
      type: Boolean
    },
    imagelist:{
      type: []
    },
    changeStatus:{
      type: Function
    }
  },

  /**
   * 组件的初始数据
   */
  data: {

  },

  /**
   * 组件的方法列表
   */
  methods: {
    vieworigin: function(data) {
      console.log(data.currentTarget.dataset.originurl,"+++++")
      /*
      wx.previewImage({
        urls: [data.currentTarget.dataset.originurl],
      })
      */
      const url = data.currentTarget.dataset.originurl;
      if(url) {
        wx.showLoading({
          "title":"原图下载中"
        })
        /* 此过程须根据实际需要实现下载原图逻辑
        commonUtils.downloadFile(url,function(tmpurl) {
           wx.hideLoading()
            //图片预览
            wx.previewImage({
              urls: [tmpurl] // 需要预览的图片http链接列表
            })
        })
        */
        /**下载原图后使用wx.previewImage()实现原生方法加载图片预览*/
         wx.previewImage({
              urls: [url ] // 需要预览的图片http链接列表
            })
      }else {
        commonUtils.errorToast("数据错误!")
      }
    },
    closeImgview: function(data) {
      // 回调组件所在父组件方法传值
      this.triggerEvent("changeStatus",false)
    }
  }
})

json声明为组件

{
  "component": true
}

使用

app.json中添加如下内容

添加组件声明及地址

“pages”: [] 添加组件地址,如:

"pages": [
 "components/imgview/imgview"
 ] 

声明为全局组件(也可声明为局部)

"usingComponents": {
   "imgview": "/components/imgview/imgview"
 },

声明为全局组件(也可以声明为全局组件)

在对应页面的json文件中添加如下内容

{
 "usingComponents": {
   "component-tag-name": "path/to/the/custom/component"
 }
}

使用组件

在需要的页面添加自定义组件,像原生组件一样使用

<imgview class="self-imgview-desc" imagelist="{{imagelist}}" current="{{currindex}}" showmenu="true" bind:changeStatus="changeStatus" wx:if="{{preview}}"></imgview>

效果展示

没有备注信息的效果

在这里插入图片描述

带备注信息的效果

在这里插入图片描述

图片带菜单的效果

在这里插入图片描述

缩放效果(真机效果)

在这里插入图片描述
在这里插入图片描述

查看原图效果

在这里插入图片描述

附:

微信开发文档之自定义组件

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pycharm安装, 汉化 , 使用教程

目录 1.下载安装包 2.汉化 3.使用 1.下载安装包 访问Pycharm官网 根据自己的操作系统下载对应版本的Pycharm Community或Professional Edition。 2.汉化 点击“file”选项&#xff0c;然后点击“setting”&#xff0c;再点击“plugins”选项&#xff1b; 输入“Chinese”找…

使用Frp进行反向代理实现远程桌面控制[teamviewer/nomachine]

.使用Frp进行反向代理实现远程桌面控制 V1.0.0 – by Holden Date : 2023-06-20 文章目录 .使用Frp进行反向代理实现远程桌面控制1. 简介2. 工具准备3. 服务器端搭建4. 受控端配置&&运行teamviewer5. 控制机端运行teamviewer6. 切换成nomachine 1. 简介 ​ frp 是一…

winform多语言资源管理

SailingEase WinForm Framework WinForm开发框架开发手册&#xff1a;http://docs.shengxunwei.com/Home/Browser/sewinformfw/ 这是我2010年左右&#xff0c;写 Winform IDE &#xff08;使用 .NET WinForm 开发所见即所得的 IDE 开发环境&#xff0c;实现不写代码直接生成应用…

什么是算法

有人说程序算法数据结构&#xff0c;虽说这样的认为有失偏颇&#xff0c;一个程序决定的东西实在太多&#xff0c;但某些方面也说明了算法是很重要的&#xff08;数据结构承上启下&#xff0c;最终也是要为算法服务&#xff09;。 算法是用来解决问题的&#xff0c;要理解什么是…

AI Image Codec技术落地实践

AI Codec自2016年首次提出以来&#xff0c;众多海内外高校、企业研究院等机构对此展开了广泛研究。6年时间里&#xff0c;AI Codec 的SOTA方案的压缩性能已经超越了H.266(最新的传统Codec标准)&#xff0c;展现了强大的技术潜力。但受限于计算复杂度、非标等原因&#xff0c;AI…

Vue中的JSX的特性

JSX简介 JSX是一种Javascript的语法扩展&#xff0c;即具备了Javascript的全部功能&#xff0c;同时又兼具html的语义化和直观性。它可以让我们在JS中写模板语法&#xff1a; const el <div>Vue 2</div>; 复制代码上面这段代码既不是 HTML 也不是字符串&#xf…

java阿里云sls基于LoghubAppender自定义日志上传

1、背景&#xff1a;阿里sls日志提供快捷日志平台&#xff0c;平替elk公司使用这个日志服务&#xff0c;需要对接写入日志 目前日志集成有3种 1&#xff09;基于封装manager手动写日志手动send 弊端&#xff1a;本地日志和阿里云日志共用日志代码很臃肿 2&#xff09;基于云服…

开启数字时代,分享电脑监控和录制工具

近年来&#xff0c;随着网络技术的快速发展和普及&#xff0c;电脑屏幕录制和监控越来越成为企业、学校、家庭等不可或缺的工具。无论是在线教学、远程工作&#xff0c;还是家长对孩子上网行为的关注&#xff0c;电脑屏幕录制和监控都具有极大的帮助和重要性。今天就给大家推荐…

【Visual Studio】使用 C++ 语言,配合 Qt,开发了一个串口通信界面

知识不是单独的&#xff0c;一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏&#xff1a;Visual Studio。 文章目录 1. 获取串口名字1.1 文件 GUI.ui1.2 文件 GUI.h1.3 文件 GUI.cpp 2. 配置串口连接2.1 文件 GUI.ui2.2 文件 GUI.h2.3 文件 GUI.cpp 3. 配置串口连接…

chatgpt赋能python:Python排错大全:10年经验总结,快速定位并解决问题!

Python排错大全&#xff1a;10年经验总结&#xff0c;快速定位并解决问题&#xff01; 作为一名有着10年Python编程经验的工程师&#xff0c;在这篇文章中&#xff0c;我将详细介绍常见的Python排错技巧&#xff0c;以及我在实际工作中使用的一些技巧和最佳实践。我们将学习如…

《网络安全0-100》安全策略制定

安全策略制定 安全策略制定是指制定一系列的规范、标准和 流程&#xff0c;以保护企业或组织的信息资源和业务活 动&#xff0c;确保其安全性和可靠性。安全策略制定通 常包括以下几个步骤&#xff1a; 风险评估&#xff1a;对企业或组织的信息系统进行全面 评估&#xff…

Electron 和 Angular 项目升级

Electron 和 Angular 项目升级: Angular4Electron1.7.8 升级到 Angular13Electron2 原项目 Angular 和 Electron 版本: angular/cli: 1.4.9angular/core: 4.4.6Electron: 1.7.8 升级后 Angular 和 Electron 版本: Angular: 13.3.1Electron: 21.2.1 流程: angular-electro…

一次服务器被入侵的处理过程分享

一、服务器入侵现象 近期有一个朋友的服务器(自己做了网站)好像遭遇了入侵&#xff0c;具体现象是&#xff1a; 服务器 CPU 资源长期 100%&#xff0c;负载较高。 服务器上面的服务不能正常提供服务。 ​ 朋友处理了一会没有解决&#xff0c;我开始想说我不是搞安全的&#xf…

【Visual Studio】报错 LNK2019,使用 C++ 语言,配合 Qt 开发串口通信界面

知识不是单独的&#xff0c;一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏&#xff1a;Visual Studio。 文章目录 问题解决方案Ref. 问题 使用 C 语言&#xff0c;配合 Qt 开发串口通信界面时&#xff0c;报错代码 LNK2019。 复制以下错误信息&#xff0c;方便别…

15、SQL注入之Oracel,MongoDB等注入

这里写目录标题 引言补充上篇文章Json注入案例分析 简要学习各种数据库的注入特点Access数据库Mssql数据库PostgreSQL数据库Oracle数据库MongoDB数据库 简要学习各种注入工具的使用指南 引言 mysql的注入方法跟其它的数据库注入方法是差不多的&#xff0c;是可以举一反三的&am…

【Pandas】pandas用法解析(下)

一、生成数据表 二、数据表信息查看 三、数据表清洗 四、数据预处理 ———————————————— 目录 五、数据提取 1.按索引提取单行的数值 2.按索引提取区域行数值 3.重设索引 4.设置日期为索引 5.提取4日之前的所有数据 6.使用iloc按位置区域提取数据 7…

elasticsearch8.5.2 报错(SearchPhaseExecutionException: all shards failed)

一、问题 logstash突然无法对elasticsearch服务进行读写操作了&#xff0c;提示elasticsearch的地址有问题&#xff0c;检测elasticsearch发现端口存在。查看日志发现有报错。 二、问题原因 有一些索引的数据损坏了 三、解决 官网文档&#xff1a;https://www.elastic.co/…

记录HBuilderX将uniapp项目运行到华为手机

解压并运行刚从官网下载的HBuilder X&#xff0c;新建一个项目 一、电脑下载【华为手机助手】并安装 下载地址&#xff1a; https://consumer.huawei.com/cn/support/hisuite/ 二、华为手机设置 1、手机准备&#xff1a;华为&#xff08;没有插入手机卡&#xff09;&#x…

《网络安全》0-100 零基础

网络安全基础 什么是网络安全 网络安全是指保护计算机网络不受未经授权的攻击、损伤、窃取或破坏的一系列措施。它包括保护计算机系统、网络和数据的完整性、可用性和保密性&#xff0c;以及防止未经授权的访问、使用、披露、破坏、修改、记录或丢失数据。 网络安全是保护信息…

探秘华为交换机:端口类型全解析

在下列情况下&#xff0c;判断的一般方法是什么&#xff1f; 1.交换机某个端口下的用户丢包。 2.交换机下的所有用户都在丢失数据包。 3、用户反映网速缓慢 检查网络电缆&#xff0c;重做水晶头&#xff0c;检查用户的计算机网卡&#xff0c;并重新启动交换机。 这几种做法都能…