[REF] component: refactor fiber creation methods

This commit is contained in:
Géry Debongnie
2019-09-20 11:08:16 +02:00
parent 7a49b9d94e
commit caa63628dc
4 changed files with 14 additions and 28 deletions
+9 -22
View File
@@ -293,7 +293,7 @@ export class Component<T extends Env, Props extends {}, State extends {}> {
if (__owl__.isMounted) { if (__owl__.isMounted) {
return; return;
} }
const fiber = this.__createRootFiber(false); const fiber = this.__createFiber(false, undefined, undefined, undefined);
if (!__owl__.vnode) { if (!__owl__.vnode) {
fiber.promise = this.__prepareAndRender(fiber); fiber.promise = this.__prepareAndRender(fiber);
const vnode = await fiber.promise; const vnode = await fiber.promise;
@@ -340,7 +340,7 @@ export class Component<T extends Env, Props extends {}, State extends {}> {
if (!__owl__.isMounted) { if (!__owl__.isMounted) {
return; return;
} }
const fiber = this.__createRootFiber(force); const fiber = this.__createFiber(force, undefined, undefined, undefined);
fiber.patchQueue.push(fiber); fiber.patchQueue.push(fiber);
fiber.promise = this.__render(fiber); fiber.promise = this.__render(fiber);
await fiber.promise; await fiber.promise;
@@ -352,38 +352,25 @@ export class Component<T extends Env, Props extends {}, State extends {}> {
} }
} }
__createRootFiber(force): Fiber<Props> { __createFiber(force, scope, vars, parent?: Fiber<any>): Fiber<Props> {
const fiber: Fiber<Props> = { const fiber: Fiber<Props> = {
force, force,
scope: undefined, scope,
vars: undefined, vars,
rootFiber: null, rootFiber: null,
isCancelled: false, isCancelled: false,
component: this, component: this,
vnode: null, vnode: null,
patchQueue: [], patchQueue: parent ? parent.patchQueue : [],
willPatchResult: null, willPatchResult: null,
props: this.props, props: this.props,
promise: null promise: null
}; };
fiber.rootFiber = fiber; fiber.rootFiber = parent || fiber;
this.__owl__.currentFiber = fiber; this.__owl__.currentFiber = fiber;
return fiber; return fiber;
} }
__createSubFiber(parent: Fiber<Props>, scope, vars): Fiber<Props> {
const fiber = Object.create(parent);
fiber.scope = scope;
fiber.vars = vars;
fiber.component = this;
fiber.vnode = null;
fiber.willPatchResult = null;
this.__owl__.currentFiber = fiber;
fiber.props = this.props;
fiber.promise = null;
return fiber;
}
/** /**
* Destroy the component. This operation is quite complex: * Destroy the component. This operation is quite complex:
* - it recursively destroy all children * - it recursively destroy all children
@@ -537,7 +524,7 @@ export class Component<T extends Env, Props extends {}, State extends {}> {
} }
await this.willUpdateProps(nextProps); await this.willUpdateProps(nextProps);
this.props = nextProps; this.props = nextProps;
const fiber = this.__createSubFiber(parentFiber, scope, vars); const fiber = this.__createFiber(parentFiber.force, scope, vars, parentFiber);
fiber.patchQueue.push(fiber); fiber.patchQueue.push(fiber);
await this.__render(fiber); await this.__render(fiber);
@@ -560,7 +547,7 @@ export class Component<T extends Env, Props extends {}, State extends {}> {
* parent template. * parent template.
*/ */
__prepare(parentFiber: Fiber<any>, scope: any, vars: any): Promise<VNode> { __prepare(parentFiber: Fiber<any>, scope: any, vars: any): Promise<VNode> {
const fiber = this.__createSubFiber(parentFiber, scope, vars); const fiber = this.__createFiber(parentFiber.force, scope, vars, parentFiber);
fiber.promise = this.__prepareAndRender(fiber); fiber.promise = this.__prepareAndRender(fiber);
return fiber.promise; return fiber.promise;
} }
+2 -3
View File
@@ -1,4 +1,5 @@
import { Component, Env, Fiber } from "../component/component"; import { Component, Env, Fiber } from "../component/component";
import { VNode } from "../vdom/index";
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// Connect function // Connect function
@@ -46,9 +47,7 @@ export class ConnectedComponent<T extends Env, P, S> extends Component<T, P, S>
/** /**
* Need to do this here so 'deep' can be overrided by subcomponent easily * Need to do this here so 'deep' can be overrided by subcomponent easily
*/ */
async __prepareAndRender( async __prepareAndRender(fiber: Fiber<P>): Promise<VNode> {
fiber: Fiber
): ReturnType<Component<any, any, any>["__prepareAndRender"]> {
const store = this.getStore(this.env); const store = this.getStore(this.env);
const ownProps = this.props || {}; const ownProps = this.props || {};
this.storeProps = (<any>this.constructor).mapStoreToProps(store.state, ownProps, store.getters); this.storeProps = (<any>this.constructor).mapStoreToProps(store.state, ownProps, store.getters);
+1 -1
View File
@@ -334,7 +334,7 @@ describe("default props", () => {
const w = new TestWidget(env, { p: 1 }); const w = new TestWidget(env, { p: 1 });
await w.mount(fixture); await w.mount(fixture);
expect(fixture.innerHTML).toMatchSnapshot(); expect(fixture.innerHTML).toMatchSnapshot();
const fiber = w.__createRootFiber(false); const fiber = w.__createFiber(false, undefined, undefined, undefined);
await w.__updateProps({}, fiber); await w.__updateProps({}, fiber);
await w.render(); await w.render();
expect(w.props.p).toBe(4); expect(w.props.p).toBe(4);
+2 -2
View File
@@ -910,7 +910,7 @@ describe("connected components and default values", () => {
await app.mount(fixture); await app.mount(fixture);
expect(fixture.innerHTML).toBe("<div><div>Hello, John</div></div>"); expect(fixture.innerHTML).toBe("<div><div>Hello, John</div></div>");
const fiber = app.__createRootFiber(true); const fiber = app.__createFiber(true, undefined, undefined, undefined);
await app.__updateProps({ initialRecipient: "James" }, fiber); await app.__updateProps({ initialRecipient: "James" }, fiber);
await app.render(); await app.render();
expect(fixture.innerHTML).toBe("<div><div>Hello, James</div></div>"); expect(fixture.innerHTML).toBe("<div><div>Hello, James</div></div>");
@@ -998,7 +998,7 @@ describe("connected components and default values", () => {
"<div><div><div>100Message100</div><div>101Message101</div></div></div>" "<div><div><div>100Message100</div><div>101Message101</div></div></div>"
); );
const fiber = app.__createRootFiber(true); const fiber = app.__createFiber(true, undefined, undefined, undefined);
await app.__updateProps({ threadId: 2 }, fiber); await app.__updateProps({ threadId: 2 }, fiber);
await app.render(); await app.render();
expect(fixture.innerHTML).toBe("<div><div><div>200Message200</div></div></div>"); expect(fixture.innerHTML).toBe("<div><div><div>200Message200</div></div></div>");