【微信小程序】自定义组件(三)

自定义组件

插槽

1、什么是插槽

在自定义组件的wxml结构中,可以提供一个<solot> 节点(插槽),用于承载组件使用者提供的wxml结构

2、单个插槽

在小程序中,默认每个自定义组件中只允许使用一个<slot>进行占位,这种个数上的限制叫做单个插槽。

javascript 复制代码
<view class="wrapper">
  <view>这里是组件的内部节点</view>
  <!-- 对于不确定的内容,可以使用<solt>进行占位,具体内容有组件的使用者决定 -->
  <slot></slot>
</view>

<!-- 组件的使用者 -->
<component-tag-name>
  <!-- 这部分内容将被放置在组件的使用者决定 -->
  <view>这里是插入到组件的slot的内容</view>
</component-tag-name>
3、定义多个插槽
js 复制代码
<view class="wrapper">
  <!-- name为before的第一个slot插槽 -->
  <slot name="before"></slot>
  <!-- name为after的第一个slot插槽 -->
  <slot name="after"></slot>

</view>
-------------------
<component-tag-name>
  <!-- 这部分内容将被放置在组件的使用者决定 -->
  <view slot="before">这里是插入到组件的before的内容</view>
  <view slot="after">这里是插入到组件的after的内容</view>
</component-tag-name> -->

父子组件之间的通信

1、父子组件之间的通信的3种方式

1.父子组件之间通信的3种方式

①属性绑定

用于父组件向子组件的指定属 性设置数据,仅能设置JSON兼容的数据

②事件绑定

用于子组件向父组件传递数据, 可以传递任意数据

③获取组件实例

父组件还可以通过 this.selectComponent()获取子组件实例对象,

这样就可以直接访问子 组件的任意数据和方法

2、事件绑定

事件绑定用于实现子向父传值,可以传递任何类型的数据。

①在父组件的js中,定义一个函数,这个函数即将通过自定义事件的形式,传递给子组件

javascript 复制代码
//再父组件中定义syncCount方法
  //将来,这个方法会被传递给子组件,使子组件进行调用
  syncCount(){
    console.log('syncCount');
  },

②在父组件的wxml中,通过自定义事件的形式,将步骤1中定义的函数引用,传递给子组件

javascript 复制代码
<!-- 使用bind:自定义事件名称 -->

<my-test3 count="{{count}}" bind:sync='syncCount'></my-test3>
<!-- 或者使用bind后面直接写上自定义事件名称  -->
<my-test3 count="{{count}}" bindsync='syncCount'></my-test3>

③在子组件的js中,通过调用this.triggerEvent('自定义事件名称', {/*参数对象*/}),将数据发送到父组件

javascript 复制代码
addCount(){
      this.setData({
        count:this.properties.count+1
      })
      this.triggerEvent('sync',{value:this.properties.count})
    }

④在父组件的js中,通过e.detail获取到子组件传递过来的数据

javascript 复制代码
syncCount(e){
	this.setData({
		count:e.detail.value
	})
	
}
3、behaviors

behaviors是小程序中,用于实现组件间代码共享的特性,类似于Vue.js 中的"mixins"

  • behaviors的工作方式

每个behavior可以包含- 组属性、数据、生命周期函数和方法。组件引用它时,它的属性、数据和方法会被合并到组件中。

每个组件可以引用多个behavior, behavior也可以引用其它behavior.

  • 创建behaviors
javascript 复制代码
module.exports=Behavior({
  //属性节点
  properties:{},
  //私有数据节点
  data:{usernameL:'zs'},
  //事件处理函数和自定义方法节点
  methods:{},
  // /其他节点
})
  • behavior中所有可用的节点
可用的节点 类型 是否必填 描述
properties object Map 同组件的属性
data object 同组件的数据
methods object 同自定义组件的方法
behaviors String Array 引入其它的behavior
created Function 生命周期函数
attached Function 生命周期函数
ready Function 生命周期函數
moved Function 生命周期函数
detached Function 生命周期函数
  • 同名字段的覆盖和组合规则

组件和它引用的 behavior 中可以包含同名的字段,对这些字段的处理方法如下:

  • 如果有同名的属性 (properties) 或方法 (methods):
    1. 若组件本身有这个属性或方法,则组件的属性或方法会覆盖 behavior 中的同名属性或方法;
    2. 若组件本身无这个属性或方法,则在组件的 behaviors 字段中定义靠后的 behavior 的属性或方法会覆盖靠前的同名属性或方法;
    3. 在 2 的基础上,若存在嵌套引用 behavior 的情况,则规则为:引用者 behavior 覆盖 被引用的 behavior 中的同名属性或方法。
  • 如果有同名的数据字段 (data):
    • 若同名的数据字段都是对象类型,会进行对象合并;
    • 其余情况会进行数据覆盖,覆盖规则为: 引用者 behavior > 被引用的 behavior靠后的 behavior > 靠前的 behavior。(优先级高的覆盖优先级低的,最大的为优先级最高)
  • 生命周期函数和 observers 不会相互覆盖,而是在对应触发时机被逐个调用:
    • 对于不同的生命周期函数之间,遵循组件生命周期函数的执行顺序;
    • 对于同种生命周期函数和同字段 observers ,遵循如下规则:
      • behavior 优先于组件执行;
      • 被引用的 behavior 优先于 引用者 behavior 执行;
      • 靠前的 behavior 优先于 靠后的 behavior 执行;
    • 如果同一个 behavior 被一个组件多次引用,它定义的生命周期函数和 observers 不会重复执行
相关推荐
spmcor2 天前
微信小程序 setStorageSync 踩坑实录:别让"顺手一存"变成"隐形炸弹"
微信小程序
用户4324281061142 天前
小程序埋点设计规范:如何设计可扩展的数据采集体系
微信小程序
玩烂小程序4 天前
微信小程序手串DIY功能开发实录:飞入动画 + 环形排布 + 拖拽换序 + 旋转查看 + 保存设计
微信小程序
何时梦醒4 天前
HTML5 Canvas 从入门到实战:手把手教你打造一款"打飞机"小游戏
微信小程序
master3364 天前
SSL 证书链问题导致微信小程序无法正常工作
网络协议·微信小程序·ssl
wuxia21185 天前
在5种环境中编写点击元素改变内容和颜色的JavaScript程序
javascript·微信小程序·vue·jquery·react
it-10245 天前
抖音快手短视频去水印微信小程序/一键去水印/小程序去水印接口代码
微信小程序·小程序·php
夏天测6 天前
微信小程序自动化漏洞挖掘流水线:从缓存提取到密钥验证全流程实战
python·网络安全·微信小程序·漏洞挖掘
it-10246 天前
微信小程序短视频去水印/抖音短视频去水印/免费去水印源码
微信小程序·小程序·视频去水印
kidding7237 天前
高效备忘清单工具类小程序
前端·计算机网络·微信小程序·小程序