使用dva中的subscriptions
dva - subscription
=======
Subscriptions 是一种从 源 获取数据的方法,它来自于 elm。
Subscription 语义是订阅,用于订阅一个数据源,然后根据条件 dispatch 需要的 action。
数据源可以是当前的时间、服务器的 websocket 连接、keyboard 输入、geolocation 变化、history 路由变化等等。
监听history
setup({ dispatch, history }) {
history.listen((location) => {
const match = pathToRegexp('/map/machineMapInProject/:id').exec(location.pathname);
if (match) {
const id = match[1];
dispatch({
type: 'updateStateProps',
payload: {
name: 'listParams',
value: { project: id },
},
});
}
});
},
监听key事件
import key from 'keymaster';
...
app.model({
namespace: 'count',
subscriptions: {
keyEvent(dispatch) {
key('⌘+up, ctrl+up', () => { dispatch({type:'add'}) });
},
}
});
相关源码片段
/packages/dva-core/src/subscription.js
export function run(subs, model, app, onError) {
const funcs = [];
const nonFuncs = [];
for (const key in subs) {
if (Object.prototype.hasOwnProperty.call(subs, key)) {
const sub = subs[key];
const unlistener = sub({
dispatch: prefixedDispatch(app._store.dispatch, model),
history: app._history,
}, onError);
if (isFunction(unlistener)) {
funcs.push(unlistener);
} else {
nonFuncs.push(key);
}
}
}
return { funcs, nonFuncs };
}
subscription的方法签名为({dispatch, history}, onError)。
参考文章:http://le0zh.github.io/2017/09/25/dva-model-subscriptions/