《微信小程序实战(2) · 组件封装》

news2024/9/20 18:40:02

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗

🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数,欢迎多多交流。👍

文章目录

    • 写在前面的话
    • 组件实战
      • 背景说明
      • 基础用法
      • 实战说明
    • 总结陈词

写在前面的话

上篇博文《微信小程序实战(1)· 开篇示例 》介绍了本系列课程的背景,本篇博文继续以该示例出发,介绍实战开发中,关于组件方法的运用。


组件实战

参考:微信小程序官网文档

背景说明

通常,使用微信小程序都会借助现成的UI组件,就像 Vue 前端开发中,我们使用 ElementUI 中的表格、下拉框等组件一样,对于半路出家的后端程序猿更是如此,不可能全部元素都自己开发,有现成封装好的还不用吗。

博主开发微信小程序经常采用的是 Vant 或 WeUI,都很好用,只需要简单配置引入后,即可在页面开发中按需使用这些功能。

例如,您可以在 app.json,或某页面.json,使用如下方式引入 Vant 的组件。

"usingComponents": {
  "van-button": "/pages/vant/button/index",
},

然后,在具体的 WXML 页面就可以直接使用:

<van-row>
  <van-col span="24">
    <van-button size="large" plain type="primary" bindtap="submit">提交工单</van-button>
  </van-col>
</van-row>

好了,大致了解组件的用途了,那组件到底是个什么东西,接下来详细介绍。

基础用法

Tips:先来一个简单的示例,帮助理解用法。

Step1、在 components 目录下创建一个新文件夹,例如 myComponent。

Step2、在 myComponent 文件夹中创建以下文件,和页面开发基本一致。

  • myComponent.js:组件的逻辑。
  • myComponent.json:组件的配置。
  • myComponent.wxml:组件的结构。
  • myComponent.wxss:组件的样式。

Step3、编写 myComponent.js

Component({
  properties: {
    title: {
      type: String,
      value: '默认标题'
    }
  },
  data: {
    // 组件内部数据
  },
  methods: {
    // 组件内部方法
    handleClick() {
      this.triggerEvent('click');
    }
  }
});

Step4、编写myComponent.json

{
  "component": true
}

Step5、编写myComponent.wxml

<view class="my-component" bindtap="handleClick">
  <text>{{title}}</text>
</view>

Step6、编写myComponent.wxss

.my-component {
  padding: 10px;
  background-color: #f0f0f0;
  border: 1px solid #ccc;
}

Step7、使用组件

在需要使用该组件的页面中(例如 index 页面),你需要在 index.json 中引入组件,并在 index.wxml 中使用它,几个核心组成分别如下。

{
  "usingComponents": {
    "my-component": "/components/myComponent/myComponent"
  }
}
<view>
  <my-component title="Hello World" bind:click="handleComponentClick"></my-component>
</view>
Page({
  handleComponentClick() {
    wx.showToast({
      title: '组件被点击',
      icon: 'success'
    });
  }
});

至此,运行一下效果,可以看的明白组件的用处了吧。

其实相当于封装公用的部分,各个页面可以快速复用,基本任意前端框架都拥有组件能力,就像 Vue.component。

实战说明

上面基础用法看完,应该大致了解组件的来龙去脉了,那实际开发中,哪些东西可以考虑封装呢,这边以实例进一步补充说明。

本次开发安全巡检小程序的时候,涉及众多表单页面,表单元素里面难免涉及下拉框选项。

那么,传统的做法有几种:picker、actionSheet、自定义模态框等,前两者比较适合数据内容少的情况,如果数据较多,只能自定义模态框的方式,还需要增加上分页或搜索功能。

那分析当前场景,几个表单项都是涉及众多数据元素的情况,那只有自定义开发弹窗了。

好的,那就开发,三下五除二,开发了第一个页面如下,效果还不错。

可以展示信息,可以搜索,可以控制弹窗隐藏和显示,基本具备了。

可是还有很多表单页面,这部分代码量着实不小,所有页面都要拷贝这些代码过去吗?基本HTML、JS、CSS三个部分都要搬了,真的要做搬运工了?

其实不然,这其实你如果还想不到封装组件,那就白做开发这么多年了。

分析了一下前因后果,决定封装一个 showData 数据展示组件,并把组件与父组件的展示一同考虑进去,包括查询数据的接口信息。

Step1、编写JS

var app = getApp();
var ace = require("../../utils/ace.js");

Component({
    /**
     * 组件的属性列表
     */
    properties: {

        url: {  //接口地址
            type: String, value: ''
        },

        textContent: {  //文本内容
            type: String, value: '选择一下:'
        },

        code: {  //Key的属性
            type: String, value: 'valueCode'
        },

        name: {  //Name的属性
            type: String, value: 'valueName'
        },

        ex: {  //额外的属性
            type: String, value: 'validFlag'
        },
    },

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

        dataList: [], query: '',
    },

    created() {
        // 组件创建时的初始化逻辑
        console.log('组件已创建');
    },

    attached() {

        let that = this

        // 组件被插入到页面时的逻辑
        console.log('组件已附加到页面');

        // 访问 properties 中的属性
        const url = this.properties.url || '';
        console.log('url 的值:', url);

        //也可以用data获取
        //const url2 = this.data.url || '';

        if (url) {
            ace.sendGet(url, function (data) {
                if (data) {
                    that.setData({
                        dataList: data
                    })
                }
            })
        }
    },

    ready() {
        // 组件视图渲染完成时的逻辑
        console.log('组件已准备就绪');

    },

    /**
     * 组件的方法列表
     */
    methods: {

        /**
         * 搜索内容
         */
        searchProduct(e) {
            let that = this
            let value = e.detail
            let url = that.data.url
            if (value && url) {
                if (url.indexOf("?") !== -1) {
                    url += '&query=' + value
                } else {
                    url += '?query=' + value
                }
            }
            ace.sendGet(url, function (data) {
                if (data) {
                    that.setData({
                        dataList: data, query: value
                    })
                }
            })
        },

        /**
         * 点击事件
         */
        clickHandle(e) {
            let id = e.currentTarget.dataset.id || ''
            if(id){
                this.triggerEvent('myevent', { data: id});
            }
        },

        /**
         * 关闭事件
         */
        closeHandle: function () {
            this.triggerEvent('myclose');
        }
    },
});

Step2、编写HTML(CSS就不贴出来了)

<van-popup show="true" round position="bottom" bind:close="closeHandle">
    <view class="select-company">
        <van-search value="{{ query }}" placeholder="请输入搜索关键词"
                    bind:change="searchProduct"/>
        <view class="title">{{textContent}}</view>
        <view class="company-list ">
            <view class="item" wx:for="{{dataList}}" wx:key="index" bindtap="clickHandle"
                  data-id="{{ item[code] }}">
                <view class="count">名称:{{item[name]}}</view>
                <view class="count"> | 类型:{{item[ex]}}</view>
            </view>
        </view>
    </view>
</van-popup>

Step3、注册到全局json或页面级json

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

Step4、具体页面使用组件

<showData url="xjCheckType?userCode={{payNo}}" bind:myevent="handleMyEvent" bind:myclose="handleMyClose"
  wx:if="{{showDataFlag}}"></showData>

至此,搞定收工,效果和原先单独开发效果一样。


总结陈词

这里说一个组件封装的思路和技巧,实战开发中,往往不会第一时间就想到功能的可封装性,这并不要求,完全可以等功能开发完毕后,再将第一个版本使用组件,复制一份,最终可以用组件完美复刻功能,即为成功,也是常见思路。

此篇文章是《微信小程序实战》系列的第二篇,后续该专栏会继续分享小程序实战中运用的技能,希望可以帮助到大家。

💗 后续会逐步分享企业实际开发中的实战经验,有需要交流的可以联系博主。

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

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

相关文章

138、Java内部类源码

01.代码如下&#xff1a; package TIANPAN;class Outer { // 外部类private String msg "Hello World !";class Inner { // 定义一个内部类private String info "世界&#xff0c;你好&#xff0…

【深度分析】OpenAI o1是最强的推理模型,却不是最强模型!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;专注于分享AI全维度知识&#xff0c;包括但不限于AI科普&#xff0c;AI工…

磁盘写操作压力测试工具的设计与实现

磁盘写操作压力测试工具的设计与实现 1. 设计概述2. 关键技术点3. 伪代码设计4. C代码实现5. 运行与测试6. 结论在进行磁盘性能评估时,写操作压力测试是不可或缺的一部分。本篇文章将介绍如何使用C语言结合系统调用,设计并实现一个针对磁盘写操作的压力测试工具。这个工具将模…

【设计模式-桥接】

定义 桥接模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式&#xff0c;它通过将抽象部分与实现部分分离&#xff0c;使它们都可以独立地变化。桥接模式的关键在于将类的抽象部分与其实现部分解耦&#xff0c;以便两者可以独立地变化。这种设计模式的一个主要…

湖北产教融合教育研究院成功协办武汉工程大学2024年同等学力申硕开学典礼

9月7日&#xff0c;武汉工程大学&#xff08;流芳校区&#xff09;教育教学综合楼102报告厅内庄严肃穆&#xff0c;近百位怀揣梦想、追求卓越的学子与校领导、教师代表汇聚一堂&#xff0c;共同迎接“乘风破浪 逐光前行”武汉工程大学2024年同等学力申请硕士学位人员开学典礼的…

【觅图网-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

搜索二叉树的认识以及底层实现

如果说到对一个数组进行查找相应的数据&#xff0c;要求效率最高&#xff0c;大家会想到什么方式呢&#xff1f;二分查找&#xff1f;二分查找的效率确实很高&#xff0c;时间复杂度为O(logN)。但是如果我们想要在数组当中添加新的数据呢&#xff1f;加上这一功能之后二分查找的…

KVM创建的虚拟机无法访问外网

基础环境如下&#xff1a; [rootlocalhost ~]# virsh domifaddr CentOS7_YFName MAC address Protocol Address -------------------------------------------------------------------------------vnet0 52:54:00:cb:a6:0d ipv4 192.168.…

后台数据管理系统 - 项目架构设计-Vue3+axios+Element-plus(0917)

十一、登录注册页面 [element-plus 表单 & 表单校验] 注册登录 静态结构 & 基本切换 安装 element-plus 图标库 pnpm i element-plus/icons-vue静态结构准备 <script setup> import { User, Lock } from element-plus/icons-vue import { ref } from vue cons…

P2865 [USACO06NOV] Roadblocks G

*原题链接* 次短路模版题 在刚学最短路时&#xff0c;我做过这道题集合位置&#xff0c;那时博客上写的是枚举删除最短路上的边&#xff0c;然后求解。不过这种做法最坏时间复杂度可以有&#xff0c;对于这道题数据范围较大&#xff0c;所以可以用更好写&#xff0c;思维难度…

Linux学习记录十四----------线程的创建和回收

文章目录 五、Linux线程1.守护进程1.1.守护进程的特点1.2.进程组1.3会话1.4创建守护进程模型 2.线程的概念3.线程的创建及相关函数3.1.创建线程‐‐pthread_create3.2.单个线程退出 --pthread_exit3.3.阻塞等待线程退出&#xff0c;获取线程退出状态--pthread_join3.4.线程分离…

python怎么运行cmd命令

使用os.system(“cmd”) 该方法在调用完shell脚本后,返回一个16位的二进制数,低位为杀死所调用脚本的信号号码,高位为脚本的退出状态码,即脚本中“exit 1”的代码执行后,os.system函数返回值的高位数则是1,如果低位数是0的情况下,则函数的返回值是0100,换算为10进制得到256。 …

JavaScript web API完结篇---多案例

BOM window对象 >包含docment Browser Object Model 定时器–延时函数 之前学的是间歇函数 让代码延迟执行 仅执行一次 setTimeout(回调函数&#xff0c;等待毫秒数) 消除 clearTimeout(timer) > 用于递归时需要进行去除 JS执行机制 单线程 > 一个任务结束&…

ROS组合导航笔记2:使用外部定位系统

在上一单元中&#xff0c;我们了解了如何合并不同传感器的数据以生成机器人的姿势估计。因此&#xff0c;基本上&#xff0c;我们介绍了图表的以下部分&#xff0c;其中向 robot_localization 节点提供了不同的传感器&#xff0c;以便通过卡尔曼滤波器进行合并。 但是...图表的…

【浅水模型MATLAB】尝试复刻SCI论文中的溃坝流算例

【浅水模型MATLAB】尝试复刻SCI论文中的溃坝流算例 前言问题描述控制方程及数值方法浅水方程及其数值计算方法边界条件的实现 代码框架与关键代码模拟结果 更新于2024年9月17日 前言 这篇博客算是学习浅水方程&#xff0c;并利用MATLAB复刻Liang (2004)1中溃坝流算例的一个记录…

【FreeRL】Rainbow_DQN的实现和测试

文章目录 前言环境1 PER note2 C51 note3 Noisy note4 Rainbow note其他 前言 具体代码实现见&#xff1a;https://github.com/wild-firefox/FreeRL/blob/main/DQN_file/DQN_with_tricks.py 将其中所有的trick都用上即为Rainbow_DQN。 效果如下&#xff1a;&#xff08;学习曲…

word文档的写入(1)

Word文档的写入 我们手动复制Excel信息&#xff0c;再粘贴进Word&#xff0c;进行文件保存的整个操作。属于机械性的重复劳动&#xff0c;并不能带来太大价值。在Excel和Word的操作内&#xff0c;也没有能很好解决此类问题的方法。如果遇到信息一多&#xff0c;几十上百个文件&…

Win11小技巧之调节音量

无意中发现&#xff0c;鼠标悬停在喇叭&#x1f508;处可通过滚轮调节音量&#xff0c;无需每次都点开音量面板&#xff0c;再悬停在音量滚动条处通过滚轮调节&#xff01;&#xff08;设计师……怎么不早告诉我……&#xff09; 不用点开&#xff0c;之前一直都是这么调节音量…

c++—多态【万字】【多态的原理】【重写的深入学习】【各种继承关系下的虚表查看】

目录 C—多态1.多态的概念2.多态的定义及实现2.1多态的构成条件2.2虚函数的重写2.2.1虚函数重写的两个例外&#xff1a;2.2.1.1协变2.2.1.2析构函数的重写 2.3 c11的override和final2.3.1final2.3.2override 2.4 重载、重写、重定义的对比 3.抽象类3.1抽象类的概念3.2接口继承和…

5款录屏软件电脑版,哪一款更适合你?

身边不少做行政的小伙伴&#xff0c;经常需要制作一些培训视频、会议记录或是演示文稿。这就要求他们必须掌握一款好用的录屏软件。作为一个经常搜索各种办公软件的人&#xff0c;今天&#xff0c;我就来分享一下我使用过的五款录屏软件在录制电脑屏幕时的表现。 1、福昕录屏大…