Why is data in the vue component a function?
Reason: To prevent multiple component instance objects from sharing the same data and causing data pollution; in the form of a function, when initData is used as a factory function, a new data object will be returned. When the data in the component is written as a function, the data is defined in the form of function return value, so that every time the component is reused, a new data will be returned with its own scope, similar to creating a private data for each component instance. The data space allows each component instance to maintain its own data.
The operating environment of this tutorial: windows7 system, vue3 version, DELL G3 computer.
1. The difference between instance and component definition data
When defining a vue instance, the data attribute can be either an object or an Function
const app = new Vue({ el:"#app", // 对象格式 data:{ foo:"foo" }, // 函数格式 data(){ return { foo:"foo" } } })
The data attribute defined in the component can only be a function
If the component data is directly defined as an object
Vue.component('component1',{ template:`<div>组件</div>`, data:{ foo:"foo" }})
, you will get a warning message
Warning: The returned data should be a function in each component instance
2. The difference between component data definition functions and objects
It was mentioned above that component data must be a function. I wonder if you have ever thought about why this is?
When we define a component, Vue will eventually form a component instance through Vue.extend()
Here we imitate the component constructor, define the data attribute, and adopt the form of an object
function Component(){ } Component.prototype.data = { count : 0 }
Create two component instances
const componentA = new Component() const componentB = new Component()
Modify the value of the data attribute of the componentA component, and the value in componentB has also changed
console.log(componentB.data.count) // 0 componentA.data.count = 1 console.log(componentB.data.count) // 1
The reason for this is that it is shared by both At the same memory address, the content modified by componentA also affects componentB. [Learning video sharing: vue video tutorial, web front-end video]
If we use the form of a function, this will not happen (the object returned by the function The memory addresses are not the same)
function Component(){ this.data = this.data() } Component.prototype.data = function (){ return { count : 0 } }
Modify the value of the data attribute of the componentA component, and the value in componentB will not be affected
console.log(componentB.data.count) // 0 componentA.data.count = 1 console.log(componentB.data.count) // 0
The vue component may have many instances, and the function is used to return a new data form, so that the data of each instance object will not be contaminated by the data of other instance objects
3. Principle analysis
First of all, you can take a look Vue initializes the data code. The definition of data can be a function or an object.
Source code location: /vue-dev/src/core/instance/state.js
function initData (vm: Component) { let data = vm.$options.data data = vm._data = typeof data === 'function' ? getData(data, vm) : data || {} ... }
data can be both object and function, so why does the above warning appear?
Don’t worry, continue reading below
When the component is created, the options will be merged
Source code location:/vue-dev/src/core/ util/options.js
Customized components will enter mergeOptions for option merging
Vue.prototype._init = function (options?: Object) { ... // merge options if (options && options._isComponent) { // optimize internal component instantiation // since dynamic options merging is pretty slow, and none of the // internal component options needs special treatment. initInternalComponent(vm, options) } else { vm.$options = mergeOptions( resolveConstructorOptions(vm.constructor), options || {}, vm ) } ... }
Defining data will perform data verification
Source code location: / vue-dev/src/core/instance/init.js
At this time, the vm instance is undefined and enters the if judgment. If the data type is not function, a warning will appear
strats.data = function ( parentVal: any, childVal: any, vm?: Component ): ?Function { if (!vm) { if (childVal && typeof childVal !== "function") { process.env.NODE_ENV !== "production" && warn( 'The "data" option should be a function ' + "that returns a per-instance value in component " + "definitions.", vm ); return parentVal; } return mergeDataOrFn(parentVal, childVal); } return mergeDataOrFn(parentVal, childVal, vm); };
4. Conclusion
The root instance object data can be an object or a function (the root instance is a singleton), which will not cause data pollution
Component instance object data must be a function. The purpose is to prevent multiple component instance objects from sharing the same data and causing data pollution. In the form of a function, it will be used as a factory function when initData will return a new data object
Description:
The components in vue are used Reusable, in order to prevent data reuse, define it as a function.
The data data in the vue component should be isolated from each other and not affect each other. Every time the component is reused, the data data should be copied once. After that, when a certain place is reused When the data data in the used local component is changed, the data data of other reused local components will not be affected, so you need to return an object as the status of the component through the data function.
When we write the data in the component as a function, the data is defined in the form of function return value, so that every time the component is reused, a new data will be returned, with its own Scope is similar to creating a private data space for each component instance, allowing each component instance to maintain its own data.
When the date of our component is simply written in object form, these instances use the same constructor. Due to the characteristics of JavaScript, all component instances share one data, so It will lead to a result that changes everything.
(Learning video sharing: web front-end development, Basic programming video)
The above is the detailed content of Why is data in the vue component a function?. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics



Using Bootstrap in Vue.js is divided into five steps: Install Bootstrap. Import Bootstrap in main.js. Use the Bootstrap component directly in the template. Optional: Custom style. Optional: Use plug-ins.

You can add a function to the Vue button by binding the button in the HTML template to a method. Define the method and write function logic in the Vue instance.

There are three ways to refer to JS files in Vue.js: directly specify the path using the <script> tag;; dynamic import using the mounted() lifecycle hook; and importing through the Vuex state management library.

The watch option in Vue.js allows developers to listen for changes in specific data. When the data changes, watch triggers a callback function to perform update views or other tasks. Its configuration options include immediate, which specifies whether to execute a callback immediately, and deep, which specifies whether to recursively listen to changes to objects or arrays.

Vue multi-page development is a way to build applications using the Vue.js framework, where the application is divided into separate pages: Code Maintenance: Splitting the application into multiple pages can make the code easier to manage and maintain. Modularity: Each page can be used as a separate module for easy reuse and replacement. Simple routing: Navigation between pages can be managed through simple routing configuration. SEO Optimization: Each page has its own URL, which helps SEO.

Vue.js has four methods to return to the previous page: $router.go(-1)$router.back() uses <router-link to="/" component window.history.back(), and the method selection depends on the scene.

There are three common methods for Vue.js to traverse arrays and objects: the v-for directive is used to traverse each element and render templates; the v-bind directive can be used with v-for to dynamically set attribute values for each element; and the .map method can convert array elements into new arrays.

The methods to implement the jump of a tag in Vue include: using the a tag in the HTML template to specify the href attribute. Use the router-link component of Vue routing. Use this.$router.push() method in JavaScript. Parameters can be passed through the query parameter and routes are configured in the router options for dynamic jumps.
