mergeprops.js 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. export const normalMerge = ['attrs', 'props', 'domProps', 'scopedSlots'];
  2. export const toArrayMerge = ['class', 'style', 'directives'];
  3. export const functionalMerge = ['on', 'nativeOn'];
  4. const mergeProps = (objects, initial = {}, opt = {}) => {
  5. const _normalMerge = [...normalMerge, ...opt['normal'] || []];
  6. const _toArrayMerge = [...toArrayMerge, ...opt['array'] || []];
  7. const _functionalMerge = [...functionalMerge, ...opt['functional'] || []];
  8. const propsMerge = opt['props'] || [];
  9. return objects.reduce((a, b) => {
  10. for (const key in b) {
  11. if (a[key]) {
  12. if (propsMerge.indexOf(key) > -1) {
  13. a[key] = mergeProps([b[key]], a[key]);
  14. } else if (_normalMerge.indexOf(key) > -1) {
  15. a[key] = {...a[key], ...b[key]}
  16. } else if (_toArrayMerge.indexOf(key) > -1) {
  17. const arrA = a[key] instanceof Array ? a[key] : [a[key]];
  18. const arrB = b[key] instanceof Array ? b[key] : [b[key]];
  19. a[key] = [...arrA, ...arrB]
  20. } else if (_functionalMerge.indexOf(key) > -1) {
  21. for (const event in b[key]) {
  22. if (a[key][event]) {
  23. const arrA = a[key][event] instanceof Array ? a[key][event] : [a[key][event]];
  24. const arrB = b[key][event] instanceof Array ? b[key][event] : [b[key][event]];
  25. a[key][event] = [...arrA, ...arrB]
  26. } else {
  27. a[key][event] = b[key][event]
  28. }
  29. }
  30. } else if (key === 'hook') {
  31. for (let hook in b[key]) {
  32. if (a[key][hook]) {
  33. a[key][hook] = mergeFn(a[key][hook], b[key][hook])
  34. } else {
  35. a[key][hook] = b[key][hook]
  36. }
  37. }
  38. } else {
  39. a[key] = b[key]
  40. }
  41. } else {
  42. if (_normalMerge.indexOf(key) > -1 || _functionalMerge.indexOf(key) > -1 || propsMerge.indexOf(key) > -1) {
  43. a[key] = {...b[key]}
  44. } else if (_toArrayMerge.indexOf(key) > -1) {
  45. a[key] = b[key] instanceof Array ? [...b[key]] : (typeof b[key] === 'object' ? {...b[key]} : b[key]);
  46. } else
  47. a[key] = b[key];
  48. }
  49. }
  50. return a
  51. }, initial);
  52. }
  53. const mergeFn = (fn1, fn2) =>
  54. function () {
  55. fn1 && fn1.apply(this, arguments);
  56. fn2 && fn2.apply(this, arguments);
  57. };
  58. export default mergeProps;