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

yizhihongxing

本文将详细讲解三种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日

相关文章

  • next.js初始化参数设置getServerSideProps应用学习

    下面我将为您详细讲解Next.js的初始化参数设置和getServerSideProps的应用学习的完整攻略。 Next.js 初始化参数设置 Next.js 是一个 React 框架,可以用于实现服务器渲染的 React 应用。初始化 Next.js 项目时,可以进行一些参数设置,以满足我们的应用程序需求。 一、创建项目 首先,您需要先在您的电脑中安装 N…

    Vue 2023年5月28日
    00
  • webpack4打包vue前端多页面项目

    关于“webpack4打包vue前端多页面项目”的攻略,我会从以下几个方面进行详细讲解: 安装webpack及相关依赖 配置webpack 多页面配置 示例说明 下面我们将一步一步进行讲解。 1. 安装webpack及相关依赖 首先,我们需要全局安装webpack和webpack-cli,这里我使用的是webpack4版本: npm install webp…

    Vue 2023年5月28日
    00
  • Vue.js实现多条件筛选、搜索、排序及分页的表格功能

    标题:Vue.js实现多条件筛选、搜索、排序及分页的表格功能攻略 介绍 在Vue.js中实现一个具有多条件筛选、搜索、排序及分页功能的表格,是一个非常常见的需求。这种表格通常用于展示大量数据,让用户可以方便地查找并进行各种操作。在本篇攻略中,将介绍如何使用Vue.js实现这样一个表格功能。 步骤 步骤一 – 准备和设计数据结构 在实现这样一个表格功能之前,需…

    Vue 2023年5月29日
    00
  • Vue中v-for的数据分组实例

    接下来我将为你讲解“Vue中v-for的数据分组实例”的完整攻略,让你更好的掌握Vue中v-for的数据处理机制。 对于大多数的Vue初学者来说,熟练掌握v-for指令是非常基础且关键的一步,而其中较为复杂的一个用法就是数据分组。在Vue中使用v-for指令对数据进行分组可以使数据的结构更加清晰,利于后续的数据处理和展示。 那么如何在Vue中实现数据分组呢?…

    Vue 2023年5月27日
    00
  • Vue之Mixins(混入)的使用方法

    下面是“Vue之Mixins(混入)的使用方法”的完整攻略。 什么是Mixins(混入) Mixin是一种以重用为主的组件方式。其实就是将多个Vue组件中可重用的配置对象提取出来,然后通过mixins把这些对象合并到Vue组件中的属性和方法中,这样就可以使得这些Vue组件共享相同的功能和配置。 Mixins的使用方法 要使用Mixins,需要在Vue组件中使…

    Vue 2023年5月28日
    00
  • Vue源码学习之初始化模块init.js解析

    针对“Vue源码学习之初始化模块init.js解析”的完整攻略,我将从以下几个方面进行详细讲解。 标题 本文将重点讲解Vue源码中的init.js文件,即Vue实例的初始化模块,其中包含了Vue实例在创建过程中的各种初始化操作。 代码示例 首先,让我们来看一下init.js中的代码示例: export function initState (vm: Comp…

    Vue 2023年5月28日
    00
  • Vue 页面监听用户预览时间功能的实现代码

    实现Vue页面监听用户预览时间功能的主要思路是利用IntersectionObserver API对页面元素的可见性进行监测,然后根据元素的可见性计算预览时间。下面给出完整的实现步骤: Step 1: 引入IntersectionObserver API。在页面的HTML文件中加入如下代码: <script src="https://poly…

    Vue 2023年5月29日
    00
  • 关于VueSSR的一些理解和详细配置

    关于VueSSR的一些理解和详细配置 VueSSR简介 Vue Server-Side Rendering(Vue SSR)是为了解决客户端渲染(CSR)中的SEO(Search Engine Optimization)问题而出现的。Vue SSR使用Node.js的服务器渲染Vue组件,在服务器端将Vue组件渲染成HTML并将其发送给客户端。在客户端接收到…

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