炉甘石洗剂有什么作用| 盐和小苏打一起有什么作用| 喀秋莎什么意思| 狗尾巴草的花语是什么| 牙疼喝什么药| 大便出血是什么原因| 7月6号什么星座| 蚂蚁为什么会咬人| 早上起来口苦吃什么药| 什么是低聚果糖| 一步登天是什么生肖| 什么是碳足迹| 抽烟肺疼是什么原因| 否是什么意思| 孩子流黄鼻涕吃什么药效果好| 冤家是什么意思| 法图麦是什么意思| 提踵是什么意思| 做头发是什么意思| 上嘴角有痣代表什么| k金是什么意思| 桃子是什么季节的水果| 禁忌是什么意思| 吃什么药可以自杀| 一五行属什么| 12岁生日有什么讲究| 言字旁的字和什么有关| 眼皮浮肿什么原因| 依靠是什么意思| 鱼靠什么呼吸| 胆囊息肉是什么| 理疗是什么| 当所有的人离开我的时候是什么歌| 什么是福报| 大乌叶是什么茶| 寓教于乐什么意思| 胎发什么时候剃最合适| 梦见打官司预示着什么| 吃什么食物增加黑色素| 魂牵梦绕的意思是什么| 酉是什么生肖| ria是什么意思| 门字五行属什么| 吃什么皮肤白的最快| 背水一战是什么意思| 孕妇吃什么血糖降得快| 狡兔三窟是什么意思| 喝柠檬水对身体有什么好处| 2013年五行属什么| 伤口止血用什么药| 甲状腺有什么症状| 胃出血是什么原因引起的| 幻听一般会听到什么| 狼狈是什么动物| 什么牌子奶粉好| 鲤鱼打挺是什么意思| 老鼠爱吃什么食物| 什么花什么门的成语| gfr医学上是什么意思| 头皮屑多是什么原因怎么去除| 嘴边起水泡是什么原因| 糖尿病人能喝什么饮料| aj和nike什么关系| 尿路感染吃什么| 姜红枣红糖一起煮有什么效果| 开普拉多的都是什么人| 姐姐的女儿叫什么称呼| 什么是肝脏纤维化| 广东有什么城市| 上皮细胞一个加号什么意思| 天生丽质什么意思| 报价是什么意思| 什么人不能吃蜂蜜| 叶公好龙的好是什么意思| 婀娜多姿是什么意思| 1993属什么| 今年什么时候入梅| 封豕长蛇是什么意思| 珩是什么意思| 5月31日什么星座| 什么是辅警| 今年高温什么时候结束| 顿服是什么意思| 肤专家抑菌软膏主要治什么| 男人做噩梦是什么预兆| 女生为什么会流白带| 空蝶鞍是什么意思| 头晃动是什么病的前兆| 完璧归赵发生在什么时期| 水瓶女喜欢什么样的男生| 庆幸是什么意思| 阴茎插入阴道是什么感觉| 拔罐后发痒是什么原因| 喜欢白色的人是什么性格| 双肺间质性改变是什么意思| a型血和ab型血生的孩子是什么血型| 1997年7月1日属什么生肖| vans属于什么档次| 打嗝什么原因| adivon是什么牌子| 鱼非念什么| 什么颜色混合是红色| 12月20日是什么星座| 尿结石挂什么科| 肝风内动是什么原因造成的| 超声心动图是什么| 入职体检70元一般检查什么| 小孩肚子痛挂什么科| 琋字五行属什么| 风疹吃什么药| 烧心是什么原因引起的| 酮症酸中毒什么原因引起的| 鹿晗的原名是什么| 回眸一笑百媚生什么意思| 吃什么养脾胃| 非农业户口是什么意思| 交警支队长是什么级别| 这是什么踏板| 更年期出汗多是什么原因| k是什么单位| 高考推迟月经吃什么药| 辽源有什么好玩的地方| 为什么新生儿有胎记| 喉咙痛吃什么水果好| 儿童肚子疼挂什么科| 女人腰椎疼是什么原因| 微信为什么发不了视频| 尿蛋白高是什么原因引起的| 氩弧焊对身体有什么危害| 氧化性是什么意思| 喉咙痒是什么原因引起的| 绩效工资是什么| roca是什么品牌| 游园惊梦讲的是什么| 男人第一次什么 感觉| 牙髓炎是什么原因引起的| 女人为什么要穿高跟鞋| 女生吃什么可以丰胸| 羊刃格是什么意思| 五台山是求什么的| 吃什么会拉肚子| 色盲是什么意思| 什么病会吐血| 为什么叫中日友好医院| 胎儿头偏小是什么原因引起的| 女人腿肿应该检查什么| p图是什么意思| 智商是什么| 睡觉嗓子干是什么原因| 尖锐湿疣是什么样的| 蒲菜是什么菜| 2001年属蛇五行属什么| 胸口疼痛是什么原因| 汽车抖动是什么原因| 玉米淀粉能做什么美食| 谷丙转氨酶是检查什么| 女性盆腔炎吃什么药| 孕妇缺碘吃什么补最快| 吃什么可以止咳化痰| 心肺气虚吃什么中成药| 苔藓是什么意思| 眼疲劳用什么眼药水| spa是什么服务| 熠字五行属什么| 八十岁是什么寿| 女性尿血是什么原因| 女人什么时候性欲最强| 葳蕤是什么意思| hcg是检查什么的| sakose是什么牌子| 椒盐是什么| 夏天补什么| 血糖高可以吃什么主食| 粗口是什么意思| 健康查体是什么意思| 为什么叫丁克| 血压低是什么原因引起的| 供给侧改革什么意思| 吕洞宾属什么生肖| 喝蜂蜜水不能吃什么| 世界上最小的长度单位是什么| 东陵玉是什么玉| 尖锐湿疣什么症状| 拉大便肛门口疼痛什么原因| 须知是什么意思| hpv病毒是什么病毒| 孕妇腿抽筋是什么原因| 咯痰是什么意思| 天空是什么颜色| 宫内膜回声不均匀是什么意思| 地动山摇是什么生肖| 摩羯座女生和什么星座男生最配| 西南属什么五行| 心衰竭吃什么药效果好| 三七草长什么样| 下焦湿热吃什么中成药| 山西属于什么地区| 豆皮炒什么好吃| 1991是什么年| 花园里面有什么| 胃痛去药店买什么药| 谷朊粉是什么| 人设崩塌是什么意思| 缓苗是什么意思| 耳鸣是什么原因| 西瓜虫吃什么食物| 小孩白头发是什么原因引起的| 子宫肌瘤都有什么症状| 下巴下面是什么部位| 梦见捡钱是什么预兆| 女人五行缺水是什么命| porridge什么意思| 孕妇适合吃什么食物| 为什么胃酸会分泌过多| 火药是什么时候发明的| 手抖是什么病的前兆| 什么是性| b超涂的液体是什么| 台湾为什么叫4v| 战战兢兢的意思是什么| 山人是什么意思| 什么样的树木| 孜字五行属什么| 唇色深的人适合什么颜色的口红| 热感冒有什么症状| 荀彧字什么| 1a是什么意思| 做梦捡到钱是什么意思| 郑和下西洋是什么朝代| 阿莫西林有什么作用| 经常犯困是什么原因| 硬伤是什么意思| 怀孕40天有什么症状| 第一次同房是什么感觉| 发配是什么意思| 什么叫提供情绪价值| 儿童感冒吃什么药| 女人更年期有什么症状| 外痔疼痛用什么药最好| 大便干燥吃什么| 2.1是什么星座| 为什么全麻手术后不能睡觉| 长癣是什么原因引起的| 儿童吃什么钙片补钙效果好| 吃席是什么意思| 尿频尿急用什么药| 唐老鸭叫什么名字| 打脚是什么意思| 吃鱼眼睛有什么好处| 看腋下挂什么科| 前囟门什么时候闭合| 胃镜能检查出什么| 沙土地适合种什么农作物| 膝关节痛挂什么科| 红细胞压积偏低是什么意思| 三点水加四读什么| 肌酸是什么东西| 高压高是什么原因| 甲状腺激素是什么| 妍什么意思| 巴字加一笔是什么字| 梦见很多小蛇是什么意思| 杨过是什么生肖| 一个山一个见读什么| 百度

北京东城·河北正定文艺交流座谈在正定县举办

百度 中方根据世贸组织《保障措施协定》有关规定,制定了中止减让清单。

为了更好定制自定义组件的功能,可以使用自定义组件扩展机制。从小程序基础库版本 2.2.3 开始支持。

# 扩展后的效果

为了更好的理解扩展后的效果,先举一个例子:

在开发者工具中预览效果

// 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
  }
})

通过例子可以发现,自定义组件的扩展其实就是提供了修改自定义组件定义段的能力,上述例子就是修改了自定义组件中的 data 定义段里的内容。

# 使用扩展

Behavior() 构造器提供了新的定义段 definitionFilter ,用于支持自定义组件扩展。 definitionFilter 是一个函数,在被调用时会注入两个参数,第一个参数是使用该 behavior 的 component/behavior 的定义对象,第二个参数是该 behavior 所使用的 behavior 的 definitionFilter 函数列表。

以下举个例子来说明:

// behavior3.js
module.exports = Behavior({
    definitionFilter(defFields, definitionFilterArr) {},
})

// behavior2.js
module.exports = Behavior({
  behaviors: [require('behavior3.js')],
  definitionFilter(defFields, definitionFilterArr) {
    // definitionFilterArr[0](defFields)
  },
})

// behavior1.js
module.exports = Behavior({
  behaviors: [require('behavior2.js')],
  definitionFilter(defFields, definitionFilterArr) {},
})

// component.js
Component({
  behaviors: [require('behavior1.js')],
})

上述代码中声明了1个自定义组件和3个 behavior,每个 behavior 都使用了 definitionFilter 定义段。那么按照声明的顺序会有如下事情发生:

  1. 当进行 behavior2 的声明时就会调用 behavior3 的 definitionFilter 函数,其中 defFields 参数是 behavior2 的定义段, definitionFilterArr 参数即为空数组,因为 behavior3 没有使用其他的 behavior 。
  2. 当进行 behavior1 的声明时就会调用 behavior2 的 definitionFilter 函数,其中 defFields 参数是 behavior1 的定义段, definitionFilterArr 参数是一个长度为1的数组,definitionFilterArr[0] 即为 behavior3 的 definitionFilter 函数,因为 behavior2 使用了 behavior3。用户在此处可以自行决定在进行 behavior1 的声明时要不要调用 behavior3 的 definitionFilter 函数,如果需要调用,在此处补充代码 definitionFilterArr[0](defFields) 即可,definitionFilterArr 参数会由基础库补充传入。
  3. 同理,在进行 component 的声明时就会调用 behavior1 的 definitionFilter 函数。

简单概括,definitionFilter 函数可以理解为当 A 使用了 B 时,A 声明就会调用 B 的 definitionFilter 函数并传入 A 的定义对象让 B 去过滤。此时如果 B 还使用了 C 和 D ,那么 B 可以自行决定要不要调用 C 和 D 的 definitionFilter 函数去过滤 A 的定义对象。

代码示例:

在开发者工具中预览效果

# 真实案例

下面利用扩展简单实现自定义组件的计算属性功能:

// behavior.js
module.exports = Behavior({
  lifetimes: {
    created() {
      this._originalSetData = this.setData // 原始 setData
      this.setData = this._setData // 封装后的 setData
    }
  },
  definitionFilter(defFields) {
    const computed = defFields.computed || {}
    const computedKeys = Object.keys(computed)
    const computedCache = {}

    // 计算 computed
    const calcComputed = (scope, insertToData) => {
      const needUpdate = {}
      const data = defFields.data = defFields.data || {}

      for (let key of computedKeys) {
        const value = computed[key].call(scope) // 计算新值
        if (computedCache[key] !== value) needUpdate[key] = computedCache[key] = value
        if (insertToData) data[key] = needUpdate[key] // 直接插入到 data 中,初始化时才需要的操作
      }

      return needUpdate
    }

    // 重写 setData 方法
    defFields.methods = defFields.methods || {}
    defFields.methods._setData = function (data, callback) {
      const originalSetData = this._originalSetData // 原始 setData
      originalSetData.call(this, data, callback) // 做 data 的 setData
      const needUpdate = calcComputed(this) // 计算 computed
      originalSetData.call(this, needUpdate) // 做 computed 的 setData
    }

    // 初始化 computed
    calcComputed(defFields, true) // 计算 computed
  }
})

在组件中使用:

const beh = require('./behavior.js')
Component({
  behaviors: [beh],
  data: {
    a: 0,
  },
  computed: {
    b() {
      return this.data.a + 100
    },
  },
  methods: {
    onTap() {
      this.setData({
        a: ++this.data.a,
      })
    }
  }
})
<view>data: {{a}}</view>
<view>computed: {{b}}</view>
<button bindtap="onTap">click</button>

实现原理很简单,对已有的 setData 进行二次封装,在每次 setData 的时候计算出 computed 里各字段的值,然后设到 data 中,以达到计算属性的效果。

此实现只是作为一个简单案例来展示,请勿直接在生产环境中使用。

# 官方扩展包

早餐吃什么不会胖 肚脐眼左右两边疼是什么原因 政协副主席是什么级别 晋升是什么意思 什么叫留守儿童
杜仲是什么 小灶是什么意思 一什么床 什么草药能治痔疮 7岁属什么
举案齐眉是什么意思 血小板平均体积偏高是什么意思 苹果不能和什么一起吃 筷子掉地上是什么征兆 嘴贱什么意思
拉肚子可以吃什么水果 包干费用是什么意思 怀孕嗜睡什么时候开始 药剂师是做什么的 黄芪和什么搭配最好
为什么做爱那么舒服96micro.com 支原体吃什么药好得快weuuu.com 十指不沾阳春水是什么意思hcv7jop7ns3r.cn 右下腹痛挂什么科hcv8jop2ns4r.cn 甘是什么意思hcv8jop3ns1r.cn
cpc什么意思hcv9jop0ns4r.cn 菜籽油是什么油hcv8jop6ns1r.cn 胚根发育成什么hcv8jop7ns2r.cn 气血不足补什么sanhestory.com 香茅是什么东西hcv8jop9ns8r.cn
心绞痛吃什么药缓解最快hcv7jop5ns3r.cn 捡和拣有什么区别hcv8jop2ns5r.cn 股票里xd是什么意思hcv8jop6ns3r.cn 免是什么意思hcv7jop9ns8r.cn 21三体综合征是指什么hcv8jop1ns7r.cn
吃什么能降血压hcv8jop2ns7r.cn 午餐吃什么好又能减肥hcv8jop5ns8r.cn 闭关什么意思hcv9jop0ns1r.cn 6.17什么星座sscsqa.com 三月份什么星座hcv8jop6ns0r.cn
百度