Vue.set()和this.$set()的区别和联系,什么场景该用哪一个,清晰明了

之前了解这个方法的时候,感觉这一辈子也用不到这个方法,因为当时没有应用场景,但是还真有用的时候🤣,我相信你们也有用到时候。

从三个方面给大家说一下这个this. s e t : 1. t h i s . set: 1.this. set:1.this.set实现什么功能,为什么要用它?
2.怎么用它?
3.应用场景
1.this. s e t 实 现 什 么 功 能 , 为 什 么 要 用 它 ? 当 你 发 现 你 给 对 象 加 了 一 个 属 性 , 在 控 制 台 能 打 印 出 来 , 但 是 却 没 有 更 新 到 视 图 上 时 , 也 许 这 个 时 候 就 需 要 用 到 t h i s . set实现什么功能,为什么要用它? 当你发现你给对象加了一个属性,在控制台能打印出来,但是却没有更新到视图上时,也许这个时候就需要用到this. setthis.set()这个方法了,简单来说this. s e t 的 功 能 就 是 解 决 这 个 问 题 的 啦 。 官 方 解 释 : 向 响 应 式 对 象 中 添 加 一 个 属 性 , 并 确 保 这 个 新 属 性 同 样 是 响 应 式 的 , 且 触 发 视 图 更 新 。 它 必 须 用 于 向 响 应 式 对 象 上 添 加 新 属 性 , 因 为 V u e 无 法 探 测 普 通 的 新 增 属 性 ( 比 如 t h i s . m y O b j e c t . n e w P r o p e r t y = ′ h i ′ ) , 你 会 发 现 v u e 官 网 是 v u e . s e t , 我 们 现 在 讲 的 这 个 t h i s . set的功能就是解决这个问题的啦。官方解释:向响应式对象中添加一个属性,并确保这个新属性同样是响应式的,且触发视图更新。它必须用于向响应式对象上添加新属性,因为 Vue 无法探测普通的新增属性 (比如 this.myObject.newProperty = 'hi'),你会发现vue官网是vue.set,我们现在讲的这个this. setVue(this.myObject.newProperty=hi)vuevue.setthis.set()和它有什么关系呢?咱先说this.$set(),

2.怎么用它?
搞个栗子:

1.vue 中写在标签的代码
在这里插入图片描述
2.export default{}中data数据
在这里插入图片描述
3.点击按钮触发changeValue方法,

🌹调用方法:this.$set( target, key, value )

🌹 target:要更改的数据源(可以是对象或者数组)

🌹 key:要更改的具体数据

🌹 value :重新赋的值

在这里插入图片描述

4.在没有点击按钮的时候,界面是这样的,虽然界面没有显示出来,但是控制台已经打印出来了
在这里插入图片描述

5.当点击按钮的时候,调用this.$set方法,成功显示第三个属性,这就是整个过程啦😁
在这里插入图片描述

3.应用场景

当你需要为对象添加一个新属性时,试图不更新,用它!,

4、讲一下vue.set和this.$set区别和联系

Vue.set()和this.$set()实现原理
我们先来看看Vue.set()的源码:

import { set } from '../observer/index'
Vue.set = set

再来看看this.$set()的源码:

import { set } from '../observer/index'
...
Vue.prototype.$set = set
...

结果我们发现Vue.set()和this. s e t ( ) 这 两 个 a p i 的 实 现 原 理 基 本 一 模 一 样 , 都 是 使 用 了 s e t 函 数 。 s e t 函 数 是 从 . . / o b s e r v e r / i n d e x 文 件 中 导 出 的 , 区 别 在 于 V u e . s e t ( ) 是 将 s e t 函 数 绑 定 在 V u e 构 造 函 数 上 , t h i s . set()这两个api的实现原理基本一模一样, 都是使用了set函数。set函数是从 ../observer/index 文件中导出的,区别在于Vue.set()是将set函数绑定在Vue构造函数上, this. set()api使setset../observer/indexVue.set()setVuethis.set()是将set函数绑定在Vue原型上

function set (target: Array<any> | Object, key: any, val: any): any {
  if (process.env.NODE_ENV !== 'production' &&
    (isUndef(target) || isPrimitive(target))
  ) {
    warn(`Cannot set reactive property on undefined, null, or primitive value: ${(target: any)}`)
  }
  if (Array.isArray(target) && isValidArrayIndex(key)) {
    target.length = Math.max(target.length, key)
    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)) {
    process.env.NODE_ENV !== 'production' && warn(
      'Avoid adding reactive properties to a Vue instance or its root $data ' +
      'at runtime - declare it upfront in the data option.'
    )
    return val
  }
  if (!ob) {
    target[key] = val
    return val
  }
  defineReactive(ob.value, key, val)
  ob.dep.notify()
  return val
}

我们发现set函数接收三个参数分别为 target、key、val,其中target的值为数组或者对象,这正好和官网给出的调用Vue.set()方法时传入的参数参数对应上。

在这里插入图片描述

那一样的用法为什么要两种写法呢??!

受 ES5 的限制,Vue.js 不能检测到对象属性的添加或删除。因为 Vue.js 在初始化实例时将属性转为 getter/setter,所以属性必须在 data 对象上才能让 Vue.js 转换它,才能让它是响应的。
Vue 不允许动态添加根级响应式属性。
例如:

const app = new Vue({
  data: {
    a: 1
  }
  // render: h => h(Suduko)
}).$mount('#app1')

Vue.set(app.data, 'b', 2

)
在这里插入图片描述
正确写法:this.$set(this.data,”key”,value’)

只可以使用 Vue.set(object, propertyName, value) 方法向嵌套对象添加响应式属性,例如

```javascript
var vm=new Vue({
    el:'#test',
    data:{
        //data中已经存在info根属性
        info:{
            name:'小明';
        }
    }
});
//给info添加一个性别属性
Vue.set(vm.info,'sex','男');

这就是两者的区别啦,平时this.$set就够用了!

写的不好请多多指正

### Vue 选项式 API 与组合式 API 的工作原理及区别 #### 工作原理 Vue.js 提供了两种主要的 API 风格来定义组件逻辑:选项式 API (Options API) 组合式 API (Composition API)[^1]。 - **选项式 API**: 这种方式通过 `data`、`methods`、`computed` 等预定义选项来组织代码。开发者将数据、方法其他功能分门别类地放置到这些选项中,从而形成一种基于对象属性的方式来管理状态行为[^2]。 - **组合式 API**: 它允许开发者通过函数的形式直接操作响应式变量生命周期钩子。这种模式更加灵活,能够更好地支持逻辑复用,并且可以按需导入所需的模块[^3]。 #### 主要区别 ##### 1. 结构化差异 - **选项式 API** 使用固定的键名(如 data, methods, computed)来分类存储不同类型的逻辑[^4]。 - **组合式 API** 则鼓励按照功能性需求或者业务场景划分逻辑块,通常在一个 setup 函数内部完成所有的初始化设置[^5]。 ##### 2. 响应性机制处理 - 在 **选项式 API** 中,响应性的创建依赖于特定的方法比如 `this.$set()` 或者自动追踪的对象属性变化。 - 对于 **组合式 API**, 开发人员可以直接利用诸如 `ref`, `reactive` 来手动声明并控制哪些部分应该是反应式的。 ##### 3. 生命周期挂钩调用位置 - 在传统的 **选项式 API** 下,生命周期回调被绑定至各自的同名字段下(例如 created(), mounted()) . - 而在新的 **组合式 API** 设计里,可以通过 import 导入对应的 lifecycle hooks 并显式注册他们,在setup() 方法体内执行相应的动作. ##### 4. 复杂度与学习曲线 - 新手可能更容易理解直观简单的 **选项式 API** 架构因为它的命名清晰明了; - 另一方面,随着应用规模增大或遇到复杂交互时,**组合式 API** 展现出更强的优势因为它提供了更高的灵活性以及更好的逻辑分离能力。 #### 实现示例 下面分别给出两者的简单实现例子: ```javascript // Options API Example export default { data() { return { count: 0 }; }, methods: { increment() { this.count++; } } } ``` ```javascript // Composition API Example import { ref } from 'vue'; export default { setup() { const count = ref(0); function increment() { count.value++; } return { count, increment }; } } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黒客与画家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值