小程序开放平台

文档中心
小程序配置
框架接口
小程序App
页面
自定义组件
Component
Behavior
模块化
基础功能
XHSML语法参考
2.0架构升级
sjs 语法参考
平台骨架屏(beta)

Component

开发
>
框架
>
框架接口
>
自定义组件
>
Component
>
更新时间:2024-11-13 19:05:25

Component

Component 构造器可用于定义组件,调用 Component 构造器时可以指定组件的属性、数据、方法等

属性
类型
默认值
必填
说明
optionsobject组件的选项
externalClassesarray组件接受的外部样式类
dataobject组件的内部数据,和 properties 一同用于组件的模板渲染
observersobject组件数据字段监听器,用于监听 properties 和 data 的变化
methodsobject组件的方法,包括事件响应函数和任意的自定义方法
behaviorsarray类似于mixins和traits的组件间代码复用机制
createdobject组件生命周期函数-在组件实例刚刚被创建时执行,注意此时不能调用 setData
attachedobject组件生命周期函数-在组件实例进入页面节点树时执行
readyobject组件生命周期函数-在组件布局完成后执行
detachedobject组件生命周期函数-在组件实例被从页面节点树移除时执行

示例代码

// component.js

Component({

  behaviors: [],

  properties: {
    myProperty: { // 属性名
      type: String,
      value: ''
    },
    myProperty2: String // 简化的定义方式
  },
  
  data: {}, // 私有数据,可用于模板渲染

  lifetimes: {
    // 生命周期函数,可以为函数,或一个在methods段中定义的方法名
    attached: function () { },
    detached: function () { },
  },

  // 生命周期函数,可以为函数,或一个在methods段中定义的方法名
  attached: function () { }, // 此处attached的声明会被lifetimes字段中的声明覆盖
  ready: function() { },

  methods: {
    onMyButtonTap: function(){
      this.setData({
        // 更新属性和数据的方法与更新页面数据的方法类似
      })
    },
    // 内部方法建议以下划线开头
    _myPrivateMethod: function(){
      // 这里将 data.A[0].B 设为 'myPrivateData'
      this.setData({
        'A[0].B': 'myPrivateData'
      })
    },
    _propertyChange: function(newVal, oldVal) {

    }
  }

})

properties 定义

定义段
类型
是否必填
描述
type-属性的类型
value-Object
observerFunction属性值变化时的回调函数

示例代码:

Component({
  properties: {
    min: {
      type: Number,
      value: 0
    },
    min: {
      type: Number,
      value: 0,
      observer: function(newVal, oldVal) {
        // 属性值变化时执行
      }
    }
  }
})

data

data 是页面第一次渲染使用的初始数据。 组件的数据有两个来源,内部的状态

data
和外部传入的属性
properties

data
为组件的局部状态,和在页面中一样,可通过
this.data
进行访问,可调用
this.setData
方法进行更改,并触发组件的重新渲染。

properties
为组件外部传入的状态,和在页面中一样,可通过
this.data
进行访问,但不可在子组件中调用
this.setData
方法进行更改,子组件直接修改 props 属性会抛出错误

示例代码:

<view>{{name}}</view>
<view>{{parentName}}</view>
Component({
  properties: {
    parentName: {
      type: String,
      value: 0
    }
  },
  data: {
    name: 'hello',
  },
  methods: {
    changeName() {
      this.setData({
        name: "world"
      })
    }
  }
})

生命周期回调函数

自定义组件提供了四个生命周期函数:

created
attached
ready
detached

生命周期
类型
描述
createdobject在组件实例刚刚被创建时执行(注意此时不能调用 setData?)
attachedobject在组件实例进入页面节点树时执行
readyobject在组件布局完成后执行
detachedobject在组件实例被从页面节点树移除时执行

示例代码:

Component({
  properties: {
    parentName: {
      type: String,
      value: 0
    }
  },
  lifetimes: {
    created: function () {
      console.log("this is created");
    },
    attached: function () {
      console.log("this is attached");
    },
    detached: function () { 
      console.log("this is detached");
    },
    ready() {
        this.fetchData()
    }
  },
  // 生命周期函数,可以为函数,或一个在methods段中定义的方法名
  attached: function () { }, // 此处attached的声明会被lifetimes字段中的声明覆盖
  ready: function() { },
  data: {
    name: 'hello',
  },
  methods: {
    fetchData() {
      xhs.myRequest('***')
    },
    changeName() {
      this.setData({
        name: "world"
      })
    }
  }
})

插槽 slot

插槽最简单的用法就是默认插槽,它允许你像这样拓展组件的模板能力:

    <your-component name="{{ parentName }}">
        <h1>hello, i am slot1</h1>
        <h1>hello, i am slot2</h1>
        <h1>hello, i am slot3</h1>
        <h1>hello, i am slot4</h1>
    </your-component>

your-component 组件模板:

// your-component.xhsml

<view>
    子组件模板,接收到父组件的 parentName 参数: {{ name }}
    <slot></slot>
<view>

命名插槽

有时可能会有多个插槽组合使用的场景:

    <your-component name="{{ parentName }}">
        <block slot="header">
            <text>i am header</text>
        </block>
        <block slot="body">
            <text>i am body</text>
        </block>
        <block slot="footer">
            <text>i am footer</text>
        </block>
    </your-component>

your-component 组件模板:

// your-component.xhsml

<view>
    <slot name="header"></slot>
    子组件模板,接收到父组件的 parentName 参数: {{ name }}
    <slot name="body"></slot>
    <slot name="footer"></slot>
<view>

样式

和页面一样,自定义组件定义的样式,会自动被引入使用组件的页面,无须手动引入