微信小程序第二节 —— 自定义组件。

news2024/10/3 2:19:37

👉微信小程序第一节 —— 自定义顶部、底部导航栏以及获取胶囊体位置信息。

一、前言

📖📖📖书接上回 ,dai ga hou啊!我是 😘😘😘是江迪呀。在进行微信小程序开发中,组件是我们经常使用到的东西,它作为一个独立的模块封装了一些具有特定功能的元素、属性、方法和事件,一次定义可以被反复使用,大大提高了开发效率。微信小程序官方也定义了很多组件如:scroll-viewview等。我们也可以自定义,下面让我来浅谈下自定义组件以及常见用法。

二、微信小程序的组件

1.组件是啥以及作用?

1.1 组件

组件相当于一个独立的模块,一次定义随处可以使用。就像机器零件一样,它们都有着独特的功能和属性,可以根据需要组合使用,构建出一个完整的机器。每个零件都是独立的,可以单独使用,也可以与其他零件组合使用。

1.2 优点

  • 提高代码复用性,减少代码量。
  • 提高开发效率。
  • 提高代码结构的清晰度和维护性。

2.组件的创建和使用?

2.1 创建组件

下面以创建一个顶部导航组件为例来说明一下如何创建组件:
在这里插入图片描述
在这里插入图片描述
组件wxml代码:

<view style="height: {{customBar}}px;background-color:green;text-align: center;"></view>

组件js代码:

const app = getApp()
Component({
  /**
   * 组件的属性列表
   */
  properties: {

  },

  /**
   * 组件的初始数据
   */
  data: {
    screenHeight: app.globalData.screenHeight,
    statusBarHeight: app.globalData.statusBarHeight,
    customBar: app.globalData.CustomBar,
    tabBar: app.globalData.tabBarHeight,
    tabBarHeight: app.globalData.tabBarHeight
  },

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

  }
})

  • 组件的方法是定义在methods中的。
  • properties是组件属性,用于接收页面传参。

关于顶部导航位置信息的获取,请阅读我上一篇文章:自定义顶部、底部导航栏以及获取胶囊体位置信息。

customBar组件json文件:

这是关键就是将component属性设置为true,这是组件的标志。

{
  "component": true,
  "usingComponents": {}
}

2.2 使用组件

我们只需要在指定页面的.json文件中引入组件即可,下面在index中引入组件。

index.json代码:

{
  "usingComponents": {
    "customBar":"../components/customBar/customBar"
  }
}

index.wxml代码:

标签的名称和在.json文件中引入的保持一致。

<customBar></customBar>

效果:
在这里插入图片描述

3.组件的生命周期

执行顺序为created、attached、ready、moved 、detached。可以用于完成组件的初始化、更新和销毁等操作。而 error 阶段则是用于捕获和处理组件发生错误的情况。

3.1 created

组件实例被创建时触发,此时组件的属性和数据都已经初始化完成,但组件尚未渲染到页面中。

3.2 attached(常用)

组件实例被添加到页面中时触发,此时组件已经渲染到页面中,可以获取到页面的 DOM 节点,但还未进入生命周期函数。

3.3 ready

组件渲染完成时触发,此时组件已经进入生命周期函数,可以进行一些组件的初始化操作。

3.4 moved

组件实例被移动到新的节点时触发。

3.5 detached

组件实例被从页面中移除时触发,此时组件已经销毁,但可以重新被添加到页面中。

3.6 error

组件发生错误时触发,此时可以捕获并处理组件的错误信息。

4.组件常见用法

4.1 组件调用页面方法

在一些场景中会需要在触发组件中方法后,调用页面的方法。我们只需要在组件总定义一个triggerEvent方法,然后绑定到页面中的方法即可实现。比如:顶部导航常常在左上角会有返回按钮,当按钮点击时需要触发页面的方法返回上级页面。如下面代码所示:

组件wxml代码:

<view style="height: {{customBar}}px;width: {{screenWidth}}px;background-color:black;position: fixed;">
    <view class="opertaion" style="top: {{capsuleTop}}px;height: {{capsuleHeight}}px;width:100px;position: fixed;display: flex;">
      <view class="cuIcon-back" style="color: rgb(255, 255, 255);font-size: 18px;display: flex;align-items: center;flex: 1;" bindtap="backPage"> </view>
      <view style="display: flex;align-items: center;flex:3;color: white;" bindtap="backPage">返回</view>
    </view>
</view>

效果:

在这里插入图片描述

组件js代码:

const app = getApp()
Component({
  properties: {
  },
  data: {
    customBar: app.globalData.CustomBar,
    capsuleTop: app.globalData.capsuleTop,
    capsuleHeight: app.globalData.capsuleHeight,
    capsuleWidth: app.globalData.capsuleWidth,
    screenWidth: app.globalData.screenWidth,
    showTitle:true,
  },
  methods: {
    //返回上级页面 
    backPage(){
      //value是传递的参数
      this.triggerEvent('backEvent',{value:1})
    }
  }
})

引入页面wxml代码:

<customBar bind:backEvent="backPage"></customBar>

引入页面js代码:

// index.js
const app = getApp()
Page({
  data: {},
  backPage(value){
    console.log(value)
    wx.navigateBack({
      delta:value.detail.value
    })
  }
})

4.2 页面调用组件方法

页面调用组件中的方法也是在很多场景中出现的。一般常用的调用组件的方法是给组件一个id,然后通过id获取该组件元素,进而可以调用组件中的方法。下面是一个引入页面控制组件中页面标题显隐的例子:
页面wxml代码:

<!--给组件一个id customBar -->
<customBar id="customBar" bind:backEvent="backPage"></customBar>
<button style="position: relative; top: 500px;" bindtap="hideTitle">隐去标题</button>

页面js代码:
通过id获取组件元素

// index.js
const app = getApp()
Page({
  data: {
    screenHeight: app.globalData.screenHeight,
    statusBarHeight: app.globalData.statusBarHeight,
    customBar: app.globalData.CustomBar,
    tabBar: app.globalData.tabBarHeight,
    tabBarHeight: app.globalData.tabBarHeight
  },
  //隐藏组件中的标题
  hideTitle(){
    let customerBarComponent = this.selectComponent("#customBar")
    customerBarComponent.setShowTitle();
  }
})

组件js文件:
在组件中添加执行隐藏标题的方法

const app = getApp()
Component({
  properties: {},
  data: {
    customBar: app.globalData.CustomBar,
    capsuleTop: app.globalData.capsuleTop,
    capsuleHeight: app.globalData.capsuleHeight,
    capsuleWidth: app.globalData.capsuleWidth,
    screenWidth: app.globalData.screenWidth,
    showTitle:true,
  },
  methods: {
    //执行隐藏组件标题
    setShowTitle(value){
      this.setData({
        showTitle:false
      })
    }
  }
})

4.3 页面给组件传参

拿自定义顶部导航的例子来说,首页不需要返回按钮,而二级页面则需要,但是总不能定义两个组件一个用于首页一个用于二级页面吧,这样的话组件就是失去了高复用的优点,也就没什么意义了。想要组件能够接收页面传过来的参数,需要在组件的properties:{}中定义对应的参数。

下面是给组件传参控制返回按钮显隐的例子:

组件wxml代码:

<view style="height: {{customBar}}px;width: {{screenWidth}}px;background-color:black;position: fixed;">
    <view class="opertaion" style="top: {{capsuleTop}}px;height: {{capsuleHeight}}px;width: {{screenWidth-capsuleWidth}}px;position: fixed;display: flex;">
      <view class="cuIcon-back" wx:if="{{showBack}}" style="color: rgb(255, 255, 255);font-size: 18px;display: flex;align-items: center;flex: 1;" bindtap="backPage"> </view>
      <view wx:if="{{showBack}}" style="display: flex;align-items: center;flex:4;color: white;" bindtap="backPage">返回</view>
</view>

组件js代码:

这里的关键就是在properties中定义传参类型。

const app = getApp()
Component({
  properties: {
  	//定义参数
    showBack:{
      type:Boolean,
      value:true
    }
  },
  data: {
    customBar: app.globalData.CustomBar,
    capsuleTop: app.globalData.capsuleTop,
    capsuleHeight: app.globalData.capsuleHeight,
    capsuleWidth: app.globalData.capsuleWidth,
    screenWidth: app.globalData.screenWidth,
    showTitle:true,
  },
  methods: {
    //返回上级页面
    backPage(){
      this.triggerEvent('backEvent',{value:1})
    },
    setShowTitle(value){
      this.setData({
        showTitle:false
      })
    }
  }
})

我们还可以定义observer方法来实现对传参监听。如下所示:

//定义参数
    showBack:{
      type:Boolean,
      value:true,
      observer: function(newValue){
      	console.log("页面传值:",newValue)    
      }
    }

页面wxml代码:

使用组件中定义的showBack参数:

<customBar id="customBar" bind:backEvent="backPage" showBack="{{true}}"></customBar>
<button style="position: relative; top: 500px;" bindtap="hideTitle">隐去标题</button>

这里有一点需要注意,如果传递的参数类型是布尔类型需要使用{{}}进行包裹,否则无法正常的接收!

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

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

相关文章

多维数组的地址,通过指针引用多维数组详解

通过指针引用一维数组可以参考这篇文章&#xff1a; 通过指针引用数组的几种方法的原理和差异&#xff1b;以及利用指针引用数组元素的技巧_juechen333的博客-CSDN博客一个数组包含若干元素&#xff0c;每个数组元素都占用存储单元&#xff0c;所以他们都有相应的地址&#xf…

《Ansible模块篇:debug模块详解》

一、简介 平时我们在使用ansible执行playbook时&#xff0c;经常可能会遇到一些错误&#xff0c;有的时候不知道问题在哪里 &#xff0c;这个时候可以使用-vvv参数打印出来详细信息&#xff0c;不过很多时候-vvv参数里很多东西并不是我们想要的&#xff0c;这时候就可以使用官方…

python第四天作业~函数练习

目录 作业4、判断以下哪些不能作为标识符 A、a B、&#xffe5;a C、_12 D、$a12 E、false F、False 作业5&#xff1a; 输入数&#xff0c;判断这个数是否是质数&#xff08;要求使用函数 for循环&#xff09; 作业6&#xff1a;求50~150之间的质数是…

ReentrantLock 源码解读

一、ReentrantLock ReentrantLock 是 java JUC 中的一个可重入锁&#xff0c;在上篇文章讲解 AQS 源码的时候提到 ReentrantLock 锁是基于 AQS 实现的&#xff0c;那是如何使用的 AQS 呢&#xff0c;本篇文章一起带大家看下 ReentrantLock 的源码。 在 AQS 中&#xff0c;如果…

linux安装influxdb-rpmyum方式

一、influxdb的安装InfluxDB简介时序数据库InfluxDB版是一款专门处理高写入和查询负载的时序数据库&#xff0c;用于存储大规模的时序数据并进行实时分析&#xff0c;包括来自DevOps监控、应用指标和IoT传感器上的数据主要特点&#xff1a;专为时间序列数据量身订造高性能数据存…

uniapp——ucharts的使用

ucharts是一个类似于echarts的图表框架 引入 在Hbuilder的插件下载仓库中搜索ucharts &#xff01;&#xff01;值得一提的是&#xff0c;Hbuilder的版本必须是大于3.1.0的&#xff01;&#xff01; 这样就导入到了项目的uni_modules里了 ucharts下载完成后&#xff0c;可以…

Java——异常机制

前言 随着对java的不断深入学习&#xff0c;在对语法以及编程思想有了一定的了解之后&#xff0c;在编程的过程中有可能会因为用户的输入不正确或者逻辑错误而出现异常或者错误&#xff0c;因此如何去捕捉与避免不应该出现的异常或者错误就变得十分重要。本文就介绍了java的异…

C++实现的二叉树创建和遍历,超入门邻家小女也懂了

目录 二叉树 特点 性质 二叉树的创建 声明 创建 -> 成员运算符 批量创建 二叉树的遍历 先序遍历 中序遍历 后序遍历 层序遍历 树的相关术语 特殊二叉树 满二叉树 完全二叉树 二叉树 树&#xff08;Tree&#xff09;是n(n≥0)个节点的有限集。在任意一棵…

Idea工具单工程使用卡顿设置

一、开启Idea内存占比指示 1.1、勾选Idea 内存指示器 1.2、右下角展示当前项目&#xff1a;内存/总内存&#xff08;726/1024MB&#xff09; ​​​​​​​ 二、修改Idea自定义内存 2.1、打开help - Edit Custom VM Options 2.2、自定义虚拟内存设置 -Xms1024m // 初始内存分…

【前端八股文】浏览器系列:浏览器渲染、前端路由、前端缓存(HTTP缓存)、缓存存储(HTTP缓存存储、本地存储)

文章目录渲染步骤DOM树与render树回流与重绘前端路由hash模式history模式两种模式对比前端缓存HTTP缓存强缓存协商缓存一般哪些文件对应哪些缓存HTTP缓存总结缓存存储HTTP缓存存储本地存储参考本系列目录&#xff1a;【前端八股文】目录总结 是以《代码随想录》八股文为主的笔记…

TTS | 语音合成论文概述

综述系列2021_A Survey on Neural Speech Synthesis论文&#xff1a;2106.15561.pdf (arxiv.org)论文从两个方面对神经语音合成领域的发展现状进行了梳理总结&#xff08;逻辑框架如图1所示&#xff09;&#xff1a;核心模块&#xff1a;分别从文本分析&#xff08;textanalysi…

【Linux内核一】在Linux系统下网口数据收发包的具体流向是什么?

在TCP/IP网络分层模型里&#xff0c;整个协议栈被分成了物理层、链路层、网络层&#xff0c;传输层和应用层。物理层对应的是网卡和网线&#xff0c;应用层对应的是我们常见的Nginx&#xff0c;FTP等等各种应用。Linux实现的是链路层、网络层和传输层这三层。 在Linux内核实现中…

Linux(Centos)安装Minio集群

目录1&#xff1a;简介2&#xff1a;功能与集成3&#xff1a;架构4&#xff1a;搭建集群4.1&#xff1a;挂载磁盘4.1.1&#xff1a;要求4.1.2&#xff1a;创建挂载目录4.1.3&#xff1a;注意&#xff1a;需要将新建的目录挂在到对应的磁盘下,磁盘不挂载好&#xff0c;集群启动会…

Tomcat 并发达太大导致系统崩溃解决方案

当 Tomcat 并发达太大导致系统崩溃时&#xff0c;可以通过以下几个步骤来解决这个问题&#xff1a; 1、分析原因 首先需要分析系统崩溃的原因&#xff0c;是因为Tomcat的性能瓶颈还是因为代码的Bug&#xff0c;或者是系统资源不足等等。 2、优化代码 如果是代码的问题&…

Unity Lighting -- 为场景烘焙lightmap

烘焙光照是什么&#xff1f; Unity中有两种不同的光照方式&#xff1a;实时光照和烘焙光照。 实时光照 Unity会在运行时实时计算光照。实时光源每一帧都会进行计算&#xff0c;这意味着它们对于场景中移动的角色和物体的响应性非常好&#xff0c;但它的开销也很大。 烘焙光照…

DJ1-3 操作系统引论

目录 操作系统的结构设计 1. 无结构操作系统 2. 模块化 OS 结构 3. 分层式 OS 结构 4. 微内核 OS 结构 操作系统的结构设计 操作系统是一个大型系统软件&#xff0c;其结构已经历了四代的变革&#xff1a; 第一代 OS 是无结构第二代 OS 采用模块式结构第三代是层次式结构…

韩国绿芯1~16通道触摸芯片型号推荐

随着技术的发展&#xff0c;触摸感应技术正日益受到更多关注和应用&#xff0c;目前实现触摸感应的方式主要有两种&#xff0c;一种是电阻式&#xff0c;另一种是电容式。电容式触摸具有感应灵敏、功耗低、寿命长等特点&#xff0c;因此逐步取代电阻式触摸&#xff0c;成为当前…

炫龙游戏本Win10系统总是蓝屏崩溃怎么办?

炫龙游戏本Win10系统总是蓝屏崩溃怎么办&#xff1f;有用户使用的炫龙游戏本最近总是在运行的过程中出现自动蓝屏的情况&#xff0c;有的时候自己还在操作电脑&#xff0c;而屏幕却蓝屏了&#xff0c;导致自己的工作被中断了。那么这个情况要怎么去进行修复呢&#xff1f;来看看…

关于centos虚拟机设置固定ip、设置后无法上网、宿主机无法ping通的解决方案

一.centos设置固定ip 1.虚拟机设置 编辑→虚拟网络编辑器&#xff0c;选择NAT模式。 2.NAT设置&#xff0c;设置网关&#xff08;前面三个需要与你设置的静态虚拟机ip一致&#xff08;我的是192.168.2.40&#xff09;&#xff09;。 3.虚拟机设置为NAT模式 4.设置虚拟…

数据结构2——线性表1:基本概念

1、线性表的概念 线性表是具有相同特性的数据元素的一个有限序列。就像用细线串珠子&#xff0c;一个接着一个串起来。 2、线性表的逻辑特征 ① 在非空的线性表中有且只有一个开始结点a1&#xff0c;他没有直接前驱&#xff0c;而仅有一个直接后继a2&#xff0c;相当于a1是…