| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- export const normalMerge = ['attrs', 'props', 'domProps', 'scopedSlots'];
- export const toArrayMerge = ['class', 'style', 'directives'];
- export const functionalMerge = ['on', 'nativeOn'];
- const mergeProps = (objects, initial = {}, opt = {}) => {
- const _normalMerge = [...normalMerge, ...opt['normal'] || []];
- const _toArrayMerge = [...toArrayMerge, ...opt['array'] || []];
- const _functionalMerge = [...functionalMerge, ...opt['functional'] || []];
- const propsMerge = opt['props'] || [];
- return objects.reduce((a, b) => {
- for (const key in b) {
- if (a[key]) {
- if (propsMerge.indexOf(key) > -1) {
- a[key] = mergeProps([b[key]], a[key]);
- } else if (_normalMerge.indexOf(key) > -1) {
- a[key] = {...a[key], ...b[key]}
- } else if (_toArrayMerge.indexOf(key) > -1) {
- const arrA = a[key] instanceof Array ? a[key] : [a[key]];
- const arrB = b[key] instanceof Array ? b[key] : [b[key]];
- a[key] = [...arrA, ...arrB]
- } else if (_functionalMerge.indexOf(key) > -1) {
- for (const event in b[key]) {
- if (a[key][event]) {
- const arrA = a[key][event] instanceof Array ? a[key][event] : [a[key][event]];
- const arrB = b[key][event] instanceof Array ? b[key][event] : [b[key][event]];
- a[key][event] = [...arrA, ...arrB]
- } else {
- a[key][event] = b[key][event]
- }
- }
- } else if (key === 'hook') {
- for (let hook in b[key]) {
- if (a[key][hook]) {
- a[key][hook] = mergeFn(a[key][hook], b[key][hook])
- } else {
- a[key][hook] = b[key][hook]
- }
- }
- } else {
- a[key] = b[key]
- }
- } else {
- if (_normalMerge.indexOf(key) > -1 || _functionalMerge.indexOf(key) > -1 || propsMerge.indexOf(key) > -1) {
- a[key] = {...b[key]}
- } else if (_toArrayMerge.indexOf(key) > -1) {
- a[key] = b[key] instanceof Array ? [...b[key]] : (typeof b[key] === 'object' ? {...b[key]} : b[key]);
- } else
- a[key] = b[key];
- }
- }
- return a
- }, initial);
- }
- const mergeFn = (fn1, fn2) =>
- function () {
- fn1 && fn1.apply(this, arguments);
- fn2 && fn2.apply(this, arguments);
- };
- export default mergeProps;
|