1
1
/* @flow */
2
2
3
- import VNode from './vnode'
3
+ import {
4
+ warn ,
5
+ isObject ,
6
+ hasOwn ,
7
+ hyphenate ,
8
+ validateProp ,
9
+ toNumber ,
10
+ _toString ,
11
+ looseEqual ,
12
+ emptyObject ,
13
+ looseIndexOf
14
+ } from '../util/index'
15
+
16
+ import VNode , {
17
+ createTextVNode ,
18
+ createEmptyVNode
19
+ } from '../vdom/vnode'
20
+
4
21
import { resolveConstructorOptions } from '../instance/init'
5
22
import { activeInstance , callHook } from '../instance/lifecycle'
6
- import { resolveSlots } from '../instance/render-helpers/resolve-slots'
7
23
import { createElement } from './create-element'
8
- import { warn , isObject , hasOwn , hyphenate , validateProp } from '../util/index'
24
+ import { resolveSlots } from '../instance/render-helpers/resolve-slots'
25
+ import { renderList } from '../instance/render-helpers/render-list'
26
+ import { renderSlot } from '../instance/render-helpers/render-slot'
27
+ import { resolveFilter } from '../instance/render-helpers/resolve-filter'
28
+ import { checkKeyCodes } from '../instance/render-helpers/check-keycodes'
29
+ import { bindObjectProps } from '../instance/render-helpers/bind-object-props'
30
+ import { renderStatic , markOnce } from '../instance/render-helpers/render-static'
31
+ import { resolveScopedSlots } from '../instance/render-helpers/resolve-slots'
9
32
10
33
const hooks = { init, prepatch, insert, destroy }
11
34
const hooksToMerge = Object . keys ( hooks )
@@ -102,8 +125,9 @@ function createFunctionalComponent (
102
125
context : Component ,
103
126
children : ?Array < VNode >
104
127
) : VNode | void {
128
+ const options = Ctor . options
105
129
const props = { }
106
- const propOptions = Ctor . options . props
130
+ const propOptions = options . props
107
131
if ( propOptions ) {
108
132
for ( const key in propOptions ) {
109
133
props [ key ] = validateProp ( key , propOptions , propsData )
@@ -113,13 +137,52 @@ function createFunctionalComponent (
113
137
// gets a unique context - this is necessary for correct named slot check
114
138
const _context = Object . create ( context )
115
139
const h = ( a , b , c , d ) => createElement ( _context , a , b , c , d , true )
116
- const vnode = Ctor . options . render . call ( null , h , {
140
+
141
+ const renderContext : Object = {
117
142
props,
118
143
data,
119
144
parent : context ,
120
145
children,
121
146
slots : ( ) => resolveSlots ( children , context )
122
- } )
147
+ }
148
+
149
+ // functional template runtime check
150
+ if ( process . env . NODE_ENV !== 'production' && options . template ) {
151
+ return warn (
152
+ 'Vue templates with functional components are not supported with runtime build.'
153
+ )
154
+ }
155
+
156
+ // functional compiled template
157
+ if ( options . compiled ) {
158
+ renderContext . $slots = renderContext . slots ( )
159
+ renderContext . $scopedSlots = data . scopedSlots || emptyObject
160
+ renderContext . _o = markOnce
161
+ renderContext . _n = toNumber
162
+ renderContext . _s = _toString
163
+ renderContext . _l = renderList
164
+ renderContext . _q = looseEqual
165
+ renderContext . _i = looseIndexOf
166
+ renderContext . _f = resolveFilter
167
+ renderContext . _k = checkKeyCodes
168
+ renderContext . _v = createTextVNode
169
+ renderContext . _e = createEmptyVNode
170
+ renderContext . _u = resolveScopedSlots
171
+ // Apply context to render helpers
172
+ renderContext . _c = ( a , b , c , d ) => createElement ( renderContext , a , b , c , d , false )
173
+ renderContext . _t = ( a , b , c , d ) => renderSlot . call ( renderContext , a , b , c , d )
174
+ renderContext . _m = ( a , b ) => renderStatic . call ( renderContext , a , b )
175
+ renderContext . _b = ( a , b , c , d ) => bindObjectProps . call ( renderContext , a , b , c , d )
176
+
177
+ // Add static nodes
178
+ renderContext . _staticTrees = [ ]
179
+ const staticRenderFns = options . staticRenderFns || [ ]
180
+ for ( let i = 0 ; i < staticRenderFns . length ; i ++ ) {
181
+ renderContext . _staticTrees . push ( staticRenderFns [ i ] ( null , renderContext ) )
182
+ }
183
+ }
184
+
185
+ const vnode = options . render . call ( null , h , renderContext )
123
186
if ( vnode instanceof VNode ) {
124
187
vnode . functionalContext = context
125
188
if ( data . slot ) {
0 commit comments