vue深拷贝的3种实现方式小结

本文将详细讲解三种vue深拷贝的实现方式,分别为递归实现、JSON.parse/stringify、lodash库实现。下面将分为以下几个部分来介绍。

1. 递归实现

递归实现是一种最简单的深拷贝方式,其代码实现如下:

function deepClone(obj) {
  if (obj === null || typeof obj !== "object") {
    return obj;
  }

  const newObj = Array.isArray(obj) ? [] : {};

  for (let key in obj) {
    newObj[key] = deepClone(obj[key]);
  }

  return newObj;
}

该函数的参数obj为需要进行深拷贝的对象,如果该对象是基本类型或为null,直接返回即可。如果是数组或对象,则进行遍历并递归调用deepClone函数。

该方法的优点是实现简单易懂,缺点是递归耗费性能,在深度较大的对象或数组时可能会导致栈溢出的问题。

下面是一个示例:

<button @click="cloneObj">click me</button>
<div v-for="(item, index) in obj" :key="index">{{item}}</div>
export default {
  data() {
    return {
      obj: {
        name: "Tom",
        age: 18,
        friends: ["Jerry", "Jack"],
        address: {
          city: "New York",
          district: "Manhattan",
        },
      },
    };
  },
  methods: {
    cloneObj() {
      const newObj = deepClone(this.obj);
      newObj.name = "Lucy";
      newObj.friends.push("Lily");
      newObj.address.city = "San Francisco";
      this.obj = newObj;
    },
  },
};

在上面示例中,当我们点击按钮触发cloneObj函数时,会将原对象深拷贝一份,并修改其中的内容并将其赋值给data中的obj。当页面重新渲染时,我们可以看到原对象并未被修改。

2. JSON.parse/stringify

第二种实现方式是通过JSON.parse和JSON.stringify方法来实现深拷贝,如下所示:

function deepClone(obj) {
  return JSON.parse(JSON.stringify(obj))
}

该方法的优点是效率较高,而且可以处理对象中的函数、undefined等类型,不会受栈的限制。但是该方法有一些缺点,比如当对象中存在循环引用时,会导致函数陷入死循环,并且对于日期、正则表达式等类型的数据无法处理,会被转化成字符串。

下面是一个示例:

<button @click="cloneObj">click me</button>
<div v-for="(item, index) in obj" :key="index">{{item}}</div>
export default {
  data() {
    return {
      obj: {
        name: "Tom",
        age: 18,
        friends: ["Jerry", "Jack"],
        address: {
          city: "New York",
          district: "Manhattan",
        },
      },
    };
  },
  methods: {
    cloneObj() {
      const newObj = deepClone(this.obj);
      newObj.name = "Lucy";
      newObj.friends.push("Lily");
      newObj.address.city = "San Francisco";
      this.obj = newObj;
    },
  },
};

通过上面的示例我们可以看到,当我们点击按钮触发cloneObj函数时,透过JSON.parse和JSON.stringify我们可以顺利地将原对象进行深拷贝,同样也能成功修改其中的内容并将其赋值给data中的obj。而在页面重新渲染时,我们仍可看到原对象并未被修改。

3. lodash库实现

第三种实现方式是通过使用lodash库中的cloneDeep方法来实现深拷贝,如下所示:

import cloneDeep from 'lodash/cloneDeep'

const newObj = cloneDeep(oldObj)

该方法的编写方式相对较简单,使用的方法也非常简洁,且能处理循环引用问题。但是需要注意该方法要消耗更多的性能资源,也需要引入lodash库。

下面是一个示例:

<button @click="cloneObj">click me</button>
<div v-for="(item, index) in obj" :key="index">{{item}}</div>
// 首先需要安装lodash依赖,在终端中输入 npm install lodash -S
import cloneDeep from 'lodash/cloneDeep'

export default {
  data() {
    return {
      obj: {
        name: "Tom",
        age: 18,
        friends: ["Jerry", "Jack"],
        address: {
          city: "New York",
          district: "Manhattan",
        },
      },
    };
  },
  methods: {
    cloneObj() {
      const newObj = cloneDeep(this.obj);
      newObj.name = "Lucy";
      newObj.friends.push("Lily");
      newObj.address.city = "San Francisco";
      this.obj = newObj;
    },
  },
};

在上面示例中,我们可以看到当我们点击按钮触发cloneObj函数时,通过lodash.library库中的cloneDeep方法我们可以顺利地进行深拷贝,并成功修改其中的内容并将其赋值给data中的obj。当页面重新渲染时,我们同样可以看到原对象并未被修改。

总结

到此,我们就完成了vue深拷贝的三种实现方式的攻略,它们分别为递归实现、JSON.parse/stringify、lodash库实现。不同的实现方式针对不同的场景有着各自的优缺点,请根据具体的情况合理选择深拷贝方式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue深拷贝的3种实现方式小结 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • 使用Vue实现简单计算器

    当使用Vue实现简单计算器时,需要进行以下步骤: 安装Vue.js 使用Vue.js开发应用程序之前,需要先安装Vue.js。可以通过以下两种方式安装: 通过CDN引入Vue.js文件 可以在html文件中使用CDN引入Vue.js文件。使用CDN可以快速方便地开始使用Vue.js,并且可以避免下载和安装Vue.js的麻烦。 <script src=&…

    Vue 2023年5月29日
    00
  • 用vuex写了一个购物车H5页面的示例代码

    下面就是使用Vuex写购物车H5页面的攻略,具体步骤如下: 1. 安装所需依赖 首先,在终端中切换到你的项目目录下,使用以下命令安装所需依赖: npm install vuex –save-dev 2. 创建Vuex store 在src目录下创建store目录,并在其中创建index.js文件。在index.js文件中,先引入Vue和Vuex: impo…

    Vue 2023年5月27日
    00
  • Vue-cli3执行serve和build命令时nodejs内存溢出问题及解决

    当使用Vue-cli3执行serve和build命令时,可能会遇到nodejs内存溢出问题,此时需要进行相应的解决。 问题原因分析 执行serve和build命令时,vue-cli会在内存中对项目进行打包和编译,当项目较大时,内存使用过于频繁,会导致nodejs内存溢出。这时候我们需要修改nodejs默认的最大内存限制,以解决此问题。 解决方案 修改pack…

    Vue 2023年5月28日
    00
  • 解决vue.js提交数组时出现数组下标的问题

    当使用Vue.js提交表单数据数组时,会出现一个常见的问题,即无法获取到数组的下标,导致后台无法正确处理提交的数据。解决这个问题的方法很简单,本文将提供一些完整的攻略,帮助您解决这个问题。 问题分析 接下来的代码创建了一个表单,其中包含了一个可变长度的input数组。我们尝试提交这个表单,并触发表单提交事件: <form @submit.prevent…

    Vue 2023年5月29日
    00
  • laravel5.4+vue+element简单搭建的示例代码

    下面详细讲解如何搭建“laravel5.4+vue+element简单搭建的示例代码”,并提供两个示例说明。 准备工作 安装composer 安装laravel5.4 安装npm 安装vue 安装element-ui 搭建步骤 1. 初始化Laravel项目 使用如下命令初始化一个laravel项目: composer create-project –pr…

    Vue 2023年5月28日
    00
  • VUEJS实战之修复错误并且美化时间(2)

    让我来为您详细讲解一下“VUEJS实战之修复错误并且美化时间(2)”的完整攻略。 1. 简介 本文是继“VUEJS实战之修复错误并且美化时间(1)”之后,对于时间美化功能的扩展。在上一篇文章中,我们已经完成了将时间戳转换为固定格式的日期字符串。但是,我们发现显示出来的时间还是不够美观,需要进行美化。 2. 时间美化 在Vue.js中,我们可以使用Moment…

    Vue 2023年5月28日
    00
  • vue v-model的详细讲解(推荐!)

    针对这个问题,我结合我的理解和经验,给出以下完整攻略: Vue v-model的详细讲解 什么是v-model v-model是Vue.js提供的一个双向数据绑定的指令。在表单元素中使用v-model指令,可以方便地将表单元素的值绑定到Vue实例的数据上。 如何使用v-model 基本用法 我们可以将v-model指令添加到表单元素上,来实现数据的双向绑定。…

    Vue 2023年5月28日
    00
  • Vue实现导出excel表格功能

    下面是Vue实现导出Excel表格的完整攻略: 准备工作 引入xlsx库,可以通过以下命令安装 npm install xlsx –save。 在Vue项目中新建一个组件用来放置导出Excel的按钮。 示例代码 <template> <div> <button @click="generateExcel()&quot…

    Vue 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部