模板
Taro3 通过把 DOM 树的数据进行 setData
,从而驱动模板(<template>
)拼接来渲染出视图。
因此开发者可以看到编译后的代码中,页面模板文件的内容很简单,只是引用了公共模板 base.xml
,所有组件的模板都在此文件中进行声明。
我们可以创建一个模板类,控制 base
模板的编译结果。
#
递归与非递归模板我们把模板相关的处理逻辑封装成了基类。分别是给支持模板递归的小程序继承的 RecursiveTemplate
类,和给不支持模板递归的小程序继承的 UnRecursiveTemplate
类。
#
可递归模板支持模板递归的小程序中,同一个模板能够不断调用自身,包括支付宝、头条、百度小程序。
view_0
引用 container_0
,container_0
能再引用 view_0
:
#
非递归模板不支持模板递归的小程序中,引用过的模板不能再调用自身,包括微信、QQ、京东小程序。
view_0
引用 container_0
,container_0
不能再引用 view_0
,只能引用新的 view
模板 view_1
:
#
模板基类#
this.Adapterobject
平台的模板语法关键词。
例子:
#
this.isSupportRecursiveboolean
只读,是否支持模板递归。
#
this.supportXSboolean
默认值:false
是否支持渲染层脚本,如微信小程序的 wxs,支付宝小程序的 sjs。
#
this.exportExprstring
默认值:'module.exports ='
渲染层脚本的导出命令。
例子:
#
this.internalComponentsobject
Taro 内置组件列表,包括了相对通用的组件及其部分通用属性。
#
this.focusComponentsSet<string>
可以设置 focus 聚焦的组件。
默认值:
#
this.voidElementsSet<string>
不需要渲染子节点的元素。配置后这些组件不会渲染子节点,能够减少模板体积。
默认值:
#
this.nestElementsMap<string, number>
对于一个小程序来说,只有部分组件有可能递归调用自身。如 <Map>
组件不会再调用 <Map>
,而 <View>
则可以不断递归调用 <View>
。
如果此小程序不支持递归,我们又把 <Map>
模板循环渲染了 N 次,那么小程序体积就会变大,而这些循环出来的模板又是不必要的。因此使用了 nestElements
去标记那些可能递归调用的组件。
但考虑到例如 <Form>
这些组件即使可能递归调用,但也不会递归调用太多次。因此在 nestElements
中可以对它的循环渲染次数进行控制,假设 <Form>
不会递归调用超过 N 次,进一步减少模板体积。
默认值:
key
值为可以递归调用自身的组件。
value
值代表递归生成此组件的次数,-1 代表循环 baseLevel 层。
#
replacePropName (name, value, componentName)代替组件的属性名。
参数 | 类型 | 说明 |
---|---|---|
name | string | 属性名 |
value | string | 属性值 |
componetName | string | 组件名 |
例子:
#
buildXsTemplate ()支持渲染层脚本的小程序,Taro 会生成一个 utils 脚本在根目录。此时需要声明此函数以设置 base 模板中对 utils 脚本的引用语法。
例子:
#
modifyLoopBody (child, nodeName)修改组件模板的子节点循环体。
参数 | 类型 | 说明 |
---|---|---|
child | string | 组件模板的子节点循环体 |
nodeName | string | 组件名 |
没有在 this.voidElements 中声明过的组件,会遍历子节点进行渲染。
这些组件的模板通用格式为:
例子:
#
modifyLoopContainer (children, nodeName)修改组件模板的子节点循环。
参数 | 类型 | 说明 |
---|---|---|
children | string | 组件模板的子节点循环 |
nodeName | string | 组件名 |
例子:
#
modifyTemplateResult (res, nodeName, level, children)修改组件模板的最终结果。
参数 | 类型 | 说明 |
---|---|---|
res | string | 组件模板的结果 |
nodeName | string | 组件名 |
level | string | 循环层级 |
children | string | 组件模板的子节点循环 |
例子:
#
getAttrValue (value, key, nodeName)设置组件的属性绑定语法。
参数 | 类型 | 说明 |
---|---|---|
value | string | 属性值 |
key | string | 属性名 |
nodeName | string | 组件名 |
例子:
#
例子#
头条小程序模板头条小程序支持模板递归,所以继承
RecursiveTemplate
基类。因为不需要调整模板内容,所以只用设置
supportXS
和Adapter
属性即可。
#
微信小程序模板- 微信小程序不支持模板递归,所以继承
UnRecursiveTemplate
基类。 - 设置
supportXS
和Adapter
属性。 - 因为微信小程序支持渲染层脚本
wxs
,所以通过buildXsTemplate
设置 base 模板中对 utils 脚本的引用语法。 - 利用
replacePropName
修改了组件绑定的属性名。