Просмотр исходного кода

warn when methods conflict with data (close #5832)

Evan You 9 лет назад
Родитель
Сommit
a18f879bb3
2 измененных файлов с 26 добавлено и 4 удалено
  1. 14 4
      src/core/instance/state.js
  2. 12 0
      test/unit/features/options/methods.spec.js

+ 14 - 4
src/core/instance/state.js

@@ -130,16 +130,26 @@ function initData (vm: Component) {
   // proxy data on instance
   const keys = Object.keys(data)
   const props = vm.$options.props
+  const methods = vm.$options.methods
   let i = keys.length
   while (i--) {
-    if (props && hasOwn(props, keys[i])) {
+    const key = keys[i]
+    if (process.env.NODE_ENV !== 'production') {
+      if (methods && hasOwn(methods, key)) {
+        warn(
+          `method "${key}" has already been defined as a data property.`,
+          vm
+        )
+      }
+    }
+    if (props && hasOwn(props, key)) {
       process.env.NODE_ENV !== 'production' && warn(
-        `The data property "${keys[i]}" is already declared as a prop. ` +
+        `The data property "${key}" is already declared as a prop. ` +
         `Use prop default value instead.`,
         vm
       )
-    } else if (!isReserved(keys[i])) {
-      proxy(vm, `_data`, keys[i])
+    } else if (!isReserved(key)) {
+      proxy(vm, `_data`, key)
     }
   }
   // observe data

+ 12 - 0
test/unit/features/options/methods.spec.js

@@ -27,4 +27,16 @@ describe('Options methods', () => {
     })
     expect(`method "hello" has an undefined value in the component definition`).toHaveBeenWarned()
   })
+
+  it('should warn methods conflicting with data', () => {
+    new Vue({
+      data: {
+        foo: 1
+      },
+      methods: {
+        foo () {}
+      }
+    })
+    expect(`method "foo" has already been defined as a data property`).toHaveBeenWarned()
+  })
 })