提交 5ba40e9e 编写于 作者: fxy060608's avatar fxy060608

fix(mp): renderComponentRoot #2917

上级 34b8ef50
...@@ -2561,7 +2561,7 @@ function resolveAsset(type, name, warnMissing = true, maybeSelfReference = false ...@@ -2561,7 +2561,7 @@ function resolveAsset(type, name, warnMissing = true, maybeSelfReference = false
// local registration // local registration
// check instance[type] first which is resolved for options API // check instance[type] first which is resolved for options API
resolve(instance[type] || Component[type], name) || resolve(instance[type] || Component[type], name) ||
// window registration // global registration
resolve(instance.appContext[type], name); resolve(instance.appContext[type], name);
if (!res && maybeSelfReference) { if (!res && maybeSelfReference) {
// fallback to implicit self-reference // fallback to implicit self-reference
...@@ -3048,7 +3048,7 @@ const PublicInstanceProxyHandlers = { ...@@ -3048,7 +3048,7 @@ const PublicInstanceProxyHandlers = {
return ctx[key]; return ctx[key];
} }
else if ( else if (
// window properties // global properties
((globalProperties = appContext.config.globalProperties), ((globalProperties = appContext.config.globalProperties),
hasOwn(globalProperties, key))) { hasOwn(globalProperties, key))) {
{ {
...@@ -3392,6 +3392,11 @@ let compile; ...@@ -3392,6 +3392,11 @@ let compile;
const isRuntimeOnly = () => !compile; const isRuntimeOnly = () => !compile;
function finishComponentSetup(instance, isSSR, skipOptions) { function finishComponentSetup(instance, isSSR, skipOptions) {
const Component = instance.type; const Component = instance.type;
// template / render function normalization
// could be already set when returned from setup()
if (!instance.render) {
instance.render = (Component.render || NOOP);
}
// support for 2.x options // support for 2.x options
if (__VUE_OPTIONS_API__ && !(false )) { if (__VUE_OPTIONS_API__ && !(false )) {
setCurrentInstance(instance); setCurrentInstance(instance);
...@@ -4670,10 +4675,48 @@ function mountComponent(initialVNode, options) { ...@@ -4670,10 +4675,48 @@ function mountComponent(initialVNode, options) {
} }
return instance.proxy; return instance.proxy;
} }
const getFunctionalFallthrough = (attrs) => {
let res;
for (const key in attrs) {
if (key === 'class' || key === 'style' || isOn(key)) {
(res || (res = {}))[key] = attrs[key];
}
}
return res;
};
function renderComponentRoot(instance) {
const { type: Component, vnode, proxy, withProxy, props, slots, attrs, emit, render, renderCache, data, setupState, ctx } = instance;
let result;
const prev = setCurrentRenderingInstance(instance);
try {
if (vnode.shapeFlag & 4 /* STATEFUL_COMPONENT */) {
// 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 {
// 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);
}
}
catch (err) {
handleError(err, instance, 1 /* RENDER_FUNCTION */);
result = false;
}
setCurrentRenderingInstance(prev);
return result;
}
function setupRenderEffect(instance) { function setupRenderEffect(instance) {
const componentUpdateFn = () => { const componentUpdateFn = () => {
if (!instance.isMounted) { if (!instance.isMounted) {
instance.render && instance.render.call(instance.proxy); renderComponentRoot(instance);
patch(instance); patch(instance);
} }
else { else {
...@@ -4686,6 +4729,7 @@ function setupRenderEffect(instance) { ...@@ -4686,6 +4729,7 @@ function setupRenderEffect(instance) {
invokeArrayFns(bu); invokeArrayFns(bu);
} }
effect.allowRecurse = true; effect.allowRecurse = true;
renderComponentRoot(instance);
patch(instance); patch(instance);
// updated hook // updated hook
if (u) { if (u) {
...@@ -4925,11 +4969,21 @@ function initApp(app) { ...@@ -4925,11 +4969,21 @@ function initApp(app) {
var plugin = { var plugin = {
install(app) { install(app) {
initApp(app); initApp(app);
// TODO 旧编译器使用了$createElement 导致告警
app.config.globalProperties.$createElement = () => { };
const oldMount = app.mount; const oldMount = app.mount;
app.mount = function mount(rootContainer) { app.mount = function mount(rootContainer) {
const instance = oldMount.call(app, rootContainer); const instance = oldMount.call(app, rootContainer);
// @ts-ignore if (global.createApp) {
createMiniProgramApp(instance); global.createApp(instance);
}
else {
// @ts-ignore 旧编译器
if (typeof createMiniProgramApp !== 'undefined') {
// @ts-ignore
createMiniProgramApp(instance);
}
}
return instance; return instance;
}; };
}, },
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册