#yyds干货盘点#愚公系列2022年10月 微信小程序-Component组件的扩展

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#yyds干货盘点#愚公系列2022年10月 微信小程序-Component组件的扩展相关的知识,希望对你有一定的参考价值。

一、Component组件的扩展

// 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)],
)

三、案例解析

// 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 中,以达到计算属性的效果。

以上是关于#yyds干货盘点#愚公系列2022年10月 微信小程序-Component组件的扩展的主要内容,如果未能解决你的问题,请参考以下文章

#yyds干货盘点#愚公系列2022年10月 微信小程序-页面生命周期

#yyds干货盘点#愚公系列2022年10月 微信小程序-数据绑定

#yyds干货盘点#愚公系列2022年10月 微信小程序-场景值

#yyds干货盘点#愚公系列2022年10月 微信小程序-循环的使用

#yyds干货盘点#愚公系列2022年10月 微信小程序-全局配置属性之入口页面

#yyds干货盘点#愚公系列2022年10月 微信小程序-应用生命周期和全局变量