-
-
Notifications
You must be signed in to change notification settings - Fork 33.7k
Warn when component option should be an object, but is not (#5605) #5642
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 2 commits
0e0e386
340f6fb
e9001a1
978cecb
ff905f3
3471d0b
320990b
c5301b7
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -60,6 +60,17 @@ const isReservedProp = { | |
slot: 1 | ||
} | ||
|
||
function parseObjectOption (vm: Component, option: Object, name: string) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. better call it checkOptionType There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. the result is used in assignment, to call it a "check" may be misleading There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The assignment prevents runtime errors but the function is meant to do a check |
||
if (!isPlainObject(option)) { | ||
process.env.NODE_ENV !== 'production' && warn( | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. since this function is only called in dev mode, this check is unecessary There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. it may be good to provide a fallback (empty object) if a wrong type is used in prod mode There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. no, because it will never reach production code There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The check must be removed in production |
||
`${name} should be an object.`, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The message could be a bit more explicit: |
||
vm | ||
) | ||
return {} | ||
} | ||
return option | ||
} | ||
|
||
function initProps (vm: Component, propsOptions: Object) { | ||
const propsData = vm.$options.propsData || {} | ||
const props = vm._props = {} | ||
|
@@ -148,8 +159,8 @@ function getData (data: Function, vm: Component): any { | |
const computedWatcherOptions = { lazy: true } | ||
|
||
function initComputed (vm: Component, computed: Object) { | ||
computed = parseObjectOption(vm, computed, 'computed') | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This must be called only in non-production env (NODE_ENV !== 'production') |
||
const watchers = vm._computedWatchers = Object.create(null) | ||
|
||
for (const key in computed) { | ||
const userDef = computed[key] | ||
let getter = typeof userDef === 'function' ? userDef : userDef.get | ||
|
@@ -213,6 +224,7 @@ function createComputedGetter (key) { | |
} | ||
|
||
function initMethods (vm: Component, methods: Object) { | ||
methods = parseObjectOption(vm, methods, 'methods') | ||
const props = vm.$options.props | ||
for (const key in methods) { | ||
vm[key] = methods[key] == null ? noop : bind(methods[key], vm) | ||
|
@@ -235,6 +247,7 @@ function initMethods (vm: Component, methods: Object) { | |
} | ||
|
||
function initWatch (vm: Component, watch: Object) { | ||
watch = parseObjectOption(vm, watch, 'watch') | ||
for (const key in watch) { | ||
const handler = watch[key] | ||
if (Array.isArray(handler)) { | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -24,4 +24,18 @@ describe('Options methods', () => { | |
}) | ||
expect(`method "hello" has an undefined value in the component definition`).toHaveBeenWarned() | ||
}) | ||
|
||
it('should warn non object', () => { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. These tests can also be refactored into a function. It should also test it doesn't print the warning in the right scenario There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Should refactored function be a separate file in There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. yes, after all you need to include it in different test files 🙂 |
||
new Vue({ | ||
methods: 'wrong' | ||
}) | ||
expect('methods should be an object').toHaveBeenWarned() | ||
}) | ||
|
||
it('don\'t warn when is an object', () => { | ||
new Vue({ | ||
methods: {} | ||
}) | ||
expect('computed should be an object').not.toHaveBeenWarned() | ||
}) | ||
}) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
no need for option arg because you have name