查看“小程序:渲染层和逻辑层”的源代码
←
小程序:渲染层和逻辑层
跳转至:
导航
,
搜索
因为以下原因,您没有权限编辑本页:
您所请求的操作仅限于该用户组的用户使用:
用户
您可以查看与复制此页面的源代码。
小程序的运行环境分成渲染层和逻辑层,第2章提到过 WXML 模板和 WXSS 样式工作在渲染层,JS 脚本工作在逻辑层。小程序的渲染层和逻辑层分离是经过很多考虑得出来的模型,在第6章我们会详细阐述这个模型背后的原理以及产生的问题。在本章我们会先介绍这个模型的基本工作方式。 ==渲染“Hello World”页面== 我们看看小程序是如何把脚本里边的数据渲染在界面上的。 WXML模板使用 view 标签,其子节点用 {{ }} 的语法绑定一个 msg 的变量,如代码清单3-1所示。 代码清单3-1 渲染“Hello World”WXML代码 <nowiki><view>{{ msg }}</view></nowiki> 在 JS 脚本使用 this.setData 方法把 msg 字段设置成 “Hello World” ,如代码清单3-2所示。 代码清单3-2 渲染“Hello World”JS脚本 <nowiki>Page({ onLoad: function () { this.setData({ msg: 'Hello World' }) } })</nowiki> 从这个例子我们可以看到3个点: 1.渲染层和数据相关。 2.逻辑层负责产生、处理数据。 3.逻辑层通过 Page 实例的 setData 方法传递数据到渲染层。 关于第1点,涉及了“数据驱动”的概念,我们会在3.1.3节详细讨论,我们现在先看看第3点涉及的“通信模型”。 ==通信模型== 小程序的渲染层和逻辑层分别由2个线程管理:渲染层的界面使用了WebView 进行渲染;逻辑层采用JsCore线程运行JS脚本。一个小程序存在多个界面,所以渲染层存在多个WebView线程,这两个线程的通信会经由微信客户端(下文中也会采用Native来代指微信客户端)做中转,逻辑层发送网络请求也经由Native转发,小程序的通信模型如图3-1所示。 [[文件:Wx1-39.png|600px]] ==数据驱动== 在开发UI界面过程中,程序需要维护很多变量状态,同时要操作对应的UI元素。随着界面越来越复杂,我们需要维护很多变量状态,同时要处理很多界面上的交互事件,整个程序变得越来越复杂。通常界面视图和变量状态是相关联的,如果有某种“方法”可以让状态和视图绑定在一起(状态变更时,视图也能自动变更),那我们就可以省去手动修改视图的工作。 这个方法就是“数据驱动”,下边我们来介绍一下小程序的数据驱动基本原理。 WXML结构实际上等价于一棵Dom树,通过一个JS对象也可以来表达Dom树的结构,如图3-2所示。 [[文件:wx3-1.png|600px]] WXML可以先转成JS对象,然后再渲染出真正的Dom树,回到“Hello World”那个例子,我们可以看到转换的过程如图3-3所示。 [[文件:wx3-2.png|600px]] 通过setData把msg数据从“Hello World”变成“Goodbye”,产生的JS对象对应的节点就会发生变化,此时可以对比前后两个JS对象得到变化的部分,然后把这个差异应用到原来的Dom树上,从而达到更新UI的目的,这就是“数据驱动”的原理,如图3-4所示。 [[文件:wx3-3.png|600px]] ==双线程下的界面渲染== 小程序的逻辑层和渲染层是分开的两个线程。在渲染层,宿主环境会把WXML转化成对应的JS对象,在逻辑层发生数据变更的时候,我们需要通过宿主环境提供的setData方法把数据从逻辑层传递到渲染层,再经过对比前后差异,把差异应用在原来的Dom树上,渲染出正确的UI界面,如图3-5所示。 [[文件:wx3-4.png|600px]]
返回至
小程序:渲染层和逻辑层
。
导航菜单
个人工具
登录
命名空间
页面
讨论
变种
视图
阅读
查看源代码
查看历史
更多
搜索
导航
首页
最近更改
随机页面
帮助
工具
链入页面
相关更改
特殊页面
页面信息