微信小程序-自定义组件

文章目录

  • 微信小程序-自定义组件
    • 概述
    • 创建和使用
    • 数据、方法和属性
    • slot 插槽
      • 默认插槽
      • 具名插槽
    • 组件样式
      • 注意项
      • 样式隔离
    • 数据监听
    • 组件间通信
      • 父传子
      • 子传父
      • 获取子组件实例
    • 生命周期
      • 组件的生命周期
      • 组件所在页面的生命周期
      • App、Page与Component生命周期对比
      • 冷启动
      • 保留当前页面和关闭当前页面跳转
      • 切换后台和切换前台
    • Component构建页面
      • 注意事项
      • 使用
    • behaviors
    • 修改组件默认样式
      • 样式覆盖
      • 外部样式类

微信小程序-自定义组件

概述

小程序目前已经支持组件化开发,可以将页面中的功能模块抽取成自定义组件,以便在不同的页面中重复使用;也可以将复杂的页面拆分成多个低耦合的模块,有助于代码维护。

创建和使用

创建流程:

一、在根目录下新建 components 文件夹。

二、在 components 文件夹内,新建组件的文件夹,再新文件内新建组件,文件夹名与组件名保持一致。

三、组件可分2种:

  • 公共组件:
    • 将功能模块抽象成自定义组件,方便在不同页面中重复使用。
    • 建议放在根目录下的 components 文件夹中。
  • 页面组件:
    • 将复杂的页面拆分成多个低耦合的模块,方便代码维护。
    • 建议放在对应的页面目录下的 components 文件夹中。

四、IDE 会自动在 json 文件中配置 component 选项:

{"component": true
}

五、IDE 会自动在 js 文件中定义 Component() 函数:

Component({/*** 组件的属性列表*/properties: {},/*** 组件的初始数据*/data: {},/*** 组件的方法列表*/methods: {}
})

使用流程;

  • 全局注册:在 app.json 文件中配置 usingComponents 选项,可以全局调用。

    {"usingComponents": {"my-custom-checkbox": "./components/my-custom-checkbox/my-custom-checkbox"} 
    }
    
  • 局部注册:在页面的 json 文件中配置 usingComponents 选项,只能在当前页面中使用。

    {"usingComponents": {"my-custom-checkbox": "../../components/my-custom-checkbox/my-custom-checkbox"}
    }
    

数据、方法和属性

Component 包含3个属性:

  • data:组件内部的数据。
  • methods:组件中的事件处理。
  • properties:组件的对外属性
    • 用于接收外部传递的数据。
    • 支持类型:String / Number / Boolean / Object / Array / null(不限制类型)

定义组件的WXML:

<view class="custom-checkbox-container"><view class="custom-check-box {{position ==='right'?'right':'left'}}"><checkbox class="custom-checkbox" checked="{{isChecked}}" bindtap="updateChecked" /><view><text>{{label}}</text></view></view>
</view>

定义组件的JS:

Component({properties: {// 标题// 可简写为 label: Stringlabel: {type: String,value: "",},// 文字显示位置position: {type: String,value: "right",},},data: {isChecked: false,},methods: {updateChecked() {this.setData({isChecked: !this.data.isChecked,})console.log(this.data.isChecked)},},
})

使用:

<my-custom-checkbox label="我已阅读并同意 用户协议 和 隐私协议" position="right" />
<my-custom-checkbox label="匿名提交" position="left" />

效果图:

在这里插入图片描述

slot 插槽

默认插槽

在使用基础组件时,可以给组件传递子节点传递内容,从而将内容展示到页面中,自定义组件也可以接收子节点内容。

只不过在组件模板中需要定义 <slot /> 节点,用于承载组件引用时提供的子节点。

定义默认插槽组件:

<view><text>hello</text><slot /><text>world</text>
</view>

使用默认插槽:

<my-custom01>这是一个默认插槽</my-custom01>

效果如下:

在这里插入图片描述

具名插槽

默认情况下,一个组件的 wxml 中只能有一个 slot 。需要使用多 slot 时,可以在组件 js 中声明启用。

同时需要给 slot 添加 name 来区分不同的 slot,给子节点内容添加 slot 属性来将节点插入到 对应的 slot 中。

开启多插槽支持:

Component({options: {// 开启多slot支持multipleSlots: true,}
})

定义具名插槽:

<view><slot name="slot-top" /><text>hello slot</text><slot /><slot name="slot-bottom" />
</view>

使用具名插槽:

<my-custom02><text slot="slot-top">自定义头部</text>这是一个具名插槽<text slot="slot-bottom">自定义尾部</text>
</my-custom02>

效果如下:

在这里插入图片描述

组件样式

类似于页面,自定义组件拥有自己的 wxss 样式,组件对应 wxss 文件的样式,只对组件wxml内的节点生效。

注意项

  • 不推荐使用标签名选择器,会影响页面和全部组件。
  • 不能使用 id 选择器、属性选择器。
  • 避免使用后代选择器、子元素选择器,可能出现非预期效果。
  • 建议使用 class 选择器。
  • 继承样式,如 font、color,会从组件外继承到组件内。
  • 全局样式、页面样式对自定义组件无效。

样式隔离

默认情况下,自定义组件的样式只受到自定义组件的 wxss 影响。

以下2种情况则受影响:

  1. 全局样式、页面样式使用标签选择器,这种情况下不推荐使用。

  2. 指定样式隔离选项:

    Component({options: {styleIsolation: 'isolated'}
    })
    

    styleIsolation 选项支持以下取值:

    • isolated :默认值,开启样式隔离,在自定义组件内外,使用 class 指定的样式将不会相互影响。
    • apply-shared :表示页面 wxss 样式将影响到自定义组件,但自定义组件 wxss 中指定的样式不会影响页面。
    • shared :表示页面 wxss 样式将影响到自定义组件,自定义组件 wxss 中指定的样式也会影响页面和其他设置了 apply-sharedshared 的自定义组件。

说明:

定义组件和组件样式:

<text class="label">这是一个组件样式</text>
.label {color: green;font-size: 30rpx;
}

定义页面和页面样式:

<my-custom03 />
<text class="label">这是一个页面样式</text>
.label{color:red;font-size: 50rpx;
}

当设置 styleIsolation: 'isolated' ,会开启组件隔离,效果如下:

在这里插入图片描述

当设置 styleIsolation: 'shared' ,会开启样式共享,效果如下:

在这里插入图片描述

数据监听

可以通过 observers 选项监听数据和属性的变化。

<view>num:{{num}}</view>
<view>count:{{count}}</view>
<view>arr:<text wx:for="{{arr}}" wx:key="index">{{item}}</text>
</view>
<view>user:{{user.name}}-{{user.age}}</view>
<button bindtap="updateData">修改数据</button>
Component({data: {num: 1,count: 10,arr: [1, 2, 3],user: { name: "小明", age: 18 },},observers: {// 监听数据num: function (newNumber) {console.log("监听num " + newNumber)},// 监听多个数据"num,count": function (newNum, newCount) {console.log(`监听多个数据 ${newNum}  ${newCount}`)},// 监听数组"arr[0]": function (newVal) {console.log(`监听数组 ${newVal}`)},// 监听对象"user.age": function (newAge) {console.log(`监听对象属性 ${newAge}`)},// 监听所有属性变化,使用通配符"user.**": function (obj) {console.log(`监听所有属性变化 ${obj.name} ${obj.age}`)},},methods: {// 修改数据updateData() {this.setData({num: this.data.num + 1,count: this.data.count + 1,"arr[0]": this.data.arr[0] + 1,"user.age": this.data.user.age + 1,"user.name": this.data.user.name + this.data.num,})},},
})

组件间通信

父传子

  • 在父组件 wxml 中使用数据绑定的方式向子组件传递数据。
  • 在子组件中使用 properties 接收父组件的数据。

定义子组件:

Component({properties: {propName: {type: String,value: "",},propAge: {type: Number,value: 0,},},data: {user: { name: "未命名", age: 0 },},observers: {propName: function (newName) {this.setData({"user.name": newName,})},propAge: function (newAge) {this.setData({"user.age": newAge,})},},
})
<text>{{user.name}} - {{user.age}}</text>

在父组件中使用:

<my-son prop-name="小白" prop-age="18" />

子传父

  • 子组件通过 triggerEvent 发送事件。
  • 通过 bind 方法监听事件。

定义子组件:

<text>{{user.name}} - {{user.age}}</text>
<button bindtap="sendData">子组件发送数据</button>
Component({methods: {sendData() {// 第一个参数:事件名// 第二个参数:传递的数据this.triggerEvent("myevent", "hello world " + Date.now())},},
})

定义父组件:

// 绑定事件方法
<my-son bind:myevent="getData" prop-name="小白" prop-age="18" />
<view>父组件接收数据:{{msg}}</view>
Page({data: { msg: "123" },getData(event) {this.setData({// 通过detail获取数据msg: event.detail,})},
})

获取子组件实例

在父组件中可以通过 selectComponent() 获取子组件的实例。

<my-son id="child" bind:myevent="getData" prop-name="小白" prop-age="18" />
<button bindtap="getChild">获取子组件实例</button>
Page({getChild() {const child = this.selectComponent("#child")console.log(child.data.user) // {name: "小白", age: 18}},
})

生命周期

组件的生命周期

组件的生命周期,指的是组件自身的一些函数,这些函数在特殊的时间点或遇到一些特殊的框架事件时被自动触发。

其中,最重要的生命周期是 created attached detached ,包含一个组件实例生命流程的最主要时间点。

组件生命周期:

  • created:组件被创建时执行,此时不能调用 setData()。
  • attached:组件实例进入页面节点树时执行。
  • ready:组件布局完成后执行。
  • moved:组件被移到到另一个位置时执行。
  • detached:组件被移除时执行。

在这里插入图片描述

Component({lifetimes: {created() {console.log("Component created")},attached() {console.log("Component attached")},ready() {console.log("Component ready")},moved() {console.log("Component moved")},detached() {console.log("Component detached")},},
})

组件所在页面的生命周期

主要用于组件内部监听父组件的展示、隐藏状态,从而方便组件内部执行一些业务逻辑的处理。

组件所在页面的生命周期有 4 个: show、 hide、 resize、 routeDone,需要在 pageLifetimes 字段内进行声明。

组件所在页面的生命周期:

  • show:页面处于显示状态时执行。如后台切换。
  • hide:页面处于隐藏状态时执行。如前台切换。

在这里插入图片描述

Component({pageLifetimes: {show() {console.log("Page show()")},hide() {console.log("Page hide()")},},
})

App、Page与Component生命周期对比

冷启动

在这里插入图片描述

保留当前页面和关闭当前页面跳转

在这里插入图片描述

切换后台和切换前台

在这里插入图片描述

Component构建页面

Component 可以用于构建页面,适合更复杂的页面逻辑开发。

注意事项

  • json 文件必须包含 usingComponent 选项。
  • Page 中的一些生命周期方法,必须放在 Component 的 methods 中。
  • 组件的属性 Properties 可以用于接收页面的参数,在 onLoad() 中可以通过 this.data 拿到对应的页面参数
Component({properties: {name: String,age: Number,},data: {name: "",age: 0,},methods: {onLoad(options) {console.log(this.data.name)console.log(this.data.age)console.log(this.properties.name)console.log(this.properties.age)},updateData() {this.setData({age: this.data.age + 1,})},},
})

使用

Component({properties: {name: String,age: Number,},data: {name: "",age: 0,},methods: {onLoad(options) {console.log(this.data);console.log(this.data.name)console.log(this.data.age)console.log(this.properties.name)console.log(this.properties.age)},updateData() {this.setData({age: this.data.age + 1,})},},
})
<navigator url="/pages/detail/detail?name=小花&age=20">跳转detail页面</navigator>

behaviors

behaviors 方法是一种代码复用的方式,可以将一些通用的逻辑和方法提取出来,然后在多个组件中复用,从而减少代码冗余,提高代码的可维护性。

创建behaviors并导出:

const behavior = Behavior({properties: {label: {type: String,value: "hell world",},},data: {name: "张三",age: 28,},methods: {updateName() {this.setData({name: "李四",})},},
})export default behavior

引入并使用:

import behavior from "../../utils/behaviors.js"Component({behaviors: [behavior]
})

修改组件默认样式

样式覆盖

方法:查找官方文档,找到案例,使用审查元素查看对应的类名。

在这里插入图片描述

可以看到3个信息:

  • .wx-checkbox-input:复选框默认样式。
  • .wx-checkbox-input-checked:复选框选中样式。
  • .wx-checkbox-input.wx-checkbox-input-checked:before:复选框前面✔的样式。

需要先开启 styleIsolation: "shared" 选项。

.wx-checkbox-input {border-radius: 50% !important;border: 1px solid blue !important;
}
.wx-checkbox-input-checked {border: 1px solid red !important;
}
.wx-checkbox-input.wx-checkbox-input-checked:before {color: red !important;
}

外部样式类

默认情况下,组件和组件使用者之间如果存在相同的类名不会相互影响。

开发者如果想修改组件的样式,需要就解除样式隔离,在极端情况下,会产生样式冲突。

使用外部样式类步骤:

  1. 开启 externalClasses 选项,可以定义多个外部样式类。
  2. 在自定义组件中使用 class 属性绑定一个样式类,属性值是传递的类名。
  3. 在父组件中使用样式类。

定义组件:

Component({// 定义外部样式类externalClasses: ["extend-class"],
})
// 属性绑定
<view class="extend-class">hello world 外部样式
</view>

使用外部样式:

// 使用样式
<my-external-classes extend-class="my-box" />
.my-box {border: 2rpx solid red !important;
}

效果如下:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hadoop集群基础搭建

目录 一.虚拟机安装 1.配置虚拟机的ip 2.配置本机的ip 3.新建虚拟机 4.克隆三台虚拟机 二.虚拟机网络配置 1.修改ip配置 2.配置主机名和主机映射 3.配置SSH免密登陆 三.安装JDK 1.tar命令解压JDK安装包 2.配置JDK的环境变量 四.安装Hadoop 1.tar命令解压Hadoop安…

AnaTraf | 深入探秘:如何利用网络报文分析仪进行高效抓包分析

目录 什么是网络报文分析仪&#xff1f; 抓包分析的核心作用 1. 故障排除 2. 性能优化 3. 安全监测 抓包分析的常见场景与技巧 1. 分析网络延迟问题 2. 排查TCP三次握手问题 3. 分析丢包问题 总结 AnaTraf 网络性能监控系统NPM | 全流量回溯分析 | 网络故障排除工具A…

智能驾驶必备:MEB低速紧急制动功能如何保护你的车辆?

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

springboot家庭膳食生活助手小程序-计算机毕业设计源码85829

摘 要 家庭膳食生活助手系统是一个基于小程序平台的项目&#xff0c;采用springboot框架进行开发。该系统旨在帮助用户更加便捷地规划和管理家庭膳食&#xff0c;促进健康饮食和生活方式。本系统通过用户自定义的家庭成员信息和饮食偏好&#xff0c;智能生成个性化的膳食计划…

【C++】类和对象(类的默认成员函数)

目录 一.构造函数 二.析构函数 三.拷贝构造函数 四.赋值运算符重载 五.取地址运算符重载 默认成员函数就是用户没有显式实现&#xff0c;编译器会自动生成的成员函数称为默认成员函数。一个类&#xff0c;我们不写的情况下编译器会默认生成以下6个默认成员函数。 一.构造…

【C语言】函数的声明与定义

函数的声明 用户自定义函数需要在main函数之前进行声明&#xff0c;用分号结尾。 函数的定义 用户自定义函数在main函数之后进行定义&#xff0c;需要写出具体形参的变量名。注意函数的返回值和返回值类型要一一对应。 函数的调用 调用时&#xff0c;直接使用函数名进行调用&am…

【v5.3.0】修复订单批量发货提示 isPicUpload is not defined

使用订单批量发货的时候&#xff0c;没有反应&#xff0c;控制台提示 ReferenceError: isPicUpload is not defined 修改文件src/pages/order/orderList/components/tableList.vue 把isPicUpload改成isFileUpload&#xff0c;然后重新打包admin后台上传即可

推荐系统框架

推荐系统框架 理论---->应用 fellow前沿的理论&#xff0c;应用到推荐系统 SoTA&#xff08;state of the art&#xff09;&#xff1a;意思是“最先进的”或“当前技术的最高水平”。通常用于描述某个领域中最新、最优或最具前沿性的技术、方法或成果。在研究和开发中&am…

【C语言】sizeof和strlen的区别

本篇博客将讲解以下知识&#xff1a; 1、sizeof和strlen的区别 1、sizeof和strlen的区别 &#xff08;1&#xff09;sizeof sizeof是单目操作符&#xff0c;不是函数&#xff0c;计算变量所占内存空间大小。单位是字节。如果操作数是类型的话&#xff0c;计算的是使用这种类型…

Bilidown v1.2.4 B站在线视频下载解析工具中文单文件版

Bilidown是一款专为B站视频下载而设计的工具&#xff0c;一款简洁好用的B站视频下载工具&#xff0c;支持由UP主上传的单集&#xff0c;多集以及相关封面&#xff0c;弹幕&#xff0c;字幕&#xff0c;音乐&#xff0c;刮削等等&#xff0c;支持任意粒度批量组合&#xff0c;登…

CSS3 提示框带边角popover

CSS3 提示框带边角popover。因为需要绝对定位子元素&#xff08;这里就是伪元素&#xff09;&#xff0c;所以需要将其设置为相对对位 <!DOCTYPE html> <html> <head> <title>test1.html</title> <meta name"keywords" con…

论文复现以及运行问题(论文:NUNO:一种非均匀数据下参数偏微分方程学习的通用框架)

前言 本人现在做的流固耦合案例里面包括流体和固体的数据&#xff0c;但是都是不均匀大小的网格数据&#xff08;点云的数据&#xff09;&#xff0c;不是均匀的网格数据&#xff0c;由于前期确定了使用模型wno小波神经算子&#xff0c;但是该模型输入为均匀的网格&#xff0c…

记录Centos7 漫漫配置路

记录Centos7 漫漫配置路 一、 配置源二、 clinfo三、 PCL 配置1. 依赖2. eigen3. boost4. flann5. pcl 四、YAML-CPP五、 miniconda 安装 python3.6 和 pytorch六、libbot 配置1. 容易安装的依赖2. 需要源码安装的依赖3. [libbot](https://github.com/libbot2/libbot2) 简单地说…

引领智慧文旅新纪元,开启未来旅游新境界

融合创新科技&#xff0c;重塑旅游体验&#xff0c;智慧文旅项目定义旅游新未来 在全球化的浪潮中&#xff0c;旅游已成为连接世界的重要纽带。智慧文旅项目&#xff0c;不仅仅是一次技术的革新&#xff0c;更是对旅游行业未来发展的一次深刻思考。信鸥科技通过运用云计算、大数…

多功能点击器(文末附Gitee源码)——光遇自动弹奏

之前提到的多功能点击器&#xff0c;使用场景比较多&#xff0c;之前玩光遇喜欢在里面弹琴&#xff0c;想到用这个点击器也能自动弹琴&#xff0c;跟别的自动弹琴脚本不一样&#xff0c;这个比较简单容易操作。 借这个光遇自动弹琴使用教程再讲解一下这个多功能点击头的使用方法…

Linux编辑器-vim的配置及其使用

vim是一种多模式的编辑器&#xff1a; 1.命令模式&#xff08;默认模式&#xff09;&#xff1a;用户所有的输入都会当作命令&#xff0c;不会当作文本输入。 2.插入模式&#xff1a;写代码&#xff0c; 按「 i 」切换进入插入模式「 insert mode 」&#xff0c;按 “i” 进入…

【安当产品应用案例100集】023-企业内部对Oracle数据库动态凭据的管理

凭据&#xff08;Credential&#xff09;&#xff0c;用于验证个人或系统身份的信息。在信息技术领域&#xff0c;凭据通常指的是用来证明用户身份的数据&#xff0c;以便系统能够确认用户是否具有访问资源或执行某些操作的权限。凭据的种类很多&#xff0c;比如用户名和密码、…

《安全历史第5讲——秦始皇统一度量衡与代码标准化》

秦始皇统一了六国后&#xff0c;中国由此进入了一个崭新的历史时期。而帝国初期的一项重要决策——统一度量衡&#xff0c;让中国领先了千年&#xff0c;至今都因此受益。度量衡的统一极大地促进了社会经济交流&#xff0c;提高了行政效率&#xff0c;并为科学技术的发展奠定了…

SUGAR:用于皮层表面配准的球形超快图注意力框架|文献速递-基于深度学习的医学影像分类,分割与多模态应用

Title 题目 SUGAR: Spherical ultrafast graph attention framework for cortical surface registration SUGAR&#xff1a;用于皮层表面配准的球形超快图注意力框架 01 文献速递介绍 基于表面的分析在解剖和功能神经影像学研究中变得越来越受欢迎&#xff08;Coalson 等,…

【专题】智启未来:新质生产力引擎驱动下的智能制造行业革新报告合集PDF分享(附原数据表)

原文链接&#xff1a; https://tecdat.cn/?p37856 在当今全球经济格局深刻变革的大背景下&#xff0c;制造业作为国家经济的基石&#xff0c;正处在高质量发展的关键历史时期。智能决策作为一股崭新的力量&#xff0c;正逐步成为推动制造业数智化转型的强大新动能。众多制造企…