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

自定义组件

插槽

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 不会重复执行
相关推荐
h_654321014 小时前
微信小程序点击按钮跳转链接并显示
微信小程序·小程序
银迢迢17 小时前
微信小程序的开发及问题解决
微信小程序·小程序
liyinchi198817 小时前
原生微信小程序 textarea组件placeholder无法换行的问题解决办法
微信小程序·小程序
前端极客探险家1 天前
微信小程序全解析:从入门到实战
微信小程序·小程序
h_65432101 天前
微信小程序van-dialog确认验证失败时阻止对话框的关闭
微信小程序·小程序
-曾牛1 天前
基于微信小程序的在线聊天功能实现:WebSocket通信实战
前端·后端·websocket·网络协议·微信小程序·小程序·notepad++
CN自由之翼2 天前
【微信小程序】webp资源上传失败
微信小程序·小程序
小新1102 天前
微信小程序学习之搜索框
学习·微信小程序·小程序
小新1102 天前
微信小程序之将轮播图设计为组件
微信小程序·小程序
不爱吃饭爱吃菜2 天前
uniapp微信小程序-长按按钮百度语音识别回显文字
前端·javascript·vue.js·百度·微信小程序·uni-app·语音识别