From 9c066a9c9bfdc34f5b813b5c6b5ff397db953b16 Mon Sep 17 00:00:00 2001 From: fxy060608 Date: Mon, 21 Feb 2022 20:45:37 +0800 Subject: [PATCH] fix(mp): pass props to plugin components (#3257) --- .../uni-cli-shared/src/json/mp/jsonFile.ts | 41 ++++++++++++------- .../__tests__/component.spec.ts | 7 ++-- packages/uni-mp-compiler/src/transform.ts | 4 +- .../src/transforms/transformComponent.ts | 4 ++ 4 files changed, 36 insertions(+), 20 deletions(-) diff --git a/packages/uni-cli-shared/src/json/mp/jsonFile.ts b/packages/uni-cli-shared/src/json/mp/jsonFile.ts index e9cc34f87..a532e83e2 100644 --- a/packages/uni-cli-shared/src/json/mp/jsonFile.ts +++ b/packages/uni-cli-shared/src/json/mp/jsonFile.ts @@ -127,7 +127,11 @@ export function isMiniProgramUsingComponent( componentsDir?: string } ) { - return findMiniProgramUsingComponents(options).includes(name) + return !!findMiniProgramUsingComponents(options)[name] +} + +interface MiniProgramComponents { + [name: string]: 'plugin' | 'component' } export function findMiniProgramUsingComponents({ @@ -138,15 +142,13 @@ export function findMiniProgramUsingComponents({ filename: string inputDir: string componentsDir?: string -}) { - if (!componentsDir) { - return [] - } +}): MiniProgramComponents { const globalUsingComponents = appJsonCache && appJsonCache.usingComponents - const miniProgramComponents: string[] = [] + const miniProgramComponents: MiniProgramComponents = {} if (globalUsingComponents) { - miniProgramComponents.push( - ...findMiniProgramUsingComponent(globalUsingComponents, componentsDir) + extend( + miniProgramComponents, + findMiniProgramUsingComponent(globalUsingComponents, componentsDir) ) } @@ -154,8 +156,9 @@ export function findMiniProgramUsingComponents({ removeExt(normalizeMiniProgramFilename(filename, inputDir)) ) if (jsonFile?.usingComponents) { - miniProgramComponents.push( - ...findMiniProgramUsingComponent(jsonFile.usingComponents, componentsDir) + extend( + miniProgramComponents, + findMiniProgramUsingComponent(jsonFile.usingComponents, componentsDir) ) } return miniProgramComponents @@ -163,10 +166,18 @@ export function findMiniProgramUsingComponents({ function findMiniProgramUsingComponent( usingComponents: Record, - componentsDir: string + componentsDir?: string ) { - return Object.keys(usingComponents).filter((name) => { - const path = usingComponents[name] - return path.includes(componentsDir + '/') - }) + return Object.keys(usingComponents).reduce( + (res, name) => { + const path = usingComponents[name] + if (componentsDir && path.includes(componentsDir + '/')) { + res[name] = 'component' + } else if (path.includes('plugin://')) { + res[name] = 'plugin' + } + return res + }, + {} + ) } diff --git a/packages/uni-mp-compiler/__tests__/component.spec.ts b/packages/uni-mp-compiler/__tests__/component.spec.ts index 642bf44ba..69091bd35 100644 --- a/packages/uni-mp-compiler/__tests__/component.spec.ts +++ b/packages/uni-mp-compiler/__tests__/component.spec.ts @@ -120,13 +120,14 @@ describe('compiler: transform component', () => { addMiniProgramPageJson(filename, { usingComponents: { 'van-button': 'wxcomponents/button/index', + wxparser: 'plugin://wxparserPlugin/wxparser', }, }) assert( - ``, - ``, + ``, + ``, `(_ctx, _cache) => { - return { a: _p({ customStyle: 'background-color: unset;', closeOnClickOverlay: true }) } + return { a: _ctx.richText, b: _p({ customStyle: 'background-color: unset;', closeOnClickOverlay: true }) } }`, { filename, diff --git a/packages/uni-mp-compiler/src/transform.ts b/packages/uni-mp-compiler/src/transform.ts index f6d8bb8ac..a62800f8c 100644 --- a/packages/uni-mp-compiler/src/transform.ts +++ b/packages/uni-mp-compiler/src/transform.ts @@ -123,7 +123,7 @@ export interface TransformContext addVIfScope(initScope: CodegenVIfScopeInit): CodegenVIfScope addVForScope(initScope: CodegenVForScopeInit): CodegenVForScope cache(exp: T, isVNode?: boolean): CacheExpression | T - isMiniProgramComponent(name: string): boolean + isMiniProgramComponent(name: string): 'plugin' | 'component' | undefined } export function isRootScope(scope: CodegenScope): scope is CodegenRootScope { @@ -474,7 +474,7 @@ export function createTransformContext( return createCacheExpression(context.cached++, exp, isVNode) }, isMiniProgramComponent(name) { - return miniProgramComponents.includes(name) + return miniProgramComponents[name] }, } diff --git a/packages/uni-mp-compiler/src/transforms/transformComponent.ts b/packages/uni-mp-compiler/src/transforms/transformComponent.ts index ec713aded..a3cefbb73 100644 --- a/packages/uni-mp-compiler/src/transforms/transformComponent.ts +++ b/packages/uni-mp-compiler/src/transforms/transformComponent.ts @@ -149,6 +149,10 @@ export function rewriteBinding( context: TransformContext ) { const isMiniProgramComponent = context.isMiniProgramComponent(tag) + if (isMiniProgramComponent === 'plugin') { + // 因无法介入插件类型组件内部实现,故保留原始属性 + return + } const createObjectProperty = isMiniProgramComponent ? (name: string, value: Expression) => -- GitLab