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

fix(mp): renderComponentRoot #2917

上级 34b8ef50
......@@ -2561,7 +2561,7 @@ function resolveAsset(type, name, warnMissing = true, maybeSelfReference = false
// local registration
// check instance[type] first which is resolved for options API
resolve(instance[type] || Component[type], name) ||
// window registration
// global registration
resolve(instance.appContext[type], name);
if (!res && maybeSelfReference) {
// fallback to implicit self-reference
......@@ -3048,7 +3048,7 @@ const PublicInstanceProxyHandlers = {
return ctx[key];
}
else if (
// window properties
// global properties
((globalProperties = appContext.config.globalProperties),
hasOwn(globalProperties, key))) {
{
......@@ -3392,6 +3392,11 @@ let compile;
const isRuntimeOnly = () => !compile;
function finishComponentSetup(instance, isSSR, skipOptions) {
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
if (__VUE_OPTIONS_API__ && !(false )) {
setCurrentInstance(instance);
......@@ -4670,10 +4675,48 @@ function mountComponent(initialVNode, options) {
}
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) {
const componentUpdateFn = () => {
if (!instance.isMounted) {
instance.render && instance.render.call(instance.proxy);
renderComponentRoot(instance);
patch(instance);
}
else {
......@@ -4686,6 +4729,7 @@ function setupRenderEffect(instance) {
invokeArrayFns(bu);
}
effect.allowRecurse = true;
renderComponentRoot(instance);
patch(instance);
// updated hook
if (u) {
......@@ -4925,11 +4969,21 @@ function initApp(app) {
var plugin = {
install(app) {
initApp(app);
// TODO 旧编译器使用了$createElement 导致告警
app.config.globalProperties.$createElement = () => { };
const oldMount = app.mount;
app.mount = function mount(rootContainer) {
const instance = oldMount.call(app, rootContainer);
// @ts-ignore
createMiniProgramApp(instance);
if (global.createApp) {
global.createApp(instance);
}
else {
// @ts-ignore 旧编译器
if (typeof createMiniProgramApp !== 'undefined') {
// @ts-ignore
createMiniProgramApp(instance);
}
}
return instance;
};
},
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册