关键词:
一、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月微信小程序-页面生命周期(代码片段)
一、页面生命周期1.JS使用注册小程序中的一个页面。接受一个Object类型参数,其指定页面的初始数据、生命周期回调、事件处理函数等。小程序页面的生命周期函数如下:属性类型说明dataObject页面的初始数据optionsObject页面的组... 查看详情
#yyds干货盘点#愚公系列2022年10月微信小程序-数据绑定(代码片段)
前言1.小程序页面结构微信小程序的页面结构主要是分别由四个文件组成:js(逻辑处理文件):负责页面逻辑内容的处理,遵循js语言框架。json(配置文件):用来设置页面的窗口内容,遵循JSON语法规范。wxml(页面结构文件或视图... 查看详情
#yyds干货盘点#愚公系列2022年10月微信小程序-循环的使用(代码片段)
一、列表渲染1.wx:for的item和index在组件上使用wx:for控制属性绑定一个数组,即可使用数组中各项的数据重复渲染该组件。默认数组的当前项的下标变量名默认为index,数组当前项的变量名默认为item<viewwx:for="array">index:i... 查看详情
#yyds干货盘点#愚公系列2022年10月微信小程序-场景值(代码片段)
前言场景值就是进入该小程序的来源,就是用户是通过什么途径点进的小程序。通过app中的onLaunch或onShow方法中可以获取到场景值。比如获取到的场景值是1005,表示用户是通过微信顶部的搜索框搜索到的该小程序。通过这个场景... 查看详情
#yyds干货盘点#愚公系列2022年10月微信小程序-应用生命周期和全局变量(代码片段)
前言从软件的角度来看,生命周期指程序从创建、到开始、暂停、唤起、停止、卸载的过程。微信小程序的生命周期:应用生命周期页面生命周期一、应用生命周期1.JS配置App(//生命周期回调——监听小程序初始化onLaunch(options) co... 查看详情
#yyds干货盘点#愚公系列2022年10月微信小程序-全局配置属性之入口页面(代码片段)
前言一、entryPagePath1.入口文件的配置指定小程序的默认启动路径(首页),常见情景是从微信聊天列表页下拉启动、小程序列表启动等。如果不填,将默认为pages列表的第一项。不支持带页面路径参数。"entryPagePath":"pa... 查看详情
#yyds干货盘点#愚公系列2022年10月微信小程序-sitemap站内搜索(代码片段)
前言1.sitemap.json介绍开发者可以通过sitemap.json配置,或者管理后台页面收录开关来配置其小程序页面是否允许微信索引。2.小程序爬虫特征当开发者允许微信索引时,微信会通过爬虫的形式,为小程序的页面内容建立索引。当用... 查看详情
#yyds干货盘点#愚公系列2022年10月微信小程序-全局配置属性之其他属性(代码片段)
一、resizable在iPad上运行的小程序可以设置支持屏幕旋转,在PC上运行的小程序,用户可以按照任意比例拖动窗口大小,也可以在小程序菜单中最大化窗口。app.json配置如下; resizable:true二、usingComponents在app.json中声明的自定义组... 查看详情
#yyds干货盘点#愚公系列2022年11月微信小程序-引用(代码片段)
前言1.模板的引入方式WXML提供两种文件引用方式import和includeimport:导入模板并没有真正的使用include:直接引入页面元素,已经使用了2.模板和组件的比较template(模板):是可以在wxml中引用的代码,就是在wxml中引用公用的wxml类... 查看详情
#yyds干货盘点#愚公系列2022年10月微信小程序-全局配置属性之worker(代码片段)
一、app.json配置属性之Worker我们知道js是单线程的,在有时候需要处理一些密集计算或者是高延迟的时候,总会出现不便。而且,现在的cpu都是多核的,单线程也无法充分发挥电脑的计算能力。正是基于这种情况,才有了worker的... 查看详情
#yyds干货盘点#愚公系列2022年11月微信小程序-导航(跳转)(代码片段)
前言1.navigatornavigator是页面跳转的标签,具体参数如下:属性类型默认值必填说明最低版本targetstringself否在哪个目标上发生跳转,默认当前小程序2.0.7urlstring否当前小程序内的跳转链接1.0.0open-typestringnavigate否跳转方式1.0.0deltanumbe... 查看详情
#yyds干货盘点#愚公系列2022年12月微信小程序-下拉刷新功能实现(代码片段)
前言下拉刷新是移动端的专有名词,是指通过手指在屏幕上的下拉滑动操作,从而重新加载页面数据的行为。一、下拉刷新功能实现1.自定义下拉刷新<wxsmodule="refresh">varpullingMessage="下拉刷新"module.exports= onRefres... 查看详情
#yyds干货盘点#愚公系列2022年11月微信小程序-导航(功能页)(代码片段)
前言functional-page-navigator组件:是一个非常强大的组件,用于跳转插件的功能页,主要的参数如下:属性类型默认值必填说明最低版本versionstringrelease否跳转到的小程序版本,线上版本必须设置为release2.1.0namestring否要跳转到的功... 查看详情
#yyds干货盘点#愚公系列2022年11月微信小程序-地图的使用之点聚合(代码片段)
前言地图基础属性:属性类型默认值必填说明最低版本longitudenumber是中心经度1.0.0latitudenumber是中心纬度1.0.0scalenumber16否缩放级别,取值范围为3-201.0.0min-scalenumber3否最小缩放级别2.13.0max-scalenumber20否最大缩放级别2.13.0markersArray.<... 查看详情
#yyds干货盘点#愚公系列2022年12月微信小程序-webgl纹理材质的使用(代码片段)
前言在现实中webgl的用途很多,比如医院运维网站,地铁运维网站,海绵城市,可以以三维网页形式展示出现实状态。WebGL相关文档:http://doc.yonyoucloud.com/doc/wiki/project/webgl/webgL-fundamentals.html一、webgl的使用安装第三方包:npmi--savet... 查看详情
#yyds干货盘点#愚公系列2022年09月微信小程序-webgl画正方形(代码片段)
前言在现实中webgl的用途很多,比如医院运维网站,地铁运维网站,海绵城市,可以以三维网页形式展示出现实状态。WebGL相关文档:http://doc.yonyoucloud.com/doc/wiki/project/webgl/webgL-fundamentals.html一、webgl的使用安装第三方包:npmi--savet... 查看详情
#yyds干货盘点#愚公系列2022年12月微信小程序-webgl立体图形的绘制(代码片段)
前言在现实中webgl的用途很多,比如医院运维网站,地铁运维网站,海绵城市,可以以三维网页形式展示出现实状态。WebGL相关文档:http://doc.yonyoucloud.com/doc/wiki/project/webgl/webgL-fundamentals.html一、webgl的使用安装第三方包:npmi--savet... 查看详情
#yyds干货盘点#愚公系列2022年11月微信小程序-flex布局详解(代码片段)
一、Flex布局详解1.Flex布局的概念1.1传统布局盒子模型:我们知道当并列书写多个div标签,它们会纵向向下排位,如果我们想将多个div并列成一排,就得借助position,float,或display属性,这便是传统的盒模型做法。CSS盒模型本质上... 查看详情