小程序自定义组件

  • 参数options配置

    组件wxml模板

    <view class="wrapper">
      <slot name="before"></slot>
      <view>这里是组件的内部细节</view>
      <slot name="after"></slot>  //用不同的 name 来区分
    </view>
    

    组件js模板

    Component({
     options: {
        multipleSlots: true, // 默认情况下,一个组件的wxml中只能有一个slot。
                                      //需要使用多slot时,可以在组件js中声明启用。
        styleIsolation: 'isolated',//组件样式隔离。
        //isolated双向隔离;
        //apply-shared仅接受页面(父);
        // shared双向影响包括同样设置该参数的其他自定义组件
        addGlobalClass: true,
        //表示页面 wxss 样式将影响到自定义组件,等价于设置 styleIsolation: apply-shared
        pureDataPattern:/^_/ 
        // 指定所有 _ 开头的数据字段为纯数据字段  正则
     }
    })
    

    纯数据字段:https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/pure-data.html

  • 参数externalClasses:引用外部样式类

    组件 custom-component.js

    Component({
      externalClasses: ['my-class']
    })          
    

    组件 custom-component.wxml

    <custom-component class="my-class">这段文本的颜色由组件外的 class 决定</custom-component>         
    
    <!-- 页面的 WXML引用组件插入样式,可引入多个 -->
    <my-component my-class="red-text large-text" />
    
    <!-- 页面的 WXML样式 -->
    .red-text {
      color: red;
    }
    .large-text {
      font-size: 1.5em;
    }
    
  • 参数properties:接收(父)页面参数

    Component({
      properties: {
         min: {
          type: Number,//属性的类型
          optionalTypes: [String, Object],//属性的类型(可以指定多个)
          value: 0,//属性的初始值
          observer: function(newVal, oldVal) {
            // 属性值变化时执行
            }
         }
       }
    })
    
    属性的类型可以为 String Number Boolean Object Array 其一,也可以为 null 表示不限制类型。
    多数情况下,属性最好指定一个确切的类型,防止数字与字符数字混乱
    
  • 参数observers:数据监听器

    Component({
      attached: function() {
        this.setData({
          numberA: 1,
          numberB: 2,
      })
    },
    observers: {
      'numberA, numberB': function(numberA, numberB) {
        // 在 numberA 或者 numberB 被设置时,执行这个函数
          this.setData({
            sum: numberA + numberB
          })
        }
      }
    })
    使用通配符 ** 可以监听全部 setData
    说明observers只能在Component中使用,没法在Page中使用
    Observer属于小程序的新功能,只能在高版本微信使用,低版本微信无法使用
    若在page中监听watch需扩展
    
  • 参数lifetimes:组件内周期函数

    Component({
      lifetimes: {
        attached: function() {
        // 在组件实例进入页面节点树时执行
        },
        detached: function() {
        // 在组件实例被从页面节点树移除时执行
        },
      }
    })
    

    参数

    created    =》在组件实例刚刚被创建时执行
    attached   =》在组件实例进入页面节点树时执行
    ready      =》在组件在视图层布局完成后执行
    moved      =》在组件实例被移动到节点树另一个位置时执行
    detached   =》在组件实例被从页面节点树移除时执行
    error      =》每当组件方法抛出错误时执行
    
  • 参数pageLifetimes:组件所在页面周期函数

    Component({
      pageLifetimes: {
        show: function() {
        // 页面被展示
        },
        hide: function() {
         // 页面被隐藏
      },
      resize: function(size) {
        // 页面尺寸变化
      }
     }
    })
    

    参数

    show     =》组件所在的页面被展示时执行
    hide     =》组件所在的页面被隐藏时执行
    resize   =》组件所在的页面尺寸变化时执行
    
  • 参数behaviors:组件间代码共享

    每个 behavior 可以包含一组属性、数据、生命周期函数和方法
    组件引用它时,它的属性、数据和方法会被合并到组件中,生命周期函数也会在对应时机被调用
    每个组件可以引用多个 behavior ,behavior 也可以引用其他 behavior
    

    组件模板

    <view class="wrapper">
      <view>{{myBehaviorProperty}}</view>
      <view>{{myProperty}}</view>
      <button bindtap="myBehaviorMethod">点击触发 behavior 方法</button>
    </view>
    

    组件 my-component.js

    var myBehavior = require('my-behavior')
      Component({
        behaviors: [myBehavior],
        properties: {
              myProperty: {
                  type: String
              }
        }
    })
    

    my-behavior.js

    module.exports = Behavior({
      behaviors: [],
      properties: {
      myBehaviorProperty: {
        type: String
      }
    },
    methods: {
        myBehaviorMethod: function () {
          console.log('log from my-behavior.js')
        }
    }
    })
    

    引用组件的页面模版

    <view>
      <my-component my-behavior-property="behavior-property" my-property="my-property">
      </my-component>
    </view>
    

    内置 behaviors

    Component({
      behaviors: ['wx://form-field']
    })
    ['wx://form-field']表单控件的行为
    Component({
    behaviors: ['wx://component-export'],
    export() {
      return { myField: 'myValue' }
    }
    })
    ['wx://component-export']使自定义组件支持 export 定义段。这个定义段可以用于指定组件被 selectComponent 调用时的返回值
    

    this.selectComponent用于父级直接调用子组件

    <!-- 使用自定义组件时 -->
    <my-component id="the-id" />
    this.selectComponent('#the-id') // 等于 { myField: 'myValue' }
    
  • 参数relations:组件间联系

    必须在两个组件定义中都加入relations定义,否则不会生效
    

    页面中引用组件

    <custom-ul>
      <custom-li> item 1 </custom-li>
      <custom-li> item 2 </custom-li>
    </custom-ul>
    

    custom-ul.js

    Component({
        relations: {
          './custom-li': {
          type: 'child', // 关联的目标节点应为子节点
          linked: function(target) {
          // 每次有custom-li被插入时执行,target是该节点实例对象,触发在该节点attached生命周期之后
          },
          linkChanged: function(target) {
          // 每次有custom-li被移动后执行,target是该节点实例对象,触发在该节点moved生命周期之后
          },
          unlinked: function(target) {
          // 每次有custom-li被移除时执行,target是该节点实例对象,触发在该节点detached生命周期之后
        }
      }
    },
    methods: {
      _getAllLi: function(){
      // 使用getRelationNodes可以获得nodes数组,包含所有已关联的custom-li,且是有序的
      var nodes = this.getRelationNodes('./custom-li')//组件地址
      }
    },
    ready: function(){
      this._getAllLi()
    }
    })
    

    custom-li.js

    Component({
      relations: {
      './custom-ul': {
        type: 'parent', // 关联的目标节点应为父节点
      }
    }
    })
    

    参数

    type        =》目标组件的相对关系,可选的值为 parent 、 child 、 ancestor(祖先) 、 descendant(子孙)
    inked       =》关系生命周期函数,当关系被建立在页面节点树中时触发,触发时机在组件attached生命周期之后
    linkChanged =》关系生命周期函数,当关系在页面节点树中发生改变时触发,触发时机在组件moved生命周期之后
    unlinked    =》关系生命周期函数,当关系脱离页面节点树时触发,触发时机在组件detached生命周期之后
    target      =》如果这一项被设置,则它表示关联的目标节点所应具有的behavior,所有拥有这一behavior的组件节点都会被关联
    

    详解:https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/relations.html

  • 组件扩展

    // behavior.js
    module.exports = Behavior({
      definitionFilter(defFields) {
        defFields.data.from = 'behavior'
      },
    })
    
    // component.js
    Component({
    data: {
    from: 'component'
    },
    behaviors: [require('behavior.js')],
    ready() {
    console.log(this.data.from) // 此处会发现输出 behavior 而不是 component
    }
    })
    

    组件扩展watch和computed
    官方扩展包https://github.com/wechat-miniprogram/computed

  • 组件内方法

    setData设置data并执行视图层渲染
    triggerEvent用于子传父通信事件
    详情https://developers.weixin.qq.com/miniprogram/dev/reference/api/Component.html

  • 组件内可调用的属性和方法

    组件的方法、生命周期函数和属性 observer 中通过 this 访问

    is          =》组件的文件路径
    id          =》节点id
    dataset     =》节点dataset
    data        =》组件数据,包括内部数据和属性值
    properties  =》组件数据,包括内部数据和属性值(与 data 一致)
    
  • 抽象节点

    selectable-group.wxml

    <view wx:for="{{labels}}">
      <label>
        <selectable disabled="{{false}}"></selectable>//抽象子组件
          {{item}}
      </label>
    </view>
    

    selectable-group.json

    {
      "componentGenerics": {
        "selectable": true
      }
    }
    
    或者设置默认抽象页面
    
    {
      "componentGenerics": {
        "selectable": {
          "default": "path/to/default/component"
      }
    }
    }
    

    在页面中引用

    <selectable-group generic:selectable="custom-radio" />//生成单选框
    <selectable-group generic:selectable="custom-checkbox" />//生成多选框
    

    在页面json配置

    {
      "usingComponents": {
          "custom-radio": "path/to/custom/radio",
          "custom-checkbox": "path/to/custom/checkbox"
      }
    }
    

    详解:https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/generics.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容