diff --git a/packages/uni-app-plus/dist/uni-app-view.umd.js b/packages/uni-app-plus/dist/uni-app-view.umd.js index b625875d359b82419b2dd4554517a70c6121a112..086b4d2d54f231c4594bc88f54eb9557eb68cc77 100644 --- a/packages/uni-app-plus/dist/uni-app-view.umd.js +++ b/packages/uni-app-plus/dist/uni-app-view.umd.js @@ -18217,10 +18217,14 @@ updatesScroller(); }; { + var isMounted = false; useRebuild(() => { state.length = contentRef.value.children.length; - initIndicatorHeight(); - initScroller(); + if (!isMounted) { + isMounted = true; + initIndicatorHeight(); + initScroller(); + } }); } return () => { @@ -21161,6 +21165,10 @@ queuePostActionJob(this.getRebuildFn(), JOB_PRIORITY_REBUILD); return super.insertBefore(newChild, refChild); } + removeUniChild(node) { + queuePostActionJob(this.getRebuildFn(), JOB_PRIORITY_REBUILD); + return super.removeUniChild(node); + } rebuild() { var vm = this.$.__vueParentComponent; if (vm.rebuild) { diff --git a/packages/uni-app-plus/src/view/framework/dom/components/UniComponent.ts b/packages/uni-app-plus/src/view/framework/dom/components/UniComponent.ts index c268aaa89bbc98850b5115345105b332c0b8a68f..9020e5a3b4bd44066c3b609f392f6b63be7d7e3d 100644 --- a/packages/uni-app-plus/src/view/framework/dom/components/UniComponent.ts +++ b/packages/uni-app-plus/src/view/framework/dom/components/UniComponent.ts @@ -192,6 +192,10 @@ export class UniContainerComponent extends UniComponent { queuePostActionJob(this.getRebuildFn(), JOB_PRIORITY_REBUILD) return super.insertBefore(newChild, refChild) } + removeUniChild(node: UniNode) { + queuePostActionJob(this.getRebuildFn(), JOB_PRIORITY_REBUILD) + return super.removeUniChild(node) + } rebuild() { // 刷新容器组件状态 if (__DEV__) { diff --git a/packages/uni-components/src/vue/picker-view-column/index.tsx b/packages/uni-components/src/vue/picker-view-column/index.tsx index 932c462dddc2ce367a6ea227c7f836559f211af6..4abb5de65c880edf1dc5f00d22d60bd4655d5988 100644 --- a/packages/uni-components/src/vue/picker-view-column/index.tsx +++ b/packages/uni-components/src/vue/picker-view-column/index.tsx @@ -251,11 +251,15 @@ export default /*#__PURE__*/ defineBuiltInComponent({ } if (__PLATFORM__ === 'app') { + let isMounted: boolean = false useRebuild(() => { state.length = (contentRef.value as HTMLElement).children.length - // 由于 App 端 onMounted 时机未插入真实位置,需重新执行 - initIndicatorHeight() - initScroller() + if (!isMounted) { + isMounted = true + // 由于 App 端 onMounted 时机未插入真实位置,需重新执行 + initIndicatorHeight() + initScroller() + } }) } diff --git a/packages/uni-mp-qq/dist/uni.compiler.js b/packages/uni-mp-qq/dist/uni.compiler.js index 325af45bd3f67e2e5ba65d4fda3e5ea56e39be4f..9a2dec93a60758f53cc4f46166422292aba4da2f 100644 --- a/packages/uni-mp-qq/dist/uni.compiler.js +++ b/packages/uni-mp-qq/dist/uni.compiler.js @@ -139,6 +139,13 @@ const options = { filename: 'project.config.json', config: ['project.qq.json', 'project.config.json'], source, + normalize(projectJson) { + projectJson.qqappid = projectJson.appid; + projectJson.qqLibVersion = projectJson.libVersion; + delete projectJson.appid; + delete projectJson.libVersion; + return projectJson; + }, }, template: Object.assign(Object.assign({}, miniProgram), { filter: { extname: '.qs', diff --git a/packages/uni-mp-qq/src/compiler/options.ts b/packages/uni-mp-qq/src/compiler/options.ts index f51f7b1622e599bb3d01fad2e2378a0425352875..f6314b705e518b001235336c3bb9fccac71f93c8 100644 --- a/packages/uni-mp-qq/src/compiler/options.ts +++ b/packages/uni-mp-qq/src/compiler/options.ts @@ -71,6 +71,13 @@ export const options: UniMiniProgramPluginOptions = { filename: 'project.config.json', config: ['project.qq.json', 'project.config.json'], source, + normalize(projectJson) { + projectJson.qqappid = projectJson.appid + projectJson.qqLibVersion = projectJson.libVersion + delete projectJson.appid + delete projectJson.libVersion + return projectJson + }, }, template: { /* eslint-disable no-restricted-syntax */ diff --git a/packages/uni-mp-vite/src/plugin/index.ts b/packages/uni-mp-vite/src/plugin/index.ts index e771f0661171386577cbb5def8b74d7cf66af6e0..9a4fdf156fc9fd2910a709e06840f255de9dcdf1 100644 --- a/packages/uni-mp-vite/src/plugin/index.ts +++ b/packages/uni-mp-vite/src/plugin/index.ts @@ -63,6 +63,9 @@ export interface UniMiniProgramPluginOptions { filename: string config: string[] source: Record + normalize?: ( + projectJson: Record + ) => Record } template: { extname: string diff --git a/packages/uni-mp-vite/src/plugins/manifestJson.ts b/packages/uni-mp-vite/src/plugins/manifestJson.ts index f870a5260183fb56e500b52a972f54300281aaa7..44fe31ec51230436f6f3756ff8ce995c94139652 100644 --- a/packages/uni-mp-vite/src/plugins/manifestJson.ts +++ b/packages/uni-mp-vite/src/plugins/manifestJson.ts @@ -86,10 +86,15 @@ export function uniManifestJsonPlugin( }, generateBundle() { if (projectJson && options.project) { + const { filename, normalize } = options.project this.emitFile({ - fileName: options.project.filename, + fileName: filename, type: 'asset', - source: JSON.stringify(projectJson, null, 2), + source: JSON.stringify( + normalize ? normalize(projectJson) : projectJson, + null, + 2 + ), }) } }, diff --git a/packages/uni-mp-vue/dist/vue.runtime.esm.js b/packages/uni-mp-vue/dist/vue.runtime.esm.js index c85d96a032cec1137f8cb59c80e61a96ef8567f9..8fac8c22b692d91baf7b0a53b18f8bf9e8711af4 100644 --- a/packages/uni-mp-vue/dist/vue.runtime.esm.js +++ b/packages/uni-mp-vue/dist/vue.runtime.esm.js @@ -1,4 +1,4 @@ -import { extend, isSymbol, isObject, toRawType, def, hasChanged, isArray, isString, isFunction, isPromise, remove, EMPTY_OBJ, toHandlerKey, hasOwn, camelize, hyphenate, isReservedProp, capitalize, normalizeClass, normalizeStyle, isOn, NOOP, toTypeString, isMap, isIntegerKey, isSet, isPlainObject, makeMap, invokeArrayFns, isBuiltInDirective, NO, toNumber, EMPTY_ARR, stringifyStyle as stringifyStyle$1, toDisplayString } from '@vue/shared'; +import { extend, isSymbol, isObject, toRawType, def, hasChanged, isArray, isString, isFunction, isPromise, remove, EMPTY_OBJ, toHandlerKey, hasOwn, camelize, hyphenate, isReservedProp, capitalize, normalizeClass, normalizeStyle, isOn, NOOP, toTypeString, isMap, isIntegerKey, isSet, isPlainObject, makeMap, invokeArrayFns, isBuiltInDirective, NO, toNumber, EMPTY_ARR, isModelListener, stringifyStyle as stringifyStyle$1, toDisplayString } from '@vue/shared'; export { EMPTY_OBJ, camelize, normalizeClass, normalizeProps, normalizeStyle, toDisplayString, toHandlerKey } from '@vue/shared'; import { isRootHook, getValueByDataPath, ON_ERROR, UniLifecycleHooks, dynamicSlotName } from '@dcloudio/uni-shared'; @@ -4857,7 +4857,7 @@ const getFunctionalFallthrough = (attrs) => { return res; }; function renderComponentRoot(instance) { - const { type: Component, vnode, proxy, withProxy, props, slots, attrs, emit, render, renderCache, data, setupState, ctx, uid, appContext: { app: { config: { globalProperties: { pruneComponentPropsCache } } } } } = instance; + const { type: Component, vnode, proxy, withProxy, props, propsOptions: [propsOptions], slots, attrs, emit, render, renderCache, data, setupState, ctx, uid, appContext: { app: { config: { globalProperties: { pruneComponentPropsCache } } } }, inheritAttrs } = instance; instance.$templateRefs = []; instance.$ei = 0; // props @@ -4868,20 +4868,20 @@ function renderComponentRoot(instance) { const prev = setCurrentRenderingInstance(instance); try { if (vnode.shapeFlag & 4 /* STATEFUL_COMPONENT */) { + fallthroughAttrs(inheritAttrs, props, propsOptions, attrs); // withProxy is a proxy with a different `has` trap only for // runtime-compiled render functions using `with` block. const proxyToUse = withProxy || proxy; result = render.call(proxyToUse, proxyToUse, renderCache, props, setupState, data, ctx); } else { + fallthroughAttrs(inheritAttrs, props, propsOptions, Component.props ? attrs : getFunctionalFallthrough(attrs)); // functional const render = Component; result = render.length > 1 ? render(props, { attrs, slots, emit }) - : render(props, null /* we know it doesn't need it */) - ? attrs - : getFunctionalFallthrough(attrs); + : render(props, null /* we know it doesn't need it */); } } catch (err) { @@ -4892,6 +4892,24 @@ function renderComponentRoot(instance) { setCurrentRenderingInstance(prev); return result; } +function fallthroughAttrs(inheritAttrs, props, propsOptions, fallthroughAttrs) { + if (props && fallthroughAttrs && inheritAttrs !== false) { + const keys = Object.keys(fallthroughAttrs).filter(key => key !== 'class' && key !== 'style'); + if (!keys.length) { + return; + } + if (propsOptions && keys.some(isModelListener)) { + keys.forEach(key => { + if (!isModelListener(key) || !(key.slice(9) in propsOptions)) { + props[key] = fallthroughAttrs[key]; + } + }); + } + else { + keys.forEach(key => (props[key] = fallthroughAttrs[key])); + } + } +} const updateComponentPreRender = (instance) => { pauseTracking(); // props update may have triggered pre-flush watchers. diff --git a/packages/uni-mp-vue/lib/vue.runtime.esm.js b/packages/uni-mp-vue/lib/vue.runtime.esm.js index fe148d18e7c28bae75f2014a265eb561a88db321..ce2349c24a90543ebe880be5a3c48f945a094eaa 100644 --- a/packages/uni-mp-vue/lib/vue.runtime.esm.js +++ b/packages/uni-mp-vue/lib/vue.runtime.esm.js @@ -1,4 +1,4 @@ -import { extend, isArray, isMap, isIntegerKey, isSymbol, hasOwn, isObject, hasChanged, makeMap, capitalize, toRawType, def, isFunction, NOOP, isString, isPromise, isOn, hyphenate, EMPTY_OBJ, toHandlerKey, toNumber, camelize, remove, isSet, isPlainObject, isReservedProp, EMPTY_ARR, isBuiltInDirective, NO, normalizeClass, normalizeStyle, toTypeString, invokeArrayFns } from '@vue/shared'; +import { extend, isArray, isMap, isIntegerKey, isSymbol, hasOwn, isObject, hasChanged, makeMap, capitalize, toRawType, def, isFunction, NOOP, isString, isPromise, isOn, hyphenate, EMPTY_OBJ, toHandlerKey, toNumber, camelize, remove, isSet, isPlainObject, isReservedProp, EMPTY_ARR, isBuiltInDirective, NO, normalizeClass, normalizeStyle, toTypeString, invokeArrayFns, isModelListener } from '@vue/shared'; export { EMPTY_OBJ, camelize, normalizeClass, normalizeProps, normalizeStyle, toDisplayString, toHandlerKey } from '@vue/shared'; import { isRootHook, getValueByDataPath } from '@dcloudio/uni-shared'; @@ -4857,7 +4857,7 @@ const getFunctionalFallthrough = (attrs) => { return res; }; function renderComponentRoot(instance) { - const { type: Component, vnode, proxy, withProxy, props, slots, attrs, emit, render, renderCache, data, setupState, ctx, uid, appContext: { app: { config: { globalProperties: { pruneComponentPropsCache } } } } } = instance; + const { type: Component, vnode, proxy, withProxy, props, propsOptions: [propsOptions], slots, attrs, emit, render, renderCache, data, setupState, ctx, uid, appContext: { app: { config: { globalProperties: { pruneComponentPropsCache } } } }, inheritAttrs } = instance; instance.$templateRefs = []; instance.$ei = 0; // props @@ -4868,20 +4868,20 @@ function renderComponentRoot(instance) { const prev = setCurrentRenderingInstance(instance); try { if (vnode.shapeFlag & 4 /* STATEFUL_COMPONENT */) { + fallthroughAttrs(inheritAttrs, props, propsOptions, attrs); // withProxy is a proxy with a different `has` trap only for // runtime-compiled render functions using `with` block. const proxyToUse = withProxy || proxy; result = render.call(proxyToUse, proxyToUse, renderCache, props, setupState, data, ctx); } else { + fallthroughAttrs(inheritAttrs, props, propsOptions, Component.props ? attrs : getFunctionalFallthrough(attrs)); // functional const render = Component; result = render.length > 1 ? render(props, { attrs, slots, emit }) - : render(props, null /* we know it doesn't need it */) - ? attrs - : getFunctionalFallthrough(attrs); + : render(props, null /* we know it doesn't need it */); } } catch (err) { @@ -4892,6 +4892,24 @@ function renderComponentRoot(instance) { setCurrentRenderingInstance(prev); return result; } +function fallthroughAttrs(inheritAttrs, props, propsOptions, fallthroughAttrs) { + if (props && fallthroughAttrs && inheritAttrs !== false) { + const keys = Object.keys(fallthroughAttrs).filter(key => key !== 'class' && key !== 'style'); + if (!keys.length) { + return; + } + if (propsOptions && keys.some(isModelListener)) { + keys.forEach(key => { + if (!isModelListener(key) || !(key.slice(9) in propsOptions)) { + props[key] = fallthroughAttrs[key]; + } + }); + } + else { + keys.forEach(key => (props[key] = fallthroughAttrs[key])); + } + } +} const updateComponentPreRender = (instance) => { pauseTracking(); // props update may have triggered pre-flush watchers.