A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from https://github.com/vuejs/vue/commit/7404091 below:

support async hydration · vuejs/vue@7404091 · GitHub

File tree Expand file treeCollapse file tree 5 files changed

+50

-14

lines changed

Filter options

Expand file treeCollapse file tree 5 files changed

+50

-14

lines changed Original file line number Diff line number Diff line change

@@ -15,6 +15,7 @@ import {

15 15 16 16

import {

17 17

resolveAsyncComponent,

18 +

createAsyncPlaceholder,

18 19

extractPropsFromVNodeData

19 20

} from './helpers/index'

20 21

@@ -122,22 +123,24 @@ export function createComponent (

122 123

return

123 124

}

124 125 126 +

data = data || {}

127 + 125 128

// async component

129 +

let asyncFactory

126 130

if (isUndef(Ctor.cid)) {

127 -

Ctor = resolveAsyncComponent(Ctor, baseCtor, context)

131 +

asyncFactory = Ctor

132 +

Ctor = resolveAsyncComponent(asyncFactory, baseCtor, context)

128 133

if (Ctor === undefined) {

129 134

// return nothing if this is indeed an async component

130 135

// wait for the callback to trigger parent update.

131 -

return

136 +

return createAsyncPlaceholder(asyncFactory, data.key)

132 137

}

133 138

}

134 139 135 140

// resolve constructor options in case global mixins are applied after

136 141

// component constructor creation

137 142

resolveConstructorOptions(Ctor)

138 143 139 -

data = data || {}

140 - 141 144

// transform component v-model data into props & events

142 145

if (isDef(data.model)) {

143 146

transformModel(Ctor.options, data)

@@ -171,7 +174,8 @@ export function createComponent (

171 174

const vnode = new VNode(

172 175

`vue-component-${Ctor.cid}${name ? `-${name}` : ''}`,

173 176

data, undefined, undefined, undefined, context,

174 -

{ Ctor, propsData, listeners, tag, children }

177 +

{ Ctor, propsData, listeners, tag, children },

178 +

asyncFactory

175 179

)

176 180

return vnode

177 181

}

Original file line number Diff line number Diff line change

@@ -9,12 +9,24 @@ import {

9 9

isObject

10 10

} from 'core/util/index'

11 11 12 +

import { createEmptyVNode } from 'core/vdom/vnode'

13 + 12 14

function ensureCtor (comp, base) {

13 15

return isObject(comp)

14 16

? base.extend(comp)

15 17

: comp

16 18

}

17 19 20 +

export function createAsyncPlaceholder (

21 +

factory: Function,

22 +

key: string | number | void

23 +

): VNode {

24 +

const node = createEmptyVNode()

25 +

node.asyncFactory = factory

26 +

node.key = key

27 +

return node

28 +

}

29 + 18 30

export function resolveAsyncComponent (

19 31

factory: Function,

20 32

baseCtor: Class<Component>,

Original file line number Diff line number Diff line change

@@ -33,11 +33,17 @@ const hooks = ['create', 'activate', 'update', 'remove', 'destroy']

33 33 34 34

function sameVnode (a, b) {

35 35

return (

36 -

a.key === b.key &&

37 -

a.tag === b.tag &&

38 -

a.isComment === b.isComment &&

39 -

isDef(a.data) === isDef(b.data) &&

40 -

sameInputType(a, b)

36 +

a.key === b.key && (

37 +

(

38 +

a.isAsyncPlaceholder === true &&

39 +

a.asyncFactory === b.asyncFactory

40 +

) || (

41 +

a.tag === b.tag &&

42 +

a.isComment === b.isComment &&

43 +

isDef(a.data) === isDef(b.data) &&

44 +

sameInputType(a, b)

45 +

)

46 +

)

41 47

)

42 48

}

43 49

@@ -434,6 +440,9 @@ export function createPatchFunction (backend) {

434 440

if (oldVnode === vnode) {

435 441

return

436 442

}

443 +

if (oldVnode.isAsyncPlaceholder) {

444 +

return hydrate(oldVnode.elm, vnode, insertedVnodeQueue)

445 +

}

437 446

// reuse element for static trees.

438 447

// note we only do this if the vnode is cloned -

439 448

// if the new node is not cloned it means the render functions have been

@@ -497,6 +506,11 @@ export function createPatchFunction (backend) {

497 506 498 507

// Note: this is a browser-only function so we can assume elms are DOM nodes.

499 508

function hydrate (elm, vnode, insertedVnodeQueue) {

509 +

if (isTrue(vnode.isComment) && isDef(vnode.asyncFactory)) {

510 +

vnode.elm = elm

511 +

vnode.isAsyncPlaceholder = true

512 +

return true

513 +

}

500 514

if (process.env.NODE_ENV !== 'production') {

501 515

if (!assertNodeMatch(elm, vnode)) {

502 516

return false

Original file line number Diff line number Diff line change

@@ -19,6 +19,8 @@ export default class VNode {

19 19

isComment: boolean; // empty comment placeholder?

20 20

isCloned: boolean; // is a cloned node?

21 21

isOnce: boolean; // is a v-once node?

22 +

asyncFactory: ?Function; // async component factory function

23 +

isAsyncPlaceholder: boolean;

22 24 23 25

constructor (

24 26

tag?: string,

@@ -27,7 +29,8 @@ export default class VNode {

27 29

text?: string,

28 30

elm?: Node,

29 31

context?: Component,

30 -

componentOptions?: VNodeComponentOptions

32 +

componentOptions?: VNodeComponentOptions,

33 +

asyncFactory?: Function

31 34

) {

32 35

this.tag = tag

33 36

this.data = data

@@ -47,6 +50,8 @@ export default class VNode {

47 50

this.isComment = false

48 51

this.isCloned = false

49 52

this.isOnce = false

53 +

this.asyncFactory = asyncFactory

54 +

this.isAsyncPlaceholder = false

50 55

}

51 56 52 57

// DEPRECATED: alias for componentInstance for backwards compat.

Original file line number Diff line number Diff line change

@@ -61,7 +61,8 @@ describe('create-component', () => {

61 61

}

62 62

function go () {

63 63

vnode = createComponent(async, data, vm, vm)

64 -

expect(vnode).toBeUndefined() // not to be loaded yet.

64 +

expect(vnode.isComment).toBe(true) // not to be loaded yet.

65 +

expect(vnode.asyncFactory).toBe(async)

65 66

}

66 67

function loaded () {

67 68

vnode = createComponent(async, data, vm, vm)

@@ -93,11 +94,11 @@ describe('create-component', () => {

93 94

}

94 95

function go () {

95 96

vnode = createComponent(async, data, vm, vm)

96 -

expect(vnode).toBeUndefined() // not to be loaded yet.

97 +

expect(vnode.isComment).toBe(true) // not to be loaded yet.

97 98

}

98 99

function failed () {

99 100

vnode = createComponent(async, data, vm, vm)

100 -

expect(vnode).toBeUndefined() // failed

101 +

expect(vnode.isComment).toBe(true) // failed, still a comment node

101 102

expect(`Failed to resolve async component: ${async}\nReason: ${reason}`).toHaveBeenWarned()

102 103

done()

103 104

}

You can’t perform that action at this time.


RetroSearch is an open source project built by @garambo | Open a GitHub Issue

Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo

HTML: 3.2 | Encoding: UTF-8 | Version: 0.7.4