支付宝小程序 分析
参考:支付宝小程序开发官方文档
支付宝小程序有哪些核心数据结构(构造函数和实例)
1 App() 支付宝小程序顶层应用,管理所有页面和全局数据,以及提供生命周期回调等
2 Page() 支付宝小程序页面构造函数,用于注册页面(新建页面实例)
3 Component() 支付宝小程序自定义扩展组件构造函数,用于新建自定义组件实例
4 my SDK对象,支付宝小程序SDK,支付宝小程序框架提供给开发者更多的 JSAPI 和 OpenAPI,使得开发者通过小程序可为用户提供多样化便捷服务

App
代表顶层应用,管理所有页面和全局数据,以及提供生命周期回调等。它也是一个构造方法,生成 App 实例。
app.json:应用配置 app.json 为小程序应用级别配置,设置页面文件的路径、窗口表现、网络超时时间、多 tab 等。
app.js:应用逻辑 app.js 用于注册小程序(实例化小程序对象),接受一个 Object 作为属性,用来配置小程序的生命周期等。
app.acss:应用样式(可选)app.acss 公共样式,作用域为全局,会影响所有页面和组件,但优先级最低。

Page
Page 代表应用的一个页面,负责页面展示和交互。每个页面对应一个子目录,一般有多少个页面,就有多少个子目录。它也是一个构造函数,用来生成页面实例
[pageName].js:页面逻辑 .js 文件中,定义 Page(),用于注册一个小程序页面(实例Page对象),接受一个 object 作为属性,用来指定页面的初始数据、生命周期回调、事件处理等。
[pageName].axml:页面结构 .axml 文件用于定义当前这个页面的结构。文件内容遵循 AXML 语法。和 HTML 非常相似
[pageName].acss:页面样式(可选)目录中的 .acss 文件用于定义页面样式。作用域为当前页面,不会影响全局样式
[pageName].json:页面配置(可选) .json 文件用于配置当前页面的窗口表现。只是扩展app.json 中的window 配置,优先级高于app.json 中 window 字段配置

Component
自定义组件功能可将需要复用的功能模块抽象成自定义组件
[componentName].axml 组件结构,类似HTML
[componentName].js 组件逻辑,和Page类似,但写法完全不一样,更倾向于vue组件写法。用于注册组件(实例Component组件),指定组件的初始数据、生命周期回调、事件处理等。
[componentName].json 中声明自定义组件。或者引入其他自定义组件,只有两个字段配置:component、usingComponents
[componentName].acss 组件样式,作用域为当前组件,不会影响全局

my
支付宝小程序myApi
SDK对象,支付宝小程序SDK,提供了更多的小程序API, 可以直接使用,不需要引入,也不需要实例化。
使用方式直接查看官方文档
评价总结
结构设计有点混乱,如果遵循,一切皆为组件,是否会优雅很多。App、Page、Component 皆为组件,都需要提供axml、js、json、acss 文件,注册组件使用Component 构造函数。
这样再回过去看Page 构造函数,提供的参数中,没有methods 对象,所有方法、data、生命周期都在对象一级下的字段,设计就没有组件设计的优雅。考虑到支付宝小程序开始时就没有组件,组件是在 1.7.0 版本才提供的功能,可以理解,支付宝小程序设计也在不断的更新。
这样设计的缺点就导致了,各个层级间(app、page、component)通信不一致,注册实例写法不一致,各个层级提供的生命周期一致(app不一致可以理解,但page和component设计不一致就说不过去了),数据绑定、修改数据方式一致。
app 和 page 间的通信
app -> page 在page中通过全局方法获取app中的数据 getApp().globalData ,并改变它 getApp().globalData++
app <- page 在page中通过全局方法获取app中的数据,并改变它 getApp().globalData++
page 和 page 间的通信
跳转page url 中添加参数
my.navigateTo({url:'/page/ui/index?type=mini'});
在page onLoad 生命周期函数的参数 query 中读取 参数
onLoad(query) {
console.log(query.type)
}
page 和 component 间的通信
page -> component 属性传递:父组件 componentData="{{item}}" 子组件 props: { componentData: {} }
page <- component 事件传递:父组件 onChooseCity="chooseCity" 子组件 this.props.onChooseCity(data);
或者使用 ref 获取组件实例进行通信
component 和 component 间父子组件间的通信
参考 page 和 component 间的通信
或者使用 ref 获取组件实例进行通信
app 和 component 间的通信
app -> component 在component通过全局方法获取app中的数据,并改变它 getApp().globalData++
app <- component 无