codecamp

组件间关系

定义和使用组件间关系

有时需要实现这样的功能:

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

多层级自定义组件需要互相通信,实现起来比较复杂,这个时候可以使用 relations 字段解决。

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

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


关联一类组件

有时,需要关联的是一类组件,如:

<custom-form>
  <view>
    <custom-input></custom-input>
  </view>
  <custom-submit>submit</custom-submit>
</custom-form>

custom-form 组件想要关联 custom-input 和 custom-submit 两个组件。此时,如果这两个组件都有同一个 behavior:

// path/to/custom-form-controls.js
module.exports = Behavior({
  // ...
});
// path/to/custom-input.js
const customFormControls = require("./custom-form-controls");
Component({
  behaviors: [customFormControls],
  relations: {
    "./custom-form": {
      type: "ancestor" // 关联的目标节点应为祖先节点
    }
  }
});
// path/to/custom-submit.js
const customFormControls = require("./custom-form-controls");
Component({
  behaviors: [customFormControls],
  relations: {
    "./custom-form": {
      type: "ancestor" // 关联的目标节点应为祖先节点
    }
  }
});

则在 relations 关系定义中,可使用这个 behavior 来代替组件路径作为关联的目标节点:

// path/to/custom-form.js
const customFormControls = require("./custom-form-controls");
Component({
  relations: {
    customFormControls: {
      type: "descendant", // 关联的目标节点应为子孙节点
      target: customFormControls
    }
  }
});


relations 定义段

relations 定义段包含目标组件路径及其对应选项,可包含的选项见下表。

属性 类型 是否必填 描述
type String 目标组件的相对关系,可选的值为 parent 、 child 、 ancestor 、 descendant
linked Function 关系生命周期函数,当关系被建立在页面节点树中时触发,触发时机在组件 attached 生命周期之后
linkChanged Function 关系生命周期函数,当关系在页面节点树中发生改变时触发,触发时机在组件 moved 生命周期之后
unlinked Function 关系生命周期函数,当关系脱离页面节点树时触发,触发时机在组件 detached 生命周期之后
target String 如果这一项被设置,则它表示关联的目标节点所应具有的 behavior,所有拥有这一 behavior 的组件节点都会被关联
组件行为 behaviors
抽象节点
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

字节跳动小程序 介绍

字节跳动小程序 开发

字节跳动小程序开发框架

字节跳动小程序开发框架基础说明

字节跳动小程序开发框架基础功能

字节跳动小程序开发框架逻辑层

无标题文章

无标题目录

API

无标题文章

无标题文章

无标题文章

无标题文章

无标题文章

无标题目录

无标题目录

无标题文章

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }