这里是组...">
美文网首页
小程序自定义组件

小程序自定义组件

作者: 小碗吃不了 | 来源:发表于2019-11-01 15:26 被阅读0次
  • 参数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

相关文章

网友评论

      本文标题:小程序自定义组件

      本文链接:https://www.haomeiwen.com/subject/afsfbctx.html