支付宝小程序框架 自定义组件·对象

2020-09-18 10:31 更新

Component 构造器

以下为一个简单示例:

  1. // /components/index/index.js
  2. Component({
  3. mixins:[{ didMount() {}, }],
  4. data: {y:2},
  5. props:{x:1},
  6. didUpdate(prevProps,prevData){},
  7. didUnmount(){},
  8. methods:{
  9. onMyClick(ev){
  10. my.alert({});
  11. this.props.onXX({ ...ev, e2:1});
  12. },
  13. },
  14. });

注意:onInitderiveDataFromProps 仅支持在基础库 1.14.0 版本及以上使用,可调用 my.canIUse('component2') 实现兼容,并且,需要在 IDE 中的 详情 > 项目配置 中,勾选 component2

参数说明

参数 类型 是否必填 说明 最低版本
data Object 组件内部状态 -
props Object 为外部传入的数据设置默认值 -
onInit Function 组件生命周期函数,组件创建时触发 1.14.0
deriveDataFromProps Function 组件生命周期函数,组件创建时和更新前触发 1.14.0
didMount Function 组件生命周期函数,组件创建完毕时触发 -
didUpdate Function 组件生命周期函数,组件更新完毕时触发 -
didUnmount Function 组件生命周期函数,组件删除时触发 -
mixins Array 组件间代码复用机制 -
methods Object 组件的方法,可以是事件响应函数或任意的自定义方法 -
ref Function 指定组件被ref引用时的返回值 1.18.0

methods

自定义组件不仅可以渲染静态数据,也可以响应用户点击事件,进而处理并触发自定义组件重新渲染。methods 中可以定义任意自定义方法。

注意: 与 Page 不同,自定义组件需要将事件处理函数定义在 methods 中。

  1. <!-- /components/index/index.axml -->
  2. <view>{{counter}}</view>
  3. <button onTap="plusOne">+1</button>
  4. // /components/index/index.js
  5. Component({
  6. data: { counter: 0 },
  7. methods: {
  8. plusOne(e) {
  9. console.log(e);
  10. this.setData({ counter: this.data.counter + 1 });
  11. },
  12. },
  13. });

页面会渲染一个按钮,每次点击它页面的数字都会加 1。

props

自定义组件可以接受外界的输入,做完处理之后,还可以通知外界说:我做完了。这些都可以通过 props 实现。

注意:

  • props 为外部传过来的属性,可指定默认属性,不能在自定义组件内部代码中修改。
  • 自定义组件的 axml 中可以直接引用 props 属性。
  • 自定义组件的 axml 中的事件只能由自定义组件的 js 的 methods 中的方法来响应, 如果需要调用父组件传递过来的函数,可以在 methods 中通过 this.props 调用。

  1. // /components/index/index.js
  2. Component({
  3. data: { counter: 0 },
  4. // 设置默认属性
  5. props: {
  6. onCounterPlusOne: (data) => console.log(data),
  7. extra: 'default extra',
  8. },
  9. methods: {
  10. plusOne(e) {
  11. console.log(e);
  12. const counter = this.data.counter + 1;
  13. this.setData({ counter });
  14. this.props.onCounterPlusOne(counter); // axml中的事件只能由methods中的方法响应
  15. },
  16. },
  17. });

以上代码中 props 设置默认属性,然后在事件处理函数中通过 this.props 获取这些属性。

  1. <!-- /components/index/index.axml -->
  2. <view>{{counter}}</view>
  3. <view>extra: {{extra}}</view>
  4. <button onTap="plusOne">+1</button>

外部使用不传递 props

  1. <!-- /pages/index/index.axml -->
  2. <my-component />

页面输出:

  1. 0
  2. extra: default extra
  3. +1

此时并未传递参数,所以页面会显示组件 js 中 props 设定的默认值。

外部使用传递 props

注意: 外部使用自定义组件时,如果传递参数是函数,一定要以 on 为前缀,否则会将其处理为字符串。

  1. // /pages/index/index.js
  2. Page({
  3. onCounterPlusOne(data) {
  4. console.log(data);
  5. },
  6. });
  7. <!-- /pages/index/index.axml -->
  8. <my-component extra="external extra" onCounterPlusOne="onCounterPlusOne" />

页面输出:

  1. 0
  2. extra: external extra
  3. +1

此时传递了参数,所以页面会显示外部传递的 extra 值 external extra

组件实例属性

属性名 类型 说明
data Object 组件内部数据
props Object 传入组件的属性
is String 组件路径
$page Object 组件所属页面实例
$id Number 组件 id,可直接在组件 axml 中渲染值

以下为一个简单示例:

  1. // /components/index/index.js
  2. Component({
  3. didMount(){
  4. this.$page.xxCom = this; // 通过此操作可以将组件实例挂载到所属页面实例上
  5. console.log(this.is);
  6. console.log(this.$page);
  7. console.log(this.$id);
  8. }
  9. });
  10. <!-- /components/index/index.axml 组件 id 可直接在组件 axml 中渲染值 -->
  11. <view>{{$id}}</view>
  12. // /pages/index/index.js
  13. Page({
  14. onReady() {
  15. console.log(this.xxCom); // 可以访问当前页面所挂载的组件
  16. },
  17. });

当组件在页面上渲染后,执行 didMount 回调,控制台输出如下:

  1. /components/index/index
  2. {$viewId: 51, route: "pages/index/index"}
  3. 1

组件实例方法

方法名 参数类型 说明
setData Object 设置 data 触发视图渲染
$spliceData Object 设置 data 触发视图渲染

具体使用方式同 页面

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号