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


    插槽

    1、什么是插槽

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

    2、单个插槽

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

    <view class="wrapper">
      <view>这里是组件的内部节点</view>
      <!-- 对于不确定的内容,可以使用<solt>进行占位,具体内容有组件的使用者决定 -->
      <slot></slot>
    </view>
    
    <!-- 组件的使用者 -->
    <component-tag-name>
      <!-- 这部分内容将被放置在组件的使用者决定 -->
      <view>这里是插入到组件的slot的内容</view>
    </component-tag-name>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    3、定义多个插槽
    <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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    父子组件之间的通信

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

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

    ①属性绑定

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

    ②事件绑定

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

    ③获取组件实例

    父组件还可以通过 this.selectComponent()获取子组件实例对象,
    这样就可以直接访问子 组件的任意数据和方法

    2、事件绑定

    事件绑定用于实现子向父传值,可以传递任何类型的数据。
    ①在父组件的js中,定义一个函数,这个函数即将通过自定义事件的形式,传递给子组件

    //再父组件中定义syncCount方法
      //将来,这个方法会被传递给子组件,使子组件进行调用
      syncCount(){
        console.log('syncCount');
      },
    
    • 1
    • 2
    • 3
    • 4
    • 5

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

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

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

    addCount(){
          this.setData({
            count:this.properties.count+1
          })
          this.triggerEvent('sync',{value:this.properties.count})
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

    syncCount(e){
    	this.setData({
    		count:e.detail.value
    	})
    	
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    3、behaviors

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

    • behaviors的工作方式

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

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

    • 创建behaviors
    module.exports=Behavior({
      //属性节点
      properties:{},
      //私有数据节点
      data:{usernameL:'zs'},
      //事件处理函数和自定义方法节点
      methods:{},
      // /其他节点
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • behavior中所有可用的节点
    可用的节点类型是否必填描述
    propertiesobject Map同组件的属性
    dataobject同组件的数据
    methodsobject同自定义组件的方法
    behaviorsString Array引入其它的behavior
    createdFunction生命周期函数
    attachedFunction生命周期函数
    readyFunction生命周期函數
    movedFunction生命周期函数
    detachedFunction生命周期函数
    • 同名字段的覆盖和组合规则

    组件和它引用的 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 不会重复执行
  • 相关阅读:
    11.6rhce
    【408数据结构与算法】—单链表的基本操作(六)
    2023 年高教社杯全国大学生数学建模竞赛题目 B 题 多波束测线问题
    轻量高效、灵活可扩展!了解下Alibaba QLExpress规则引擎的魅力
    2022年测试岗最新自动化测试面试题整理,干货满满
    十四、Django框架使用
    YOLOv5-理论部分
    MySQL高级篇——日志
    53.最大子数组和
    Es中的查询操作
  • 原文地址:https://blog.csdn.net/m0_61016904/article/details/134219847