UNPKG

ola-toolkit

Version:

ola 开发工具套件

116 lines (92 loc) 2.93 kB
# wait 阻塞式路由装饰器 ### 为什么使用 wait 在 SPA 架构中,UI 骨架会先于数据被加载,当路由切换后,往往会出现一段时间的空白界面,或者在空白界面上浮现一些 loading 效果,随着数据被装载,页面重新被渲染,视觉上才重新被填充, 这个流程大致如下:   ![before](http://storage.360buyimg.com/ola-ui/img/ui.ola.jd.com/wait-old.svg)   wait 装饰器可以以非常简单的方式,对这个流程进行优化,优化后的流程大致如下:   ![after](http://storage.360buyimg.com/ola-ui/img/ui.ola.jd.com/wait-optimize.svg)   这个流程大体上模拟了浏览器原生页面切换效果,这样的效果避免了单页应用路由切换后、数据装载前的空页面视觉,和空页面到数据装载后的大面积视觉跳动, 同时,还能在前进、后退时保持住上一个浏览的位置,它被多数用户体验良好的站点采用, 例如 [Youtube](https://youtube.com) 与 [Github](https://github.com)。 @wait 作用于页面容器组件 (pages/) 通过 @wait 直接发起请求: ```javascript import {Ajax, wait} from 'ola-toolkit'; @wait([{ prop: 'asyncList', * effect({match: {params: {page = 1}}}, {call}) { const payload = yield call(Ajax.get, { url: '//mytask.jd.com/api/task/taskHall', params: { species: 0, status: 0, page, } }); return payload; } }]) export default class WaitPage extends Component {...} ``` 通过 @wait 派发 action ```javascript import {Ajax, wait} from 'ola-toolkit'; @wait([{ prop: 'asyncList', * effect({match: {params: {page = 1}}}, {call, put}) { try { const payload = yield call(Ajax.get, { url: '//mytask.jd.com/api/task/taskHall', params: { species: 0, status: 0, page, } }); yield put({ subject: 'asyncList', act: 'success', payload, }); } catch (e) { yield put({ subject: 'asyncList', act: 'fail', payload: e, }); } } }]) export default class WaitPage extends Component {...} ``` 或者使用 promise: ```javascript import {Ajax, wait} from 'ola-toolkit'; @wait([{ prop: 'asyncList', promise: ({match: {params: {page = 1}}}) => { return Ajax.get({ url: '//mytask.jd.com/api/task/taskHall', params: { species: 0, status: 0, page, } }); } }]) export default class WaitPage extends Component {...} ``` ## API @wait(\[config\]) ### config | key | 说明 | 类型 | 返回值 | | --- | --- | --- | --- | | prop | 注入到 prop 的 key | string | boolean | | effect | 使用 effect 获取数据 | generatorFunction(props, sagaEffects) | saga | | promise | 使用 promise 获取数据, 若配置了 effect, 则该项不生效 | function(props) | promise |