{"record":{"id":"57fa073ef6b7ed8e","repo":"Meituan-Dianping/mpvue","slug":"data-functions-should-return-an-object-https-vu","errorCode":null,"errorMessage":"data functions should return an object:\nhttps://vuejs.org/v2/guide/components.html#data-Must-Be-a-Function","messagePattern":"data functions should return an object:\nhttps://vuejs\\.org/v2/guide/components\\.html#data-Must-Be-a-Function","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/weex-vue-framework/factory.js","lineNumber":3133,"sourceCode":"    // during Vue.extend(). We only need to proxy props defined at\n    // instantiation here.\n    if (!(key in vm)) {\n      proxy(vm, \"_props\", key);\n    }\n  };\n\n  for (var key in propsOptions) loop( key );\n  observerState.shouldConvert = true;\n}\n\nfunction initData (vm) {\n  var data = vm.$options.data;\n  data = vm._data = typeof data === 'function'\n    ? getData(data, vm)\n    : data || {};\n  if (!isPlainObject(data)) {\n    data = {};\n    process.env.NODE_ENV !== 'production' && warn(\n      'data functions should return an object:\\n' +\n      'https://vuejs.org/v2/guide/components.html#data-Must-Be-a-Function',\n      vm\n    );\n  }\n  // proxy data on instance\n  var keys = Object.keys(data);\n  var props = vm.$options.props;\n  var methods = vm.$options.methods;\n  var i = keys.length;\n  while (i--) {\n    var key = keys[i];\n    if (process.env.NODE_ENV !== 'production') {\n      if (methods && hasOwn(methods, key)) {\n        warn(\n          (\"method \\\"\" + key + \"\\\" has already been defined as a data property.\"),\n          vm\n        );","sourceCodeStart":3115,"sourceCodeEnd":3151,"githubUrl":"https://github.com/Meituan-Dianping/mpvue/blob/6c5d78ee04f58c6d782c456dfcf0fe63c0b7f89b/packages/weex-vue-framework/factory.js#L3115-L3151","documentation":"Vue's data option must either be a function returning a plain object, or omitted. If the resolved data is not a plain object (e.g. the function returned undefined, or data was declared as an object/array), Vue discards it, initializes an empty data object, and emits this warning in development.","triggerScenarios":"Declaring data as a non-function in a non-root component and returning a non-object from the data() function — e.g. data() { return; }, data: () => null, or data: [1,2,3].","commonSituations":"Arrow functions returning nothing due to implicit return, forgetting the return statement, copying root-component style data:{} into a reusable component, or a data() function that returns a Promise instead of an object.","solutions":["Make data a function and return a plain object literal","Check every return path of the data function returns an object","If data was declared as an object, wrap it: data() { return {...}; }","Await async work in created() instead of returning a Promise from data()"],"exampleFix":"// before\ndata() {\n  fetchItems();\n}\n// after\ndata() {\n  return { items: [], loading: false };\n}","handlingStrategy":"validation","validationCode":"function validateDataOption(options) {\n  const d = typeof options.data === 'function' ? options.data() : options.data;\n  if (d !== null && d !== undefined && (typeof d !== 'object' || Array.isArray(d))) {\n    throw new TypeError('data must resolve to a plain object');\n  }\n}","typeGuard":"function isPlainObject(v) {\n  return Object.prototype.toString.call(v) === '[object Object]';\n}","tryCatchPattern":null,"preventionTips":["Always declare data as a function returning an object literal","Check every return path of data()","Never return Promises/arrays/null from data()"],"tags":["vue","data","component-options","type-error"],"backgroundTag":"data-must-return-object","analyzedSha":"6c5d78ee04f58c6d782c456dfcf0fe63c0b7f89b","analyzedAt":"2026-09-02T05:17:40.946Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-09T11:17:12.671Z"}