helper.js 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. // 从事件对象中解析得到 componentId
  2. // 需要在元素上声明 data-component-id
  3. function extractComponentId(event = {}) {
  4. const { dataset: { componentId } } = event.currentTarget || {};
  5. return componentId;
  6. }
  7. /*
  8. 注:默认合并所有生命周期函数
  9. 配置合并指定的生命周期 or 忽略指定字段
  10. const extend = extendCreator({
  11. life: ['onLoad', 'onPullDownRefresh'],
  12. exclude: ['binder']
  13. });
  14. Page(extend({}, {
  15. onLoad() {},
  16. ...
  17. }));
  18. */
  19. const LIFE_CYCLE = ['onLoad', 'onReady', 'onShow', 'onHide', 'onUnload', 'onPullDownRefresh', 'onReachBottom', 'onShareAppMessage', 'onPageScroll'];
  20. const extendCreator = (config = {}) => {
  21. const {
  22. life = LIFE_CYCLE,
  23. exclude = []
  24. } = config;
  25. const excludeList = exclude.concat(LIFE_CYCLE.map(getFuncArrayName));
  26. if (!Array.isArray(life) || !Array.isArray(exclude)) throw new Error('Invalid Extend Config');
  27. let lifeCycleList = life.filter(item => LIFE_CYCLE.indexOf(item) >= 0);
  28. return function extend(target, ...objList) {
  29. objList.forEach((source) => {
  30. if (source) {
  31. let keys = Object.keys(source);
  32. keys.forEach((key) => {
  33. let value = source[key];
  34. if (excludeList.indexOf(key) >= 0) return;
  35. if (lifeCycleList.indexOf(key) >= 0 && typeof value === 'function') {
  36. let funcArrayName = getFuncArrayName(key);
  37. if (!target[funcArrayName]) {
  38. target[funcArrayName] = [];
  39. if (target[key]) {
  40. target[funcArrayName].push(target[key]);
  41. }
  42. target[key] = function (...rest) {
  43. target[funcArrayName].forEach(func => func.apply(this, rest));
  44. };
  45. }
  46. if (source[funcArrayName]) {
  47. // 经过生命周期合并的组件直接整合函数列表
  48. target[funcArrayName].push(...source[funcArrayName]);
  49. } else {
  50. // 添加生命周期函数进入函数列表
  51. target[funcArrayName].push(value);
  52. }
  53. } else {
  54. target[key] = value;
  55. }
  56. });
  57. }
  58. });
  59. return target;
  60. };
  61. };
  62. const getFuncArrayName = name => `__$${name}`;
  63. module.exports = {
  64. extractComponentId,
  65. extend: Object.assign,
  66. extendCreator
  67. };