小程序组件化开发

news2024/10/2 10:32:48

前言

    随着小程序的普及,越来越多的开发者开始使用小程序进行开发,而小程序的组件化开发已经成为了一种标配的开发模式。本文将深入介绍小程序组件化开发的相关知识,包括组件的定义、生命周期、通信和使用等方面,帮助大家更好地理解和使用小程序的组件化开发模式。

组件的定义

组件是小程序中的一个重要概念,它能够将页面分解成独立的、可复用的部分,以便于开发和维护,组件可以包含一些特定的功能和样式,同时也能够接受外部的数据和事件。

    在小程序中,组件是通过Component构造函数来定义的。一个组件通常由三个部分组成:propertiesdatamethods。其中,properties用于定义组件的对外接口,data用于定义组件的内部数据,methods用于定义组件的方法。示例代码如下:

Component({
  properties: {
    // 定义组件的属性
    title: {
      type: String,
      value: '默认标题'
    }
  },
  data: {
    // 定义组件的内部数据
    count: 0
  },
  methods: {
    // 定义组件的方法
    handleClick() {
      this.setData({
        count: this.data.count + 1
      })
      this.triggerEvent('click', { count: this.data.count })
    }
  }
})

    定义了一个名为my-component的组件,它包含一个title属性、一个count数据和一个handleClick方法。其中,properties中定义了title属性的类型为String,默认值为默认标题;data中定义了count初始值为0;methods中定义了handleClick方法,可以修改count,并触发click事件。triggerEvent方法用于触发组件的自定义事件。

组件的生命周期

组件的生命周期是指组件从创建到销毁的整个过程,包括组件的创建、更新和销毁等阶段,小程序提供了一些钩子函数,用于在不同的生命周期阶段执行一些特定的操作。以下是小程序组件的生命周期及其钩子函数:

created:组件实例刚刚被创建时触发,此时组件的属性和方法还未初始化;

attached:组件被添加到页面节点树时触发,此时组件的属性和方法已经初始化;

ready:组件渲染完成时触发,此时组件已经可以和用户进行交互;

moved:组件被移动到另一个节点时触发;

detached:组件被从页面节点树移除时触发。
示例代码如下:

Component({
  created() {
    console.log('组件实例被创建')
  },
  attached() {
    console.log('组件被添加到页面节点树')
  },
  ready() {
    console.log('组件渲染完成')
  },
  moved() {
    console.log('组件被移动到另一个节点')
  },
  detached() {
    console.log('组件被从页面节点树移除')
  }
})

当然除了这些,小程序组件还有一些特殊的生命周期,它们并非与组件有很强的关联,但有时组件需要获知,以便组件内部处理。这样的生命周期称为“组件所在页面的生命周期”,在 pageLifetimes 定义段中定义。其中可用的生命周期包括以下几种:
在这里插入图片描述
注意:自定义 tabBar 的 pageLifetime 不会触发。

Component({
  pageLifetimes: {
    show: function() {
      // 页面被展示
    },
    hide: function() {
      // 页面被隐藏
    },
    resize: function(size) {
      // 页面尺寸变化
    }
  }
})

组件的通信

组件之间的通信是小程序开发中的一个重要问题,它涉及到组件之间的数据传递和事件触发等方面

事件传递

小程序中可以通过事件传递实现组件之间的通信。事件传递是指一个组件向其父组件或子组件发送事件,另一个组件则监听该事件并进行相应的处理。在事件触发时,可以将数据作为参数传递给另一个组件。通过这种方式,组件之间可以实现数据的传递和处理。小程序官方提供了一些事件传递的示例代码,如下所示:

// 子组件向父组件传递事件
// 子组件中定义事件
Component({
  methods: {
    onTap: function () {
      this.triggerEvent('myevent', {data: 'hello'}, {})
    }
  }
})
// 父组件中监听子组件事件
<child-component myevent="{{myevent}}"/>
// 父组件中定义事件处理函数
Page({
  handleEvent: function (e) {
    console.log(e.detail) // 输出 {data: 'hello'}
  }
})
// 父组件中监听子组件事件
<child-component bind:myevent="handleEvent"/>
// 父组件中定义事件处理函数
Page({
  handleEvent: function (e) {
    console.log(e.detail) // 输出 {data: 'hello'}
  }
})
// 父组件中监听子组件事件,并传递额外的参数
<child-component bind:myevent="handleEvent" data-extra="extra"/>
// 父组件中定义事件处理函数,获取额外的参数
Page({
  handleEvent: function (e) {
    console.log(e.detail) // 输出 {data: 'hello'}
    console.log(e.currentTarget.dataset.extra) // 输出 extra
  }
})

共享数据

小程序中可以使用 getApp() 方法获取 App 实例,从而在不同的页面和组件之间共享数据。具体的做法是在 App 实例中定义一个全局的数据对象,在需要访问这个数据对象的页面和组件中使用 getApp() 方法获取 App 实例,并通过 this.globalData 访问全局数据对象。共享数据的示例如下所示:

// app.js 中定义全局数据对象
App({
  globalData: {
    userInfo: null
  }
})
// page1.js 中设置数据
const app = getApp()
Page({
  onLoad: function () {
    app.globalData.userInfo = {name: 'Tom'}
  }
})
// page2.js 中获取数据
const app = getApp()
Page({
  onLoad: function () {
    console.log(app.globalData.userInfo) // 输出 {name: 'Tom'}
  }
})

自定义事件

小程序中可以使用自定义事件实现组件之间的通信。自定义事件是指通过事件中心实现组件之间的通信。一个组件可以触发一个自定义事件,而其他组件可以监听这个事件并进行相应的处理。通过这种方式,组件之间可以实现更加灵活的通信。自定义事件的示例代码:

// event.js 中定义事件中心
const eventBus = {}
// 定义事件监听函数
eventBus.on = function (eventName, callback) {
  if (!this[eventName]) {
    this[eventName] = []
  }
  this[eventName].push(callback)
}
// 定义事件触发函数
eventBus.emit = function (eventName, data) {
  if (this[eventName]) {
    this[eventName].forEach(function (callback) {
      callback(data)
    })
  }
}
// page1.js 中触发事件
const eventBus = require('event.js')
Page({
  onTap: function () {
    eventBus.emit('myevent', {data: 'hello'})
  }
})
// page2.js 中监听事件
const eventBus = require('event.js')
Page({
  onLoad: function () {
    eventBus.on('myevent', function (data) {
      console.log(data) // 输出 {data: 'hello'}
    })
  }
})

    小程序组件之间的通信方式有很多种,根据具体的需求选择合适的方式是非常重要的。同时,也需要注意避免过度使用全局数据和事件传递,以避免出现数据不一致和代码混乱的情况。在实际开发中,我们应该根据具体的场景选择合适的通信方式

以上便是要讲的全部内容了,希望可以帮到大家,欢迎各位留言交流!

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

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

相关文章

小程序WebSocket详解

1&#xff0c;什么是WebSocket&#xff1f; WebSocket是一种用于在Web浏览器和服务器之间进行双向通信的协议&#xff0c;而小程序WebSocket是在小程序中使用WebSocket协议进行双向数据通信的一种技术。它可以在单个TCP连接上进行全双工通信&#xff0c;实现实时、高效的数据通…

cesium加载geoserver发布的mvt服务

cesium 本身并不支持矢量切片的加载&#xff0c;所以需要借助其他工具进行解析。在Canvas中把矢量瓦片绘制好了&#xff0c;以图片形式像WMTS一样向Cesium提供图片服务就行了&#xff0c;当然也可以采用中间件的形式在后台把服务渲染好再以服务形式提供给前端。 方法1&#xf…

第八回:如何使用Stack Widget

文章目录 概念介绍使用方法示例代码 我们在上一章回中介绍了GirdView Widget,本章回中将介绍 Stack这种Widget&#xff0c;闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 在Flutter中Stack主要用来叠加显示其它的Widget&#xff0c;类似我们日常生活中的楼层或者…

【Unity3D】魔方

1 需求实现 绘制魔方 中基于OpenGL ES 实现了魔方的绘制&#xff0c;实现较复杂&#xff0c;本文基于 Unity3D 实现了 2 ~ 10 阶魔方的整体旋转和局部旋转&#xff0c;详细需求如下&#xff1a; 用户通过选择魔方阶数&#xff0c;渲染指定阶数的魔方&#xff0c;并且可以自动打…

强化学习原理及应用作业之动态规划算法【SYSU_2023SpringRL】

强化学习原理及应用作业之动态规划算法【SYSU_2023SpringRL】 题目描述:任务一:动态规划方法一、策略迭代算法1、代码2、结果3、思路讲解策略评估策略提升二、价值迭代算法1、代码2、结果3、思路讲解算法整个流程总结题目描述: 本次实践作业将在以下环境进行: 该环境由一…

doris学习之路(一)初识Doris

Apache Doris 是一个基于 MPP 架构的高性能、实时的分析型数据库&#xff0c;以极速易用的特点被人们所熟知&#xff0c;仅需亚秒级响应时间即可返回海量数据下的查询结果&#xff0c;不仅可以支持高并发的点查询场景&#xff0c;也能支持高吞吐的复杂分析场景。基于此&#xf…

win10+Ubuntu双系统安装教程

1、下载Ubuntu镜像文件 Ubuntu各个版本的安装镜像文件可以从华为云下载&#xff1a; http://repo.huaweicloud.com/ubuntu-releases/ Ubuntu桌面版的安装镜像文件名为&#xff1a;ubuntu-<版本号>-desktop-amd64.iso 2、下载安装镜像工具 用win32diskImage 网址为Win…

初始c++语法

我们在C语言的基础之上进行c语言的学习。对于我们的c语言来说&#xff0c;c兼容C语言&#xff0c;所以我们以前编写的C语言的程序在c平台上也是可以运行的。唯一不同的就是我们的c对于我们C语言的部分语法做出了优化以及引入了面向对象的概念。所以在刚开始学习c的时候我们可以…

真题详解(归并)-软件设计(五十三)

真题详解&#xff08;UML部署图&#xff09;-软件设计&#xff08;五十二)https://blog.csdn.net/ke1ying/article/details/130233656 语句覆盖<判定覆盖<条件覆盖<路径覆盖。 2、ISO/IEC 9126软件质量模型中对软件质量定义&#xff1a; 易测试性、易分析性、稳定性、…

【FPGA-Spirit_V2】基于FPGA的循迹小车-小精灵V2开发板

&#x1f389;欢迎来到FPGA专栏~基于FPGA的循迹小车 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;FPGA学习之旅 文章作者技术和水平有限&#xff0c;如果文中出现错误&#xff0c;希望大家能…

Contrastive Representation Learning 对比表征学习(二)关键成分

原文翻译自这里 关键成分 大量数据增强 给定一训练样本&#xff0c;在计算其相关损失之前通常需要数据增强技术为该样本添加噪声。适度的数据增强设定对于学习一个优秀的&#xff0c;泛化性好的嵌入特征是至关重要的。其在不改变语义信息的同时将些微变量引入到样本之中&…

Windows环境下实现设计模式——备忘录模式(JAVA版)

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天总结一下Windows环境下如何编程实现备忘录模式&#xff08;设计模式&#xff09;。 不知道大家有没有这样的感觉&#xff0c;看了一大堆编程和设计模式的书&#xff0c;却还是很难理解设计模式&#xff…

【使用ChatGPT自动化】批量转换.csv文件为.xlsx文件

第1次提问&#xff1a; 我&#xff1a;我想使用Python批量转换.csv文件为.xlsx文件&#xff0c;请你提供代码 它&#xff1a;好的&#xff0c;以下是使用Python批量转换.csv文件为.xlsx文件的代码&#xff1a; import os import glob import pandas as pddef csv_to_xlsx(pa…

MATLAB数值运算(六)

目录 实验目的 实验内容 原创代码&#xff0c;仅供参考&#xff0c;不要直接CV呀 ~_~ 实验目的 1&#xff09;掌握定义符号对象和创建符号表达式的方法&#xff1b; 2&#xff09;掌握符号运算基本命令和规则&#xff1b; 3&#xff09;掌握符号表达式的运算法则以及符号矩阵…

A100 Jeston TX1TX2使用教程-接口说明

EdgeBox_Umate_A100是一款嵌入式人工智能计算机&#xff0c;能够为各类终端设备赋予人工智能的能力&#xff0c;降低终端智能的开发门槛。EdgeBox_Umate_A100搭载了移动处理器——NVIDIA Jetson TX1&#xff0c;并且兼容TX2&#xff0c;是最适合边缘计算的高性能平台。 A100 算…

【Javascript - 力扣每日一题】13. 罗马数字转整数

题目描述 罗马数字包含以下七种字符: I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如&#xff0c; 罗马数字 2 写做 II &#xff0c;即为两个并列的 1 。12 写做 XII &#xff0c;即为…

【黑马2023大数据实战教程】VMWare虚拟机部署HDFS集群详细过程

文章目录 部署HDFS集群1.配置workers:2.配置hadoop-env.sh文件3.配置core-site.xml文件4.配置hdfs-site.xml文件准备数据目录分发Hadoop文件夹配置环境变量授权为hadoop用户格式化文件系统错误排查方法!! 视频&#xff1a;黑马2023 VMWare虚拟机部署HDFS集群 注意&#xff01;这…

linux代码检测工具valgrind之内存检测memcheck

1、安装命令&#xff1a; $ sudo apt-get install valgrind 安装成功如下&#xff1a; 检测版本命令&#xff1a;$ valgrind --version 2、valgrind检测工具tool介绍 &#xff08;1&#xff09;Memcheck是一个内存错误检测器。 &#xff08;2&#xff09;Cachegrind是缓存…

C++语法(19)---- 模拟AVL树

C语法&#xff08;18&#xff09;---- set和map_哈里沃克的博客-CSDN博客https://blog.csdn.net/m0_63488627/article/details/130228232?spm1001.2014.3001.5501 目录 1.AVL树的概念 2.节点定义 3.AVL树的类实现 1.类定义 2.insert 1.全代码实现 2.思考角度 3.平衡因…

【Redis】Redis十大数据类型—哈希hash

介绍 Hash 是一个键值对&#xff08;key - value&#xff09;集合&#xff0c;其中 value 的形式入&#xff1a;value[{field1&#xff0c;value1}&#xff0c;...{fieldN&#xff0c;valueN}]。Hash 特别适合用于存储对象。 Hash和String对象的区别 内部实现 Hash 类型的底…