简单理解Vue的data为啥只能是函数

news2024/11/26 4:52:03

在学习vue的时候vue2只有在组件中严格要求data必须是一个函数,而在普通vue实例中,data可以是一个对象,但是在vue3出现后data必须一个函数,当时看着官方文档说的是好像是对象的引用问题,但是内部原理却不是很了解,今天通过一个简单的例子来说明为啥data必须是一个函数

1.Vue3中的data

const { createApp } = Vue
const app = {
    data: {
        a: 1
    },
    template: `
    <h1>{{a}}</h1>
    `
}
createApp(app).mount('#app')
复制代码

 可以看到上来vue就给了警告说明data必须是一个函数 下面直接抛错

2.vue中的data

var app = new Vue({
    el: '#app',
    data: { a: 'hello world' }
})

复制代码

这种写法是可以的,前面提过普通实例data可以是对象,但是在组件中必须是函数, 那么在vue2中难道普通实例就没有缺陷嘛?
答案:是有缺陷的, 比如这样

<div id="app1">{{ message }}</div>
<div id="app2">{{ message }}</div> 
复制代码

const data = { message: 'hello world' }
const vue1 = new Vue({
    el: '#app1',
    data
})

const vue2 = new Vue({
    el: '#app2',
    data
})
       
复制代码

这样在页面中会显示2个内容为hello world的div标签 那么当我们通过实例去改变messag呢?

 vue1.message = 'hello Vue'
复制代码

 奇怪的事情发生了,我知识改变了vue1的实例中的数据,但是其他实例的数据也发生了改变,相信很简单就能看出来这应该是共用同一个对象的引用而导致的,这在开放中是非常不友好的,开发者很容易就产生连串的错误,vue2也知道这种缺陷只是没有在普通实例中去体现而已,只在组件中实现了对于data的约束

为了让大家更好的立即为啥data必须是一个函数,黑猫在此简单实现一个vue的实例然后来证明为啥data是一个函数,以及如果data不是一个函数,我们应该如何处理

3.证明data是函数以及原理实现

在实现简单原理之前,我们需要搞清楚Vue在创建实例之前,对于data到底做了什么事情简单来说就是:

vue 在创建实例的过程中调用data函数返回实例对象通过响应式包装后存储在实例的data上并且实例可以直接越过data上并且实例可以直接越过data上并且实例可以直接越过data访问属性

1.通过这句描述可以知道Vue是一个构造函数,并且传入的参数中有一个data的属性,我们可以$data去访问,也可以直接访问这个属性,并且我们需要对这个data做代理
那么简单实现如下

function Vue(options) {
    this.$data = proxy(options.data())
}
function proxy(options) {
    return new Proxy(options, {
        get(target, key, value, receiver) {
            return Reflect.get(target, key, value, receiver)
        },
        set(target, key, newValue, receiver) {
            Reflect.set(target, key, newValue, receiver)
        }
    })
}
const data = function () {
    return {
        a: 'hello world'
    }
}
const vue1 = new Vue({
    data
})
const vue2 = new Vue({
    data
})
vue1.$data.a = 'hello Vue'
console.log(vue1.$data.a) // hello Vue
console.log(vue2.$data.a) // hello world
复制代码

通过简单实现可与看出来,当我们的data是一个函数的时候,在Vue的构造函数中,只有有实例创建就有执行data函数,然后返回一个特别的对象,所以当我们修改其中一个实例的时候并不会对其他实例的数据产生变化
那么当data不是一个函数呢 ,我们简单改下代码,代码如下

function Vue(options) {
    this.$data = proxy(options.data)
}
function proxy(options) {
    return new Proxy(options, {
        get(target, key, value, receiver) {
            return Reflect.get(target, key, value, receiver)
        },
        set(target, key, newValue, receiver) {
            Reflect.set(target, key, newValue, receiver)
        }
    })
}
const data = {
    a: 'hello world'
}
const vue1 = new Vue({
    data
})
const vue2 = new Vue({
    data
})
vue1.$data.a = 'hello Vue'
console.log(vue1.$data.a) // hello Vue
console.log(vue2.$data.a) // hello Vue
复制代码

可以看出,由于共用一个对象,当代理的时候也是对同一个对象进行代理,那么当我们通过一个实例去改变数据的时候,就会影响其他实例的状态

4.如果data必须是一个对象呢?

假如有人提出如果data是一个对象,那么我们应该如何处理呢,其实也非常简单,在代理的时候我们可以将传入的data对象通过深拷贝即可,这样我们就不会使用相同引用的对象啦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/92607.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]Node.js计算机毕业设计高校教学过程管理系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

异常检测方法总结

在数据挖掘中&#xff0c;异常检测&#xff08;英语&#xff1a;anomaly detection&#xff09;对不匹配预期模式或数据集中其他项目的项目、事件或观测值的识别。 通常异常项目会转变成银行欺诈、结构缺陷、医疗问题、文本错误等类型的问题。异常也被称为离群值、新奇、噪声、…

1999-2020年各省农村综合数据

1999-2020年各省农村综合数据 1、时间&#xff1a;1999-2020年 2&#xff1a;来源&#xff1a;各省NJ、统计NJ、农村NJ 3、范围&#xff1a;包括31省 4、指标包括&#xff1a; 第一产业增加值占地区生产总值比重&#xff08;%&#xff09;、第一产业人员占就业人员比重&a…

scikit-learn 决策树入门实践 iris花分类

背景 为了了解sklearn的API&#xff0c;以及决策树的工作原理&#xff0c;本文以经典的花分类问题为例&#xff0c;编写代码并讲解。最后深入源代码查看其实现 关键词&#xff1a;决策树、基尼系数、决策树可视化、特征重要性。 代码案例 训练决策树 首先要准备数据集&#…

1.引入——如何创建Spring项目

目录 1.创建SpringBoot项目 1.未安装插件 2.安装插件 2.尝试着运行这个FirstApplication 3.Spring的核心——IOC&#xff08;控制反转&#xff09;/DI的讲解 1.相关概念&#xff1a; 2.什么是IOC&#xff0c;为什么要有IOC&#xff1f; 4.基于XML的方式&#xff0c;演示…

制造企业数字化车间MES系统方案

在市场经济越发严峻的局面下&#xff0c;现代制造业工厂越来越追求效率与精益生产管理&#xff0c;争相通过各种技术手段实现生产线上的现代管理&#xff0c;其中&#xff0c;可视化生产管理技术受到企业的关注&#xff0c;对MES系统也越来越重视。 MES系统解决的问题 1、条码…

094基于nodejs框架的学生作业管理系统vue

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 前端技术&#xff1a;nodejsvueelementui 前端&#xff1a;HTML5,CSS3、JavaScript、VUE 系统分为不同的层次&#xff1a;视图层&#xff08;vue页面…

【C语言数据结构(基础版)】第三站:链表(二)

目录 一、单链表的缺陷以及双向链表的引入 1.单链表的缺陷 2.双向链表的引入 3.八大链表结构 &#xff08;1&#xff09;单向和双向 &#xff08;2&#xff09;带头和不带头 &#xff08;3&#xff09;循环和不循环 &#xff08;4&#xff09;八种链表结构 二、带头双向…

牛掰,阿里技术人刷了四年LeetCode才总结出来的数据结构和算法手册

时间飞逝&#xff0c;转眼间毕业七年多&#xff0c;从事 Java 开发也六年了。我在想&#xff0c;也是时候将自己的 Java 整理成一套体系。 这一次的知识体系面试题涉及到 Java 知识部分、性能优化、微服务、并发编程、开源框架、分布式等多个方面的知识点。 写这一套 Java 面试…

ssm+Vue计算机毕业设计校园疫情防控管理软件(程序+LW文档)

ssmVue计算机毕业设计校园疫情防控管理软件&#xff08;程序LW文档&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项…

数据库拆分3--使用sharding-jdbc 子查询注意事项

最近在使用sharding-jdbc来改造项目的时候遇到了一些问题&#xff0c;主要是有关子查询的&#xff0c;记录一下。 在某一个库中新建两张表 CREATE TABLE user_t ( user_id bigint(20) NOT NULL AUTO_INCREMENT, name varchar(255) DEFAULT NULL, age int(8) DEFAULT NU…

世界杯决赛号角吹响!趁周末来搭一套足球3D+AI量化分析系统吧!

2022年卡塔尔世界杯从11月21日开赛至今&#xff0c;即将在12月18日迎来这次赛事的最后高潮。对于大部分热爱世界杯的朋友来说&#xff0c;无论之前是哪队的球迷&#xff0c;现在都在会师决赛的两支队伍上选择站队。从赛事结果看&#xff0c;最终无论哪支队伍夺冠&#xff0c;都…

01背包和完全背包

01背包 最大约数和 题目链接点击这里 题目描述 选取和不超过 SSS 的若干个不同的正整数&#xff0c;使得所有数的约数&#xff08;不含它本身&#xff09;之和最大。 输入格式 输入一个正整数 SSS。 输出格式 输出最大的约数之和。 样例 #1 样例输入 #1 11样例输出 …

有哪些值得推荐的Python学习网站?

我学习的时候&#xff0c;我发现大部分 Python 课程和资源都太通用了。 马上&#xff0c;我想学习如何使用 Python 制作网站。但是 Python 学习资源要我花几个月的时间学习语法&#xff0c;然后才能进入我感兴趣的领域。 这个问题让人感到恐惧和畏惧。我推迟了几个月。每当我…

大学生化妆品网页设计模板代码 化妆美妆网页作业成品 学校美妆官网网页制作模板 学生简单html网站设计成品

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

为什么人家的开源项目文档如此炫酷?原来用的是这款神器

VuePress简介 VuePress是Vue驱动的静态网站生成器。对比我们的Docsify动态生成网站&#xff0c;对SEO更加友好。 使用VuePress具有如下优点&#xff1a; 使用Markdown来写文章&#xff0c;程序员写起来顺手&#xff0c;配置网站非常简洁。 我们可以在Markdown中使用Vue组件&…

所谓工作能力强,其实就这五点

博客主页&#xff1a;https://tomcat.blog.csdn.net 博主昵称&#xff1a;农民工老王 主要领域&#xff1a;Java、Linux、K8S 期待大家的关注&#x1f496;点赞&#x1f44d;收藏⭐留言&#x1f4ac; #mermaid-svg-YapmQUqJ0V32EFv6 {font-family:"trebuchet ms",ve…

用三台云服务器搭建hadoop完全分布式集群

用三台云服务器搭建hadoop完全分布式集群一、硬件准备&#xff08;一&#xff09;集群配置&#xff08;二&#xff09;集群规划&#xff08;三&#xff09;Hadoop、Zookeeper、Java、CentOS版本二、基础环境配置&#xff08;一&#xff09;关闭防火墙&#xff08;二&#xff09…

[附源码]Python计算机毕业设计SSM基于Java的在线点餐系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

12.15

JSONP 1) JSONP 是什么 JSONP(JSON with Padding)&#xff0c;只支持 get 请求。 2) JSONP 怎么工作的&#xff1f; 在网页有一些标签天生具有跨域能力&#xff0c;比如&#xff1a;img link iframe script。 JSONP 就是利用 script 标签的跨域能力来发送请求的。 3) JSONP …