From c749f0522bbda4fa5ca2c0032d2079e493efaa0a Mon Sep 17 00:00:00 2001 From: mertsincan Date: Mon, 29 Jan 2024 12:35:09 +0000 Subject: [PATCH] Fixed #4707 - PassThought new merging strategy --- components/lib/basecomponent/BaseComponent.vue | 7 +++++-- components/lib/basedirective/BaseDirective.js | 7 +++++-- components/lib/passthrough/index.d.ts | 4 +++- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/components/lib/basecomponent/BaseComponent.vue b/components/lib/basecomponent/BaseComponent.vue index fa3b2267e..7b0cb4b90 100644 --- a/components/lib/basecomponent/BaseComponent.vue +++ b/components/lib/basecomponent/BaseComponent.vue @@ -82,6 +82,9 @@ export default { defaultHook?.(); } }, + _mergeProps(fn, ...args) { + return ObjectUtils.isFunction(fn) ? fn(...args) : mergeProps(...args); + }, _loadGlobalStyles() { /* * @todo Add self custom css support; @@ -124,7 +127,7 @@ export default { [`${datasetPrefix}section`]: ObjectUtils.toFlatCase(key) }; - return mergeSections || (!mergeSections && self) ? (useMergeProps ? mergeProps(global, self, datasets) : { ...global, ...self, ...datasets }) : { ...self, ...datasets }; + return mergeSections || (!mergeSections && self) ? (useMergeProps ? this._mergeProps(useMergeProps, global, self, datasets) : { ...global, ...self, ...datasets }) : { ...self, ...datasets }; }, _getPTClassValue(...args) { const value = this._getOptionValue(...args); @@ -160,7 +163,7 @@ export default { else if (ObjectUtils.isString(value)) return value; else if (ObjectUtils.isString(originalValue)) return originalValue; - return mergeSections || (!mergeSections && value) ? (useMergeProps ? mergeProps(originalValue, value) : { ...originalValue, ...value }) : value; + return mergeSections || (!mergeSections && value) ? (useMergeProps ? this._mergeProps(useMergeProps, originalValue, value) : { ...originalValue, ...value }) : value; } return fn(pt); diff --git a/components/lib/basedirective/BaseDirective.js b/components/lib/basedirective/BaseDirective.js index 43dbbf0b4..27b43cdba 100644 --- a/components/lib/basedirective/BaseDirective.js +++ b/components/lib/basedirective/BaseDirective.js @@ -31,7 +31,7 @@ const BaseDirective = { [`${datasetPrefix}section`]: ObjectUtils.toFlatCase(key) }; - return mergeSections || (!mergeSections && self) ? (useMergeProps ? mergeProps(global, self, datasets) : { ...global, ...self, ...datasets }) : { ...self, ...datasets }; + return mergeSections || (!mergeSections && self) ? (useMergeProps ? BaseDirective._mergeProps(instance, useMergeProps, global, self, datasets) : { ...global, ...self, ...datasets }) : { ...self, ...datasets }; }, _getPT: (pt, key = '', callback) => { const getValue = (value) => { @@ -61,7 +61,7 @@ const BaseDirective = { else if (ObjectUtils.isString(value)) return value; else if (ObjectUtils.isString(originalValue)) return originalValue; - return mergeSections || (!mergeSections && value) ? (useMergeProps ? mergeProps(originalValue, value) : { ...originalValue, ...value }) : value; + return mergeSections || (!mergeSections && value) ? (useMergeProps ? BaseDirective._mergeProps(instance, useMergeProps, originalValue, value) : { ...originalValue, ...value }) : value; } return fn(pt); @@ -80,6 +80,9 @@ const BaseDirective = { selfHook?.(instance, options); defaultHook?.(instance, options); }, + _mergeProps(instance = {}, fn, ...args) { + return ObjectUtils.isFunction(fn) ? fn(...args) : mergeProps(...args); + }, _extend: (name, options = {}) => { const handleHook = (hook, el, binding, vnode, prevVnode) => { el._$instances = el._$instances || {}; diff --git a/components/lib/passthrough/index.d.ts b/components/lib/passthrough/index.d.ts index 04ad096c1..65c26f050 100644 --- a/components/lib/passthrough/index.d.ts +++ b/components/lib/passthrough/index.d.ts @@ -1,6 +1,8 @@ +export declare type PassThroughMergePropsType = ((...args: any) => object | undefined) | boolean | undefined; + export interface PassThroughOptions { mergeSections?: boolean | undefined; - mergeProps?: boolean | undefined; + mergeProps?: PassThroughMergePropsType; } export declare function usePassThrough(pt1: object, pt2: object, options?: PassThroughOptions): object;