微信小程序
组件数据解析
# 组件数据解析
在组件一章我们知道需要有一个解析器将xml
中组件对应属性的字符串转换为组件需要的数据类型,对此,框架提供了一套机制来处理。
# 数据解析器
数据解析器IDataValueHandler
就是用来将属性字符串转换成特定类型的数据的,其具体定义如下:
interface IDataValueHandler<TDataValue> {
create(value: string, defaultValue: any, scene: Scene): TDataValue;
}
可见主要是一个create
方法,其接受一个字符串的value
,一个组件schema
中定义的默认值defaultValue
和场景引用scene
,返回解析后的值。一般我们会如此注册一个解析器:
registerDataValue('number', {create: (value: string, defaultValue: any, scene: Scene) => {
return value === undefined ? defaultValue : parseFloat(value));
}});
这里注册了number
类型的解析器,可以看到如果没有传入值则返回默认值,否则用parseFloat
转换。
除了registerDataValue
方式注册的数据类型外,还有一类特殊类型的数据,它们就是资源。
# 特殊类型-资源
资源数据和number
这样的普通数据有些不同,其注册一般不使用registerDataValue
,而是在registerAssetLoader
时定义的。如何定义可以参考资源加载器的内容,一般来讲资源数据使用时填写的值都是资源ID,比如你要使用纹理资源:
<xr-asset-load type="texture" asset-id="waifu" src="/assets/textures/waifu.jpg" />
<xr-asset-material asset-id="simple-mat" uniforms="u_baseColorMap: waifu" />
我们先加载了一张id为waifu
的纹理,然后在下面材质的uniform的u_baseColorMap
属性使用了它。
资源类型的数据在schema
中描述时,默认值是资源的id
。
注意资源类型的数据还会影响到组件的onAdd
和onUpdate
生命周期,框架会在每一次资源数据更新后,先等待引用的资源加载完成,才会进入这两个生命周期。
# 内置数据类型
框架内置了一些数据类型:
# 非资源数据
# 资源数据
资源数据可见内置的各种资源:效果,图片,纹理,材质,几何数据,模型,渲染目标,帧动画。