我的编程空间,编程开发者的网络收藏夹
学习永远不晚

vue初始化data方法是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

vue初始化data方法是什么

今天小编给大家分享一下vue初始化data方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

vue初始化data方法有两种:1、object方式,语法“var data = { 键值对 }”;2、function方式,语法“data: function () {return { 键值对 }}”。需要注意组件和extend中的data初始化不能是Object,否则会报错。组件中data用function方式是为了防止多个组件实例对象之间共用一个data,产生数据污染。

vue data有两种初始化的方式,function和object,但是这两种情况适用场景有哪些?能不能通用?带着这两个问题咱们一起分析下

data初始化

// 代码来源于官网示例// 第一种定义方式var data = { a: 1 }// 直接创建一个实例var vm = new Vue({  data: data})// Vue.extend() 中 data 必须是函数var Component = Vue.extend({// 第二种定义方式  data: function () {    return { a: 1 }  }})

上述代码简单描述了data定义的两种方式

  • function

  • object

官网demo中也着重说了extend中data初始化不能用object。那么为什么呢?

源码分析

按照官网demo,Vue.extend中的data初始化不能是Object,如果我们强制写成Object会出现什么?

var Component = Vue.extend({  data: { a: 1 }})

运行以后chrome的consolo直接报错,信息如下

vue.esm.js?efeb:591 [Vue warn]: The "data" option should be a function that returns a per-instance value in component definitions.

通过分析源码以及报错信息,当触发Vue.extend的时候,他会做一个合并操作,把一个基础组件(里面vmode, transtion等)和你定义在extend内的信息,通过mergeField往options上合并,当合并到data的时候,他会触发strats.data,在这个里面会check data是不是一个function,这里需要注意的是filter、components等和data走的是两套合并流程,详细的请看代码注释,如下

// vue.extend 源码地址https://github.com/vuejs/vue/blob/dev/class="lazy" data-src/core/global-api/extend.js  Vue.extend = function (extendOptions: Object): Function {  ...  // 在这里会触发mergeOptions方法  Sub.options = mergeOptions(      Super.options,      extendOptions    )  ...}// mergeOptions 源码地址https://github.com/vuejs/vue/blob/dev/class="lazy" data-src/core/util/options.jsexport function mergeOptions (  parent: Object,  child: Object,  vm?: Component): Object {  ...  const options = {}  let key  // parent对象内包含components、filter,、directive  for (key in parent) {    mergeField(key)  }  // child对象内对应的是Vue.extend内定义的参数  for (key in child) {    if (!hasOwn(parent, key)) {      mergeField(key)    }  }  function mergeField (key) {  // 这一步是根据传入的key找到不同的合并策略filter、components、directives用到合并策略是这个方法mergeAssets和data用到的不一样,当合并到data的时候会进入专属的合并策略方法内    const strat = strats[key] || defaultStrat    options[key] = strat(parent[key], child[key], vm, key)  }}// strats.data  源码地址https://github.com/vuejs/vue/blob/dev/class="lazy" data-src/core/util/options.jsstrats.data = function (  parentVal,  childVal,  vm) {  if (!vm) {  // 如果data不是function的话会直接走下面的报错信息    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)};

其他情况

其实我们上述代码只是一个简单的流程,在实际开发中同类情况有:子组件内、路由内都不可以把data定义为一个对象,因为他们底层都调用了mergeOptions方法

什么时候可以定义成一个对象

在vue初始化的时候,如下

new Vue({  data: {    linke: '//sinker.club'  }})

意义

ok,上面说了那么多,那么这么做的意义是什么?为什么那几种情况不可以定义为对象?其实回答这个问题,需要回到js本身,众所周知js数据类型分为引用和基本,引用类型包含Object, Array, Function,何为引用类型就不在这里阐述了

  var obj = {link: '//www.sinker.club'}  var obj2 = obj  var obj3 = obj  obj2.link = "//gitlab.sinker.club"  console.log(obj3.link) // "//gitlab.sinker.club"

上述代码反应了一个问题,由于obj3和obj2在内存中都是指向一个地址,那么obj2的修改会影响到obj3,当然处理这种问题可以用深copy来做到

  • JSON.parse(JSON.stringify(obj))

  • deepClone(obj)

但是这两种做法需要开发或者框架每一次都要深copy一次,当数据量大的时候对性能什么都不友好,那么Vue怎么做的呢?把data定义成一个function

function data() {  return {   link: '//sinker.club'  }}var obj = test()var obj2 = test()obj2.link ="//gitlab.sinker.club"console.log(obj.link) '//sinker.club'

为什么这么做?解决的场景是什么呢?

比如我定一个子组件,data是按照对象的方式定义的,这个组件在多个地方引用,如果其中一个引用此组件的data修改了,那么就会造成其余引用此组件的data同时改变, end.

扩展知识:

vue实例的时候定义data属性既可以是一个对象,也可以是一个函数

const app = new Vue({    el:"#app",    // 对象格式    data:{        foo:"foo"    },    // 函数格式    data(){        return {             foo:"foo"        }    }})

组件中定义data属性,只能是一个函数

如果为组件data直接定义为一个对象

Vue.component('component1',{    template:`<div>组件</div>`,    data:{        foo:"foo"    }})

则会得到警告信息

vue初始化data方法是什么

说明:

  • vue中组件是用来复用的,为了防止data复用,将其定义为函数。

  • vue组件中的data数据都应该是相互隔离,互不影响的,组件每复用一次,data数据就应该被复制一次,之后,当某一处复用的地方组件内data数据被改变时,其他复用地方组件的data数据不受影响,就需要通过data函数返回一个对象作为组件的状态。

  • 当我们将组件中的data写成一个函数,数据以函数返回值形式定义,这样每复用一次组件,就会返回一份新的data,拥有自己的作用域,类似于给每个组件实例创建一个私有的数据空间,让各个组件实例维护各自的数据。

  • 当我们组件的date单纯的写成对象形式,这些实例用的是同一个构造函数,由于JavaScript的特性所导致,所有的组件实例共用了一个data,就会造成一个变了全都会变的结果。

以上就是“vue初始化data方法是什么”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

vue初始化data方法是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

vue初始化data方法是什么

今天小编给大家分享一下vue初始化data方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。vue初始化data方法有
2023-07-04

vue初始化data方法有哪些

vue初始化data方法有两种:1、object方式,语法“var data = { 键值对 }”;2、function方式,语法“data: function () {return { 键值对 }}”。需要注意组件和extend中的data初始化不能是Object,否则会报错。组件中data用function方式是为了防止多个组件实例对象之间共用一个data,产生数据污染。
2023-05-14

Vue中data数据初始化方法详解

这篇文章主要介绍了Vue中data数据初始化方法,数据初始化是在组件实例化时发生的,在组件中,可以通过data选项来定义组件的初始数据,需要详细了解可以参考下文
2023-05-19

Vue初始化是什么意思

初始化 Vue 是什么意思?Vue 是一款非常流行的 JavaScript 框架,广泛用于构建现代化的 Web 应用程序。在开始学习 Vue 之前,你需要先了解 Vue 的初始化过程,以便正确地使用 Vue 并创建可重复的代码。初始化 Vue 是指在页面中创建一个 Vue 实例,该实例可以管理应用程序的状态和呈现界面的变化。Vue 实例是 Vue 框架的核心部分,也是在使用 V
2023-05-14

pycharm初始化的方法是什么

PyCharm的初始化方法是通过安装并打开PyCharm,在首次打开时,会出现一个“Welcome to PyCharm”界面,用户可以根据自己的需求进行配置和初始化。以下是PyCharm初始化的一般步骤:1. 下载并安装PyCharm:从
2023-09-13

linux初始化的方法是什么

Linux的初始化方法可以通过执行以下步骤来完成:1. 启动计算机并进入BIOS设置,在启动选项中选择从可引导介质(如硬盘或USB驱动器)启动。2. 安装Linux操作系统。可以选择通过光盘、USB驱动器或通过网络进行安装。根据选择的发行版
2023-08-30

vue初始化要做什么

这篇“vue初始化要做什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue初始化要做什么”文章吧。做的事:1、选项合并,
2023-07-04

c++数组初始化的方法是什么

C++中有多种方式可以初始化数组:1. 使用赋值语句逐个初始化数组元素。```cppint arr[5];arr[0] = 1;arr[1] = 2;arr[2] = 3;arr[3] = 4;arr[4] = 5;```2. 使用初始化列
2023-09-28

java初始化数组的方法是什么

Java中初始化数组有以下几种方法:1. 静态初始化:在声明数组的同时直接为数组元素赋值。```javaint[] arr = {1, 2, 3, 4, 5};```2. 动态初始化:先声明数组,然后再为数组元素赋值。```javaint[
2023-08-29

golang数组初始化的方法是什么

在Go语言中,可以使用以下方法初始化数组:1. 使用var关键字声明数组,并在声明时指定数组的长度,数组的元素会被自动初始化为对应类型的零值。```var arr [5]int // 声明一个长度为5的int类型数组,元素都被初始化为0``
2023-09-27

delphi数组初始化的方法是什么

在Delphi中,有几种初始化数组的方法:1. 手动初始化:可以通过逐个指定数组元素的值来手动初始化数组。例如:```delphivararr: array[0..2] of Integer;beginarr[0] := 1;arr[1]
2023-09-22

android初始化页面的方法是什么

在Android中,可以通过以下几种方法来初始化页面:1. 在Activity的onCreate()方法中进行初始化操作。onCreate()方法是Activity的生命周期方法之一,在Activity创建时会调用该方法。可以在这个方法中进
2023-08-09

SpringBoot中的Bean初始化方法是什么

本篇内容介绍了“SpringBoot中的Bean初始化方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!注解说明使用注解: @Post
2023-06-21

java变量的初始化方法是什么

Java变量的初始化方法有以下几种:1. 声明变量时直接赋值:可以在声明变量时直接为其赋初值,例如:```javaint num = 10;String name = "John";```2. 构造函数初始化:可以在类的构造函数中为成员变量
2023-09-15

spring中bean的初始化方法是什么

在Spring中,bean的初始化可以通过两种方式来完成:使用@Bean注解的initMethod属性或者实现InitializingBean接口。1. 使用@Bean注解的initMethod属性:可以在@Bean注解中通过initMet
2023-09-21

mysql重新初始化的方法是什么

要重新初始化MySQL,可以按照以下步骤操作:停止MySQL服务:可以使用以下命令停止MySQL服务:sudo service mysql stop删除MySQL数据目录:可以使用以下命令删除MySQL数据目录(请注意,此操作会删除所有数据
mysql重新初始化的方法是什么
2024-04-09

vue初始化都做什么

做的事:1、选项合并,处理组件的配置内容;2、初始化vue实例生命周期相关的属性;3、初始化自定义组件事件的监听;4、初始化render渲染所需的slots、渲染函数等;5、调用beforeCreate函数;6、初始化注入数据;7、对props、data、watch等进行初始化;8、把祖辈传下的数据注入后初始化provide;9、调用created函数;10、挂载DOM元素。
2023-05-14

hive连接mysql初始化的方法是什么

在Hive中连接MySQL需要进行以下初始化步骤:1、首先,需要在Hive的配置文件hive-site.xml中配置MySQL的连接属性。可以使用以下命令创建一个名为hive-site.xml的配置文件:cp /etc/hive/con
hive连接mysql初始化的方法是什么
2024-04-09

java静态map初始化的方法是什么

在Java中,静态Map可以通过静态代码块或静态方法进行初始化。1. 使用静态代码块:```javapublic class MyClass {private static Map map;static {map = new HashMap
2023-10-12

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录