广告
返回顶部
首页 > 资讯 > 前端开发 > 其他 >vue初始化data方法有哪些
  • 134
分享到

vue初始化data方法有哪些

vue3Vue 2023-05-14 21:05:26 134人浏览 安东尼
摘要

本教程操作环境:windows7系统、vue3版,DELL G3电脑。Vue data有两种初始化的方式,function和object,但是这两种情况适用场景有哪些?能不能通用?带着这两个问题咱们一起分析下data初始化// 代码来源于官

vue初始化data方法有哪些

教程操作环境:windows7系统、vue3版,DELL G3电脑。

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/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/src/core/util/options.js

export 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/src/core/util/options.js
strats.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"
    }})

则会得到警告信息

1.png

说明:

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

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

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

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

【相关推荐:vuejs视频教程、WEB前端开发

以上就是vue初始化data方法有哪些的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: vue初始化data方法有哪些

本文链接: https://www.lsjlt.com/news/206153.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • vue初始化data方法有哪些
    本教程操作环境:windows7系统、vue3版,DELL G3电脑。vue data有两种初始化的方式,function和object,但是这两种情况适用场景有哪些?能不能通用?带着这两个问题咱们一起分析下data初始化// 代码来源于官...
    99+
    2023-05-14
    vue3 Vue
  • vue初始化data方法是什么
    今天小编给大家分享一下vue初始化data方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。vue初始化data方法有...
    99+
    2023-07-04
  • Vue中data数据初始化方法详解
    目录初始化化数据的一些方法以下是一个简单的例子父组件子组件显示效果销毁数据的父组件子组件显示效果当组件的根元素使用了v-if的时候, 并不会初始化data中的数据 如果想完全销毁该组...
    99+
    2023-05-19
    Vue data数据初始化 Vue data初始化 Vue数据初始化
  • php数组初始化方法有哪些
    今天小编给大家分享一下php数组初始化方法有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。3种方法:1、利用“[]”单独...
    99+
    2023-06-30
  • C++初始化列表的方法有哪些
    本篇内容介绍了“C++初始化列表的方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、类的初始化表首先是类中使用构造函数时的初始化表...
    99+
    2023-07-05
  • ArrayList实现初始化的方法有哪些
    本篇文章给大家分享的是有关ArrayList实现初始化的方法有哪些,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。对于ArrayList的初始化有三种方式:对于第一种默认的构造方...
    99+
    2023-05-31
    arraylist lis st
  • jquery页面初始化的方法有哪些
    在jQuery中,可以使用以下方法来初始化页面:1. $(document).ready(function(){}):这是最常用的页...
    99+
    2023-08-09
    jquery
  • jquery初始化函数的方法有哪些
    在 jQuery 中,有以下几种方法可以用来初始化函数:1. $(document).ready(function(){...}):...
    99+
    2023-08-09
    jquery
  • java中Map和List初始化的方法有哪些
    这篇文章主要介绍了java中Map和List初始化的方法有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇java中Map和List初始化的方法有哪些文章都会有所收获,下面我们一起来看看吧。Map和List初...
    99+
    2023-07-05
  • WinXP注册表如何初始化有哪些方法
      在我们平常安装软件的过程中,有很多软件的注册表会进驻系统,即使卸载了软件也会一直留在其中。而注册表是系统的敏感区,让很多朋友都不怎么敢碰它,怕一清理注册表就把WinXP系统弄崩溃了。想要初始化WinXP注册表,重启是...
    99+
    2023-06-10
    WinXP 注册表 初始化 方法
  • java数组初始化方式有哪些
    java中数组初始化的方式有:1.静态初始化,由程序指定数组元素初始值,由系统指定数组长度;2.动态初始化,由程序指定数组长度,由系统指定数组元素默认值。java中数组初始化的方式有以下两种静态初始化静态初始化是指初始化时由程序指定每个数组...
    99+
    2022-10-16
  • Java对数组进行初始化的方法有哪些
    Java对数组进行初始化的方法有哪些?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、数组数组中存储元素的类型是统一的,每一个元素在内存中所占用的空间大小是相同的,知道数组的首...
    99+
    2023-06-06
  • java数组初始化的方式有哪些
    Java数组可以通过以下几种方式进行初始化:1. 静态初始化:在声明数组的同时为数组元素赋初值。```javaint[] arr =...
    99+
    2023-09-09
    java
  • Linux初始化系统有哪些
    本篇内容主要讲解“Linux初始化系统有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux初始化系统有哪些”吧!在 Linux 和其他类 Uniux 系统中,init(初始化)进程是系...
    99+
    2023-06-28
  • Spring启动时实现初始化有哪些方式?
    目录一、Spring启动时实现初始化的几种方式二、构造方法里初始化三、常规三件套四、自定义ApplicationListener监听五、Spring Boot提供的初始化接口一、Sp...
    99+
    2022-11-12
  • java二维数组初始化的方式有哪些
    Java中二维数组的初始化方式有以下几种:1. 静态初始化:直接指定数组元素的值。```javaint[][] arr = {{1,...
    99+
    2023-09-27
    java
  • C语言数组初始化的方式有哪些
    C语言数组的初始化方式有以下几种:1. 使用花括号{}初始化:可以使用花括号{}将一组初始值按顺序赋给数组元素。例如:int arr...
    99+
    2023-09-04
    C语言
  • css要初始化的原因有哪些
    这篇文章将为大家详细讲解有关css要初始化的原因有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。初始化css的原因:1、浏览器有兼容性问题,不同浏览器对有些标签的默认值是不同的,如果没对CSS初始化往...
    99+
    2023-06-14
  • php有几种数组初始化方法
    3种方法:1、利用“[]”单独给元素赋值,语法“$数组变量名[下标]=值;”;2、用“[]”把所有元素一起初始化,语法“$数组变量名=[键值列表];”;3、用array()把所有元素一起初始化,语法“$数组变量名=array(键值列表)”。...
    99+
    2022-06-14
    php数组 php
  • MySQL初始化失败的原因有哪些
    MySQL初始化失败的原因可能有以下几个:1. MySQL配置错误:在初始化过程中,如果MySQL配置文件中的参数设置错误,比如数据...
    99+
    2023-08-16
    MySQL
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作