queryui中的内嵌组件

104 阅读2分钟

小程序的超级组件(一),item组件
小程序的超级组件(二),list组件
如何引入QUERYUI

在上两篇文章中我们介绍了两个超级组件ITEMLIST,虽然这两个组件很强,但依然不能满足业务的需求,为了灵活的应对复杂结构,我们引入了内嵌组件外嵌组件两个帮手

内嵌组件

内嵌组件不需要额外引入模板,直接嵌入在其他组件中使用的组件,内嵌组件基于寻址算法,会自动处理父子级的组件关系,比如子级使用父级定义的方法,或者Page中定义的方法 下列是常用的内嵌组件

  1. @item
  2. @list
  3. @tree
  4. @url
  5. @md
  6. @html
  7. @form

比如我们在item组件中需要引入一个列表组件

wxml

<ui-item item="{{itemConfig}}" />

js

Pager({
  data: {
    itemConfig: {
      title: '列表标题',
      "@list": {
        listClass: 'list-class-name'
        data: [...]
      }
    }
  }
})

如何在Pager中查找组件实例并使用其API方法

Pager({
  data: {
    item: {/* item配置*/},  // ?id = 'abc'
    list: {/* list配置*/}  // ?id = 'xyz'
  }
  onReady(){
    let abc = this.getElementsById('#abc')
    abc.update({title: '新标题'})

    let xyz = this.getEelementsById('#xyz')
    xyz.forEach(item=>{
      // item.addclass/removeClass/hasClass/css/update... 等类jquery的API方法
    })

    this.find('.class-name').addClass('other-class-name') // 批量追加类名
  }
})

外嵌组件

内嵌组件一般有官方定义,外嵌组件支持用户自定义,可以根据不同的需求定制模板

在哪里定义外嵌组件

如下结构示例中打勾的文件

components 
  ├─ aotoo 核心代码必须有
  ├─ form  表单组件
  ├─ markit  文档组件
  ├─ modules
  ├─ templates.wxml 模板 ✔︎  

如何定义外嵌组件

打开templates.wxml文件,定义一个模板

<template name="@abc"> 
  <block wx:if="{{util.isObject(props)}}">
    <view>...</view>
  </block>
</template>

上例中定义了一个模板@abc,我们需要传递一个props的参数给模板,然后输出结构

如何使用外嵌组件

内嵌组件中,我们定义了一个调用外嵌组件的属性@ext,使用它则可以调用外嵌组件,下例示例中通过item组件来调用

item的wxml

<ui-item item="{{itemConfig}}" />

item的配置

itemConfig = {
  title: '这是一个item组件的定义',
  "@ext": {  // 通过@ext调用外嵌组件并传递参数
    is: '@abc',
    property1: '',  // @ext的is属性调用@abc模板,并将所有子属性打包为props参数传递
    data: [...],
    name: {},
    property2: ''
  }
}

通过@ext.is调用选择的模板,@ext的其他属性将作为参数传递