微信小程序自定义组件的基本使用

组件与模块类似,实现了功能的复用,提高开发速率,减少代码量

在开发过程中 , 总会遇到一些功能板块是相同或很类似的 。如两个不同页面都有搜索框 , 或者 导航栏等 。

那么这个使用就很有必要使用组件了

组件文件创建

一般在根目录下创建一个 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-sharedshared 的自定义组件。

此外,小程序基础库版本 2.2.3 以上支持 addGlobalClass 选项,即在 Componentoptions 中设置 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

微信小程序自定义组件的基本使用相关推荐

  1. 微信小程序自定义组件方案

    前言:小程序已于11月初开放了小程序组件功能,但事件方面还不是很完善,有的组件暂时可能还是要用其他方式来实现,这里简单记录下开发小程序自定义组件的要点. 在小程序官方开发组件开发功能之前,自定义组件的 ...

  2. 微信小程序自定义组件,提示组件

    微信小程序自定义组件,这里列举了一个常用的提示自定义组件,调用自定义组件中的方法和字段.仅供参考和学习. 编写组件: 在根目录下添加"components"目录,然后像添加Page ...

  3. 微信小程序自定义组件(二)

    微信小程序自定义组件 ps 由于作业部落貌似出了点问题,耽误了点时间,找了一个stackedit.io准备写.无奈,这是要自己建编辑器的节奏啊.没有一个能靠的注 为何存在组件 组件间的关系 使用rel ...

  4. 微信小程序--自定义组件(超详细 从新建到使用)

    微信小程序–自定义组件 微信小程序官网介绍! 本文提供给急需使用自定义组件人群,以下是博主个人理解和案例!可以辅助官网来看 介绍: 从小程序基础库版本 1.6.3 开始,小程序支持简洁的组件化编程.所 ...

  5. 微信小程序自定义组件子传父详解(多图)

    微信小程序自定义组件子传父详解 前言: 刚开始为了测试父传子,所以把页面的数组放在了父组件中 1. 然而子组件中绑定的自定义点击事件依然放在子组件的js文件中 2. 所以就会出现我们点击页面的文字能改 ...

  6. 基于canvas 2D实现微信小程序自定义组件-环形进度条

    基于canvas 2D实现微信小程序自定义组件-环形进度条 最近开发一个小程序项目博闻金榜答题小程序,需要使用到一个可以显示答题倒计时的组件,基于进度条实现,下面就主要介绍基于canvas2D实现一个 ...

  7. 微信小程序自定义组件-树形数据表格(进阶版)

    前言 一.下载引用 二.使用treegrid组件 三.使用文档 属性 事件 四.组件源码 利用递归思想编写的表格行--treegrid-treeline 树形表格--treegrid-treegrid ...

  8. 小程序组件onload_微信小程序自定义组件(一)

    好吧,突然发现学不完了,一下子,那就分开吧,由于时间太久,直接重新大致复习了一下 微信小程序自定义组件 微信小程序支持自定义组件 下方的目录 其中,components为组件目录,nodemodule ...

  9. 一步步教你实现微信小程序自定义组件

    一步步教你实现微信小程序自定义组件 更新时间:2022年03月21日 11:12:34   作者:naluduo233 之前做小程序开发的时候,对于开发来说比较头疼的莫过于自定义组件了,下面这篇文章主 ...

最新文章

  1. 2周修改了1000多个Bug后软件项目扭转了局面,未交付银行的现金管理系统健壮起来了...
  2. windows下安装ubuntu 12.04---利用ubuntu的iso包中的wubi.exe工具安装
  3. js高程(二)-----继承
  4. 直返图均衡化代码详解
  5. sort函数的应用习题(二)
  6. Flask的多app应用,多线程如何体现
  7. Webpack4-基本使用
  8. 最优间隔分类器-SVM
  9. include包含头文件的语句中,双引号和尖括号的区别
  10. 老李分享:基于图像识别的跨平台的手机自动化测试方案
  11. 开发者说:Seata 0.7.0 版本,你 get 'Metrics' 技能了吗?
  12. python 打印xml文档树_[Python]xml.etree.ElementTree处理xml文档
  13. 这个被程序员捧上神坛的IDEA插件出来后,我扔掉了Postman了
  14. 单元测试 代码里面都绝对路径怎么处理_python基础之包,异常处理
  15. ssm框架逻辑删除mysql_mysql字段类型 - osc_mzx9t9jk的个人空间 - OSCHINA - 中文开源技术交流社区...
  16. 儿童节特刊 | 如何练好手眼协调能力(手眼标定详解,附源码)
  17. 南京大学计算机系2019复试离散题目-逻辑与推理
  18. LAMP系列文章之:泛泛而谈LAMP(一)
  19. SAS Planet+ArcGIS
  20. 解析:学Java好还是HTML5好?

热门文章

  1. 使用 Velocity 实现客户端和服务器端模板
  2. beam search解码原理(斯坦福 2014 论文解读)
  3. Ubuntu安装Mysql数据库
  4. 实现共享要修改哪些计算机策略,IT之家网友分享:使用组策略更改Windows的UAC等级...
  5. C++string转int的方法
  6. 系统分析师-资料总结-上
  7. 为何高库存和深贴水可以同时存在?
  8. 基于云服务创建实时运营数据分析服务(三)
  9. Three.js BIM模型轻量化 FPS渲染速率优化 多 实例渲染[Instance]+顶点合并[Merge]
  10. linux如何更改密钥环密码,要解除锁定,请输入密钥环“默认密钥”的密码 是怎么回事呢?...