1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
| /* @flow */
|
| import {
| tip,
| hasOwn,
| isDef,
| isUndef,
| hyphenate,
| formatComponentName
| } from 'core/util/index'
|
| export function extractPropsFromVNodeData (
| data: VNodeData,
| Ctor: Class<Component>,
| tag?: string
| ): ?Object {
| // we are only extracting raw values here.
| // validation and default values are handled in the child
| // component itself.
| const propOptions = Ctor.options.props
| if (isUndef(propOptions)) {
| return
| }
| const res = {}
| const { attrs, props } = data
| if (isDef(attrs) || isDef(props)) {
| for (const key in propOptions) {
| const altKey = hyphenate(key)
| if (process.env.NODE_ENV !== 'production') {
| const keyInLowerCase = key.toLowerCase()
| if (
| key !== keyInLowerCase &&
| attrs && hasOwn(attrs, keyInLowerCase)
| ) {
| tip(
| `Prop "${keyInLowerCase}" is passed to component ` +
| `${formatComponentName(tag || Ctor)}, but the declared prop name is` +
| ` "${key}". ` +
| `Note that HTML attributes are case-insensitive and camelCased ` +
| `props need to use their kebab-case equivalents when using in-DOM ` +
| `templates. You should probably use "${altKey}" instead of "${key}".`
| )
| }
| }
| checkProp(res, props, key, altKey, true) ||
| checkProp(res, attrs, key, altKey, false)
| }
| }
| return res
| }
|
| function checkProp (
| res: Object,
| hash: ?Object,
| key: string,
| altKey: string,
| preserve: boolean
| ): boolean {
| if (isDef(hash)) {
| if (hasOwn(hash, key)) {
| res[key] = hash[key]
| if (!preserve) {
| delete hash[key]
| }
| return true
| } else if (hasOwn(hash, altKey)) {
| res[key] = hash[altKey]
| if (!preserve) {
| delete hash[altKey]
| }
| return true
| }
| }
| return false
| }
|
|