uniapp$set详解

在Uniapp中,uniapp$set是一个非常重要的API。本文将从不同的角度对其进行详细的讲解,帮助读者更好地理解uniapp$set的功能和使用方法。

一、uniapp$set的基本语法

uniapp.$set(obj, key, value)

uniapp.$set是Vue.js中一个非常重要的工具函数,它主要用于改变Vue.js中响应式数据的值。uniapp.$set和Vue.set的语法完全一致,而Vue.set是Vue.js中的全局函数。

参数解释:

  • obj:要修改的响应式对象;
  • key:要修改的对象属性名称;
  • value:要设置的新值。

下面我们通过一个示例来展示uniapp$set函数的使用方法:

// 页面data中data对象
data: {
  userInfo: {
    name: '张三',
    age: 20,
    sex: '男'
  }
}

// 调用uniapp.$set修改响应式数据
uniapp.$set(this.userInfo, 'name', '李四');

上述代码就是使用uniapp.$set修改userInfo对象中的name属性值。

二、uniapp$set函数的使用场景

uniapp.$set主要用于解决Vue.js中对响应式数据的新增和删除操作无法触发视图更新的问题。为了更好地理解这个场景,我们可以通过下面一个例子来加深印象:

假设现在我们有一个数据列表,我们通过点击按钮的方式添加和删除数据。我们首先定义一个list数组:

data(){
  return{
    list:[]
  }
}

接下来我们定义一个add方法,每次调用它都会向list数组中添加一个新的对象:

add(){
  this.list.push({
    name:'张三',
    age:20,
    sex:'男'
  })
}

我们再定义一个remove方法,每次调用它都会删除list数组中的最后一个元素:

remove(){
  this.list.splice(this.list.length-1,1)
}

如果我们直接使用push和splice方法来添加和删除数据,问题就会出现了:每当我们添加或删除一条数据时,视图并不会立即更新,因为Vue.js几乎无法对数据新增或删除操作做出反应。

那么我们可以利用uniapp.$set函数来解决这个问题。每当我们添加一条数据时,调用uniapp.$set函数来改变数组的值:

add() {
  this.$set(this.list, this.list.length, {
    name: '张三',
    age: 20,
    sex: '男'
  })
}

接下来我们来改造一下remove方法,使用$set方法来删除list数组中的最后一个元素:

remove(){
  this.$set(this.list,this.list.length-1,null)
  this.list.pop()
}

这样我们就可以使用uniapp.$set来添加和删除数据,使得数据的变化能够及时地反映在视图中。

三、uniapp$set的底层实现原理

uniapp.$set背后的原理非常简单,它主要是利用Vue.js的Object.defineProperty方法来监测数据的变化。当我们利用uniapp.$set函数来改变数据时,Vue.js会自动调用Object.defineProperty方法来监测数据变化,从而触发视图更新。

下面我们来看一下uniapp.$set背后的实现原理:

export function $set(target: any, key: string | number, val: any): any {
  if (Array.isArray(target) && isValidArrayIndex(key)) {
    target.length = Math.max(target.length, key)
    // 利用 splice 方法来触发视图更新
    target.splice(key, 1, val)
    return val
  }
  if (key in target && !(key in Object.prototype)) {
    target[key] = val
    return val
  }
  const ob = (target: any).__ob__
  if (target._isVue || (ob && ob.vmCount)) {
    // 防止修改 Vue 实例或其 $data 对象
    return val
  }
  if (!ob) {
    target[key] = val
    return val
  }
  defineReactive(ob.value, key, val)
  ob.dep.notify()
  return val
}

从上面的代码中可以看出,如果target是一个数组,那么之所以使用splice方法来触发视图更新,是因为Vue.js能够监听到数组下标的变化,而使用splice方法能够触发数组下标的变化。如果target是一个对象且key是该对象的已有属性,那么直接将val赋值给该属性即可。如果key是该对象的新属性,那么使用defineReactive函数来监测这个新属性的变化。

四、uniapp$set的优缺点

uniapp.$set函数的主要优点在于它能够监听对象属性和数组下标的变化,从而让Vue.js能够及时地更新视图。同时,它还可以监听新属性的添加和删除,这样我们就不必在Vue.js初始化的时候就把所有的属性都定义好。

不过,uniapp.$set函数也有它的缺点。比如,调用该函数的代价比直接操作数据高得多。因为我们本来应该直接操作数据的,但是现在却要使用该函数来操作数据,这样会造成额外的开销,从而降低程序的执行效率。

五、总结

本文详细讲解了uniapp.$set函数的使用方法、使用场景、底层实现原理和优缺点。只有深入了解uniapp.$set函数,我们才能更好地使用它,从而让我们的程序更加高效、稳定和易于维护。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/248249.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝的头像小蓝
上一篇 2024-12-12 13:25
下一篇 2024-12-12 13:25

相关推荐

  • Python中set函数的作用

    Python中set函数是一个有用的数据类型,可以被用于许多编程场景中。在这篇文章中,我们将学习Python中set函数的多个方面,从而深入了解这个函数在Python中的用途。 一…

    编程 2025-04-29
  • Python Set元素用法介绍

    Set是Python编程语言中拥有一系列独特属性及特点的数据类型之一。它可以存储无序且唯一的数据元素,这使得Set在数据处理中非常有用。Set能够进行交、并、差集等操作,也可以用于…

    编程 2025-04-29
  • Python set去重保留原顺序

    当一个列表中出现重复的元素时,为了去除这些重复元素可以使用Python提供的集合(set)数据结构,集合可以去除元素的重复出现。然而,这样会导致原有的元素顺序混乱,这时,需要使用一…

    编程 2025-04-27
  • uniapp分页第二次请求用法介绍

    本文将从多个方面对uniapp分页第二次请求进行详细阐述,并给出对应的代码示例。 一、请求参数的构造 在进行分页请求时,需要传递的参数体包含当前页码以及每页显示的数据量。对于第二次…

    编程 2025-04-27
  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • 神经网络代码详解

    神经网络作为一种人工智能技术,被广泛应用于语音识别、图像识别、自然语言处理等领域。而神经网络的模型编写,离不开代码。本文将从多个方面详细阐述神经网络模型编写的代码技术。 一、神经网…

    编程 2025-04-25
  • Linux修改文件名命令详解

    在Linux系统中,修改文件名是一个很常见的操作。Linux提供了多种方式来修改文件名,这篇文章将介绍Linux修改文件名的详细操作。 一、mv命令 mv命令是Linux下的常用命…

    编程 2025-04-25
  • Python输入输出详解

    一、文件读写 Python中文件的读写操作是必不可少的基本技能之一。读写文件分别使用open()函数中的’r’和’w’参数,读取文件…

    编程 2025-04-25
  • nginx与apache应用开发详解

    一、概述 nginx和apache都是常见的web服务器。nginx是一个高性能的反向代理web服务器,将负载均衡和缓存集成在了一起,可以动静分离。apache是一个可扩展的web…

    编程 2025-04-25
  • 详解eclipse设置

    一、安装与基础设置 1、下载eclipse并进行安装。 2、打开eclipse,选择对应的工作空间路径。 File -> Switch Workspace -> [选择…

    编程 2025-04-25

发表回复

登录后才能评论