文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

微信小程序怎么使用自定义组件封装原生image组件

2023-06-26 09:16

关注

本文小编为大家详细介绍“微信小程序怎么使用自定义组件封装原生image组件 ”,内容详细,步骤清晰,细节处理妥当,希望这篇“微信小程序怎么使用自定义组件封装原生image组件 ”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

常规操作

在小程序没还没推出自定义组件功能时,只能通过改变 Page 中的 data 来展示兜底的占位图,所以当时的处理方式十分蛋疼...

1.1.相同默认图

由于需要知道这个图片的数据路径,所以不得不在每个 image 上加上类似 data-img-path 的东西。

<view    wx:for="{{ obj.arr }}"    wx:key="imgSrc"    wx:for-item="item"    wx:for-index="itemIdx"><image        src="{{ item.imgSrc }}"        binderror="onImageError"        data-img-path="obj.arr[{{ itemIdx }}].imgSrc"    /></view>复制代码
const DEFAULT_IMG = '/assets/your_default_img'Page({    data: {        obj: {            arr: [                { imgSrc: 'your_img1' },                { imgSrc: 'your_img2' },            ],        },    },    onImageError ({        target: { dataset: { imgPath } },    }) {        this.setData({            [imgPath]: DEFAULT_IMG,        })    },})复制代码

1.2.不同默认图

如果默认图片不同呢?例如球员、球队和 feed 的默认图片一般都是不同的。

那么一般只好再增加一个属性例如 data-img-type 来标识默认图的类型。

<!-- 球队图 --><image    ...    data-img-type="team"/><!-- 球员图 --><image    ...    data-img-type="player"/>复制代码
const DEFAULT_IMG_MAP = {    feed: '/assets/default_feed',    team: '/assets/default_team',    player: '/assets/default_player',}Page({    data: {        obj: {            arr: [                { imgSrc: 'your_img1' },                { imgSrc: 'your_img2' },            ],        },    },    onImageError ({        target: { dataset: { imgPath, imgType } },    }) {        this.setData({            [imgPath]: DEFAULT_IMG_MAP[imgType],        })    },})复制代码

1.3.图片在模板中

页面层级浅倒还好,如果跨模板了,那么模板就可能要用一个类似于 pathPrefix 的属性来传递模板数据的路径前缀。

<!--    球员排行模板    pathPrefix: String    playerList: Array    ...--><template name="srPlayerRank"><view        wx:for="{{ playerList }}"        wx:key="imgSrc"        wx:for-item="item"        wx:for-index="itemIdx"    ><image            src="{{ item.imgSrc }}"            binderror="onImageError"            data-img-type="player"            data-img-path="{{ pathPrefix }}.playerList[{{ itemIdx }}].imgSrc"        /></view></template>复制代码

最后在失败回调里调用 setData({ [path]: DEFAULT_IMG }) 重新设置图片地址。

自定义组件

2.1.原生自定义组件

原生写法一般要写4个文件:.json/.wxml/.js/.wxss

{    "component": true}复制代码
<!-- 加载中的图片 --><image    hidden="{{ !isLoading }}"    src="{{ errSrc }}"    style="width: {{ width }}; height: {{ height }}; {{ styleStr }}"    mode="{{ imgMode }}"/><!-- 实际加载的图片 --><image    hidden="{{ isLoading }}"    src="{{ imgSrc || src }}"    mode="{{ imgMode }}"    style="width: {{ width }}; height: {{ height }}; {{ styleStr }}"    bindload="_onImageLoad"    binderror="_onImageError"    lazy-load="{{ true }}"/>复制代码
const DEFAULT_IMG = '/assets/your_default_img'Component({    properties: {        // 图片地址        src: String,        // 图片加载中,以及加载失败后的默认地址        errSrc: {            type: String,            // 默认是球队图标            value: DEFAULT_IMG,        },        width: {            type: String,            value: '48rpx',        },        height: {            type: String,            value: '48rpx',        },        // 样式字符串        styleStr: {            type: String,            value: '',        },        // 图片裁剪、缩放的模式(详见文档)        imgMode: {            type: String,            value: 'scaleToFill',        },    },    data: {        imgSrc: '',        isLoading: true,    },    methods: {        // 加载图片出错        _onImageError (e) {            this.setData({                imgSrc: this.data.errSrc,            })            this.triggerEvent('onImageError', e)        },        // 加载图片完毕        _onImageLoad (e) {            this.setData({ isLoading: false })            this.triggerEvent('onImageLoad', e)        },    },})复制代码

布吉岛大家使用原生写法时有木有一些感觉不方便的地方:

2.2.TuaImage.vue

所以以下是一个使用单文件组件封装原生 image 组件的例子。

<config>{    "component": true}</config><template lang="wxml"><!-- 加载中的图片 --><image        hidden="{{ !isLoading }}"        src="{{ errSrc }}"        style="{{ imgStyleStr }}"        mode="{{ imgMode }}"    /><!-- 实际加载的图片 --><image        hidden="{{ isLoading }}"        src="{{ imgSrc || src }}"        mode="{{ imgMode }}"        style="{{ imgStyleStr }}"        bindload="_onImageLoad"        binderror="_onImageError"        lazy-load="{{ true }}"    /></template><script>// 也可以设置为网络图片如: https://file.lsjlt.com/upload/202306/25/2shxsruvywo.pngconst DEFAULT_IMG = '/assets/your_default_img'export default {    props: {        // 图片地址        src: String,        // 图片加载中,以及加载失败后的默认地址        errSrc: {            type: String,            // 默认是球队图标            default: DEFAULT_IMG,        },        width: {            type: String,            default: '48rpx',        },        height: {            type: String,            default: '48rpx',        },        // 样式字符串        styleStr: {            type: String,            default: '',        },        // 图片裁剪、缩放的模式(详见文档)        imgMode: {            type: String,            default: 'scaleToFill',        },    },    data () {        return {            imgSrc: '',            isLoading: true,        }    },    computed: {        // 样式字符串        imgStyleStr () {            return `width: ${this.width}; height: ${this.height}; ${this.styleStr}`        },    },    methods: {        // 加载图片出错        _onImageError (e) {            this.imgSrc = this.errSrc            this.$emit('onImageError', e)        },        // 加载图片完毕        _onImageLoad (e) {            this.isLoading = false            this.$emit('onImageLoad', e)        },    },}</script><style lang="scss"></style>复制代码

读到这里,这篇“微信小程序怎么使用自定义组件封装原生image组件 ”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯