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前端测试开发watch监听data的数据变化

    当我们在使用Vue进行前端开发时,数据是我们不可避免的要处理的部分。而在开发时,我们需要不断地验证各种场景下数据的正确性,这就需要我们进行前端测试开发。 Vue为我们提供了watch属性,可以监听指定变量的变化并在变化时进行一些操作,如更新DOM或调用我们自己的函数等。 下面是watch监听data数据变化的完整攻略: 步骤1:为要监听的数据添加watch属…

    Vue 2023年5月29日
    00
  • Vue项目中使用jsonp抓取跨域数据的方法

    使用jsonp抓取跨域数据是前端开发中常用的一种方法,而在Vue项目中使用jsonp抓取跨域数据则需要注意一些细节。下面是Vue项目中使用jsonp抓取跨域数据的完整攻略: 1.概述 前端的同学们都知道,由于浏览器的同源策略限制,导致 Ajax 请求不能跨域。而 JSONP 是一种跨域请求的解决方案,可以通过 script 标签来实现跨域请求。Vue.js …

    Vue 2023年5月28日
    00
  • 在vue项目中,将juery设置为全局变量的方法

    在Vue项目中,使用jQuery需要将其设置为全局变量,下面是完整的攻略: 安装jQuery 首先,需要在项目中安装jQuery,可以使用npm或yarn进行安装。这里以npm为例: npm install jquery –save-dev 引入jQuery并设置为全局变量 在Vue项目的入口文件中(一般是main.js),需要引入jQuery并将其设置为…

    Vue 2023年5月28日
    00
  • vue3的自定义hook函数使用

    下面是关于Vue3自定义hook函数使用的完整攻略: 什么是自定义hook函数? 自定义hook实际上是一个函数,它可以在Vue组件之间重复使用的逻辑代码块。该函数具有一个标准化的结构,并返回一个可以在组件中使用的数据或函数。 自定义hook函数的规则 自定义hook应该遵循以下规则: 首先,自定义hook函数应该以 “use” 开头,这是一种约定,可以使你…

    Vue 2023年5月28日
    00
  • 详解Vue快速零配置的打包工具——parcel

    详解Vue快速零配置的打包工具——parcel 在Vue.js项目开发中,打包工具是必不可少的。常见的打包工具有Webpack、Rollup、Browserify等。这些打包工具都需要进行复杂的配置才能完成项目的打包。本文将介绍一种快速零配置的Vue打包工具——parcel,它可以快速地完成项目的打包,让我们能够更好地专注于代码的编写。 什么是parcel …

    Vue 2023年5月27日
    00
  • vue2与vue3双向数据绑定的区别说明

    vue2与vue3双向数据绑定的区别说明 前言 Vue是一款流行的前端框架,最新版本分别为vue2和vue3。其中数据的双向绑定是Vue的一大特色,Vue2和Vue3在双向绑定方面有明显的区别。本文将对Vue2和Vue3双向绑定的区别进行详解,并且提供两条示例说明。 Vue2的双向绑定 在Vue2中,实现双向绑定主要是通过v-model指令来实现的。在一个表…

    Vue 2023年5月27日
    00
  • Vue向后端传数据后端接收为null问题及解决

    针对“Vue向后端传数据后端接收为null问题及解决”这个问题,这里提供一个完整攻略来解决此问题。 问题背景 在使用Vue进行开发时,需要向后端传递数据,但是在后端测试时,接收到的数据却是null,这个问题很常见,主要原因是后端未能正确解析前端的请求数据。在这种情况下,我们需要在Vue中进行一些设置,以确保后端可以正确识别和解析请求数据。 解决方案 方案一:…

    Vue 2023年5月27日
    00
  • Vue实现商品放大镜效果

    接下来我将详细讲解“Vue实现商品放大镜效果”的完整攻略,过程中会包含两个示例说明。 什么是商品放大镜效果 商品放大镜效果指在网站的商品详情页面中,当用户将鼠标悬停在商品图片上时,放大镜会展示图像的更高分辨率。这种效果可以让用户更清楚地查看商品的细节,提高用户的购买欲望,因此在电商网站中非常常见。 在实现商品放大镜效果时,我们需要用到一些技术,包括HTML、…

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