微信小程序自定义组件的基本使用
微信小程序自定义组件的基本使用
组件与模块类似,实现了功能的复用,提高开发速率,减少代码量
在开发过程中 , 总会遇到一些功能板块是相同或很类似的 。如两个不同页面都有搜索框 , 或者 导航栏等 。
那么这个使用就很有必要使用组件了
组件文件创建
一般在根目录下创建一个 components 文件夹,用于保存各组件
组件模板
<!-- 组件内 -->
<view><view>组件内部</view>
<view>
组件使用
定义组件
在使用组件前 ,需要在使用组件的页面的 json 文件中进行定义。
// index.json"usingComponents": {"myCom":"../../components/com-1/com-1"// 组件名 路径(一般相对路径)}
也可以在 app.json 文件中进行去全局定义。 那么就无需在页面的 json文件配置了
配置的方法相同
在页面使用
<!-- 使用组件的页面 --><view><myCom></myCom>
</view><!-- 组件的内容会在页面显示 -->
插槽
插槽相当于是组件留出的一个位置 ,可以让页面向其提供其他页面结果。
插槽使用 slot 标签放在组件内 , 页面在使用组件时 ,在组件标签内传递标签等代码
<!-- 组件页面 -->
<view><view>我是组件内的标签</view><slot></slot> <!-- 插槽 -->
</view>
将代码写入插槽
<!-- 使用组件的页面 -->
<view><myCom><view>我是页面传入的内容</view> </myCom>
</view>
这里相当于把 <view>我是页面插入的内容<view>
这段代码代替了组件的 slot 标签部分 。然后再在使用的组件那显示出来
注意
与 vue 不同 ,默认情况下 , 一个组件只能使用一个 slot.
如果要使用多个 slot , 需要在 组件的 js 文件中 , 增加以下代码(与 data 同级)
options: {multipleSlots: true // 在组件定义时的选项中启用多slot支持},
具名插槽
当使用多个插槽时 , 开启方法如上 。 为了让代码插入正确的插槽 。 可以使用 具名插槽
即 插槽增加一个 name 属性 。 父组件 通过 slot 属性 。 进行配对 。
否则 。所有代码可能只会传到第一个 slot 中 。
<slot name="s1"></slot> <!-- 插槽 --><slot name="s2"></slot> <!-- 插槽 -->
<myCom><view slot ="s2">我是页面传入的内容1</view><view slot = 's1'>我是页面传入的内容2</view></myCom>
结果是 内容2 在内容 1 上面。
组价样式
组件的样式有些需要特别注意的地方
#a { } /* 在组件中不能使用 */
[a] { } /* 在组件中不能使用 */
button { } /* 在组件中不能使用 */
.a > .b { } /* 除非 .a 是 view 组件节点,否则不一定会生效 */
组件样式受到影响
默认情况下,自定义组件的样式只受到自定义组件 wxss 的影响
也有特殊情况页面样式会影响到子组件
- 样式继承 ,如 font .color
- app.wxss
styleIsolation
配置组件的样式情况的一个配置
{"stylelsolation":"值"
}
对于值 ,有以下这些情况
值 | 作用 |
---|---|
isolated | 表示启用样式隔离,在自定义组件内外,使用 class 指定的样式将不会相互影响(一般情况下的默认值) |
apply-shared | 表示页面 wxss 样式将影响到自定义组件,但自定义组件 wxss 中指定的样式不会影响页面 |
shared |
表示页面 wxss 样式将影响到自定义组件,自定义组件 wxss 中指定的样式也会影响页面和其他设置了apply-shared 或 shared 的自定义组件。
|
此外,小程序基础库版本 2.2.3 以上支持 addGlobalClass
选项,即在 Component
的 options
中设置 addGlobalClass: true
。 这个选项等价于设置 styleIsolation: apply-shared
,但设置了 styleIsolation
选项后这个选项会失效。
外部样式类
有时,组件希望接受外部传入的样式类。此时可以在 Component
中用 externalClasses
定义段定义若干个外部样式类。
// 组件 js 文件
Component({externalClasses: ['out-class']
})// 组件
<view class = "out-class">这里的类名由外部决定,样式也由外部决定</view>
<!-- 页面使用组件 -->
<myCom out-class = "class1"></myCom>
<myCom out-class = "class2"></myCom>
<!-- 2.7.1 版本以上-->
<myCom out-class = "class3 class4"></myCom>
样式引用
即使开启了样式隔离 。 也组件也可以引用父组件或页面上的样式
<view class="~page-class"> 引用页面的类名为 page-class 的样式 </view><view class="^father-com"> 引用父节点类名为 father-com 的样式 </view>
也可以连续使用多个 ^
来引用祖先组件中的样式
父向子传数据
传递
页面向子组件传递参数的方式是 通过属性传递 。
<myCom name="名字" age="{{age}}"></myCom> <!--age 是变量 , 值是 123-->
接收
子组件接收页面传递的参数是通过 js 文件中 的 properties 对象接收 , 接收到的数据相可以直接使用 。
// 组件的 js 代码是在 conponent 函数内的Component({properties: {name:{type:String,value:"小红"},age:{type:Number,value:321}},
})
properties 参数对象里面的参数也是以对象的形式进行定义
其中 name 接收父组件传递的 name 参数 , type 限制参数数据类型 , value 设置默认值。
<!--在组件内使用 -->
<view>{{name}} 和 {{age}}</view><!-- 显示 -->
<!-- 名字 和 123 -->
子向父传递参数
子向父传递数据通过事件 。 子组件可以在满足一下函数或事件时 , 触父页面定义的事件 ,同时可以向事件传递参数 。
1. 页面设置接收事件
bind+自定义事件名 = "事件处理函数名"
<myCom bindmyEvent = "getData"><myCom><!-- 或者 --><myCom bind:myEvent = "getData"><myCom>
2. 组件触发自定义事件
自定义组件触发事件时,需要使用 triggerEvent
方法,指定事件名、detail对象和事件选项
<button bindtap="onTap">点击这个按钮将触发“myEvent”事件</button>
// 当 tap 时 ,就可以触发自定义事件 ,并且想向父页面出传递参数
Component({methods:{ // 组件定义方法的对象 , 组件所有方自定义方法都放在这里onTap(){var data = {...} // 需要给父组件传递的 detail 参数var eventOption = {...} // 事件选项this.triggerEvent('myEvent' , data , eventOption) // 自定义事件名 ,detail 参数 , 事件选项}}
})
事件选项包括
选项名 | 类型 | 是否必填 | 默认值 | 描述 |
---|---|---|---|---|
bubbles | Boolean | 否 | false | 事件是否冒泡 |
composed | Boolean | 否 | false | 事件是否可以穿越组件边界,为false时,事件将只能在引用组件的节点树上触发,不进入其他任何组件内部 |
capturePhase | Boolean | 否 | false | 事件是否拥有捕获阶段 |
3. 页面接收参数
Page({getData(e){e.detail // 自定义组件触发事件时提供的detail对象}
})
组件生命周期
组件有3个比较重要的声明周期 :
- 组件实例刚刚被创建好时,
created
生命周期被触发。此时,组件数据this.data
就是在Component
构造器中定义的数据data
。 此时还不能调用setData
。 通常情况下,这个生命周期只应该用于给组件this
添加一些自定义属性字段。 - 在组件完全初始化完毕、进入页面节点树后,
attached
生命周期被触发。此时,this.data
已被初始化为组件的当前值。这个生命周期很有用,绝大多数初始化工作可以在这个时机进行。 - 在组件离开页面节点树后,
detached
生命周期被触发。退出一个页面时,如果组件还在页面节点树中,则detached
会被触发。
定义生命周期方法
Component({lifetimes: {attached() {// 在组件实例进入页面节点树时执行},detached() {// 在组件实例被从页面节点树移除时执行},},// 以下是旧式的定义方式,可以保持对 <2.2.3 版本基础库的兼容attached() {// 在组件实例进入页面节点树时执行},detached() {// 在组件实例被从页面节点树移除时执行},// ...
})
3个与页面关联的生命周期
- show : 当组件所在页面被显示时
- hide : 组件所在的页面被隐藏时执行
- resize : 组件所在的页面尺寸变化时执行
这些声明周期也定义在 pageLifetimes
微信小程序自定义组件的基本使用相关推荐
- 微信小程序自定义组件方案
前言:小程序已于11月初开放了小程序组件功能,但事件方面还不是很完善,有的组件暂时可能还是要用其他方式来实现,这里简单记录下开发小程序自定义组件的要点. 在小程序官方开发组件开发功能之前,自定义组件的 ...
- 微信小程序自定义组件,提示组件
微信小程序自定义组件,这里列举了一个常用的提示自定义组件,调用自定义组件中的方法和字段.仅供参考和学习. 编写组件: 在根目录下添加"components"目录,然后像添加Page ...
- 微信小程序自定义组件(二)
微信小程序自定义组件 ps 由于作业部落貌似出了点问题,耽误了点时间,找了一个stackedit.io准备写.无奈,这是要自己建编辑器的节奏啊.没有一个能靠的注 为何存在组件 组件间的关系 使用rel ...
- 微信小程序--自定义组件(超详细 从新建到使用)
微信小程序–自定义组件 微信小程序官网介绍! 本文提供给急需使用自定义组件人群,以下是博主个人理解和案例!可以辅助官网来看 介绍: 从小程序基础库版本 1.6.3 开始,小程序支持简洁的组件化编程.所 ...
- 微信小程序自定义组件子传父详解(多图)
微信小程序自定义组件子传父详解 前言: 刚开始为了测试父传子,所以把页面的数组放在了父组件中 1. 然而子组件中绑定的自定义点击事件依然放在子组件的js文件中 2. 所以就会出现我们点击页面的文字能改 ...
- 基于canvas 2D实现微信小程序自定义组件-环形进度条
基于canvas 2D实现微信小程序自定义组件-环形进度条 最近开发一个小程序项目博闻金榜答题小程序,需要使用到一个可以显示答题倒计时的组件,基于进度条实现,下面就主要介绍基于canvas2D实现一个 ...
- 微信小程序自定义组件-树形数据表格(进阶版)
前言 一.下载引用 二.使用treegrid组件 三.使用文档 属性 事件 四.组件源码 利用递归思想编写的表格行--treegrid-treeline 树形表格--treegrid-treegrid ...
- 小程序组件onload_微信小程序自定义组件(一)
好吧,突然发现学不完了,一下子,那就分开吧,由于时间太久,直接重新大致复习了一下 微信小程序自定义组件 微信小程序支持自定义组件 下方的目录 其中,components为组件目录,nodemodule ...
- 一步步教你实现微信小程序自定义组件
一步步教你实现微信小程序自定义组件 更新时间:2022年03月21日 11:12:34 作者:naluduo233 之前做小程序开发的时候,对于开发来说比较头疼的莫过于自定义组件了,下面这篇文章主 ...
最新文章
- 2周修改了1000多个Bug后软件项目扭转了局面,未交付银行的现金管理系统健壮起来了...
- windows下安装ubuntu 12.04---利用ubuntu的iso包中的wubi.exe工具安装
- js高程(二)-----继承
- 直返图均衡化代码详解
- sort函数的应用习题(二)
- Flask的多app应用,多线程如何体现
- Webpack4-基本使用
- 最优间隔分类器-SVM
- include包含头文件的语句中,双引号和尖括号的区别
- 老李分享:基于图像识别的跨平台的手机自动化测试方案
- 开发者说:Seata 0.7.0 版本,你 get 'Metrics' 技能了吗?
- python 打印xml文档树_[Python]xml.etree.ElementTree处理xml文档
- 这个被程序员捧上神坛的IDEA插件出来后,我扔掉了Postman了
- 单元测试 代码里面都绝对路径怎么处理_python基础之包,异常处理
- ssm框架逻辑删除mysql_mysql字段类型 - osc_mzx9t9jk的个人空间 - OSCHINA - 中文开源技术交流社区...
- 儿童节特刊 | 如何练好手眼协调能力(手眼标定详解,附源码)
- 南京大学计算机系2019复试离散题目-逻辑与推理
- LAMP系列文章之:泛泛而谈LAMP(一)
- SAS Planet+ArcGIS
- 解析:学Java好还是HTML5好?
热门文章
- 使用 Velocity 实现客户端和服务器端模板
- beam search解码原理(斯坦福 2014 论文解读)
- Ubuntu安装Mysql数据库
- 实现共享要修改哪些计算机策略,IT之家网友分享:使用组策略更改Windows的UAC等级...
- C++string转int的方法
- 系统分析师-资料总结-上
- 为何高库存和深贴水可以同时存在?
- 基于云服务创建实时运营数据分析服务(三)
- Three.js BIM模型轻量化 FPS渲染速率优化 多 实例渲染[Instance]+顶点合并[Merge]
- linux如何更改密钥环密码,要解除锁定,请输入密钥环“默认密钥”的密码 是怎么回事呢?...