weex-使用Vue.set设置属性和使用this.xxx设置属性的区别

本文详细解析了在Weex开发过程中,如何正确使用Vue.set和this.xxx进行属性赋值。阐述了两者之间的区别及适用场景,帮助开发者理解何时使用何种方式更新数据。

在使用weex过程中,免不了要自定义组件,或者说封装子控件,这时候需要把父组件的一些值传递到子控件中并作出相应的操作,这时候就要使用props来进行传值,但是在赋值的时候,具体通过Vue.set来修改属性还是通过this.xxxx来修改是一个问题,不熟悉的人很容易被困扰到,下面博主将详细讲解下这两种赋值的使用方法和条件:
1.Vue.set
此处饮用vue官网的说法
此截图来自于vue官网,从这里可以看到vue.set的使用方法和参数特质,限制比较严格,之所以用vue.set是为了避开vue不能检测属性被添加的限制,简而言之就是,vue本身不能动态添加属性,添加一个不存在的属性,但是通过vue.set你可以这么干,这三个参数分别代表:

json对象(字典)/数组-------键值/数组中的index-------你要设置的新值

一定要注意,target只能是两种格式,一种是字典,或者说json对象,另一种是数组,切记!!!

2.this.xxx
什么情况下用到这个呢?这也是用来改变属性的一种设置方法它和Vue.set的区别是:
Vue 不允许在已经创建的实例上动态添加新的根级响应式属性(root-level reactive property)。但是它可以使用 Vue.set(object, key, value) 方法将响应属性添加到嵌套的对象上,这里this.xxxxx是针对没有嵌套的对象 所以不用vue.set反而更好,否则你的对象会被强制转为数组类型,博主已经体验过了,很不方便。
Vue 不允许在已经创建的实例上动态添加新的根级响应式属性(root-level reactive property)。但是它可以使用 Vue.set(object, key, value) 方法将响应属性添加到嵌套的对象上,这里this.content没有嵌套了 所以不用vue.set也可以的,或者说不用反而更好。



华丽丽的分割线
在此总结,如果传递的类型是string,Nsnumber,布尔,这样的类型是没有嵌套的,没有层级,只是一个变量,那就直接用this.xxxx来设置值,否则就需要上面的Vue.set来设置了。

博主下一篇博客,将会详细讲解怎么来设置属性,用实例给大家讲述,一步步教你学会自定义控件,并传值。

<think>我们正在讨论Vue 2中的Vue.setthis.$set区别。根据引用内容,我们可以总结如下: 1. 两者实现原理相同,都是使用了同一个set函数(来自../observer/index)。 2. 区别在于绑定位置不同: - Vue.set是绑定在Vue构造函数上的静态方法。 - this.$set是绑定在Vue原型上的实例方法,因此在Vue实例内部可以通过this来访问。 使用场景: -Vue实例外部(例如在普通的js文件中)修改响应式对象时,使用Vue.set-Vue实例内部(例如在组件的方法、生命周期钩子等)修改响应式对象时,使用this.$set。 这样设计的原因是为了让在实例外部也能触发响应式更新,同时保持实例内部方法的便捷性。 注意:在Vue 3中,这两个API都被移除了,因为Proxy可以自动处理新增属性。 下面按照要求回答: </think>### Vue.set this.$set区别详解 在 Vue 2 响应式系统中,`Vue.set` `this.$set` 都用于解决对象属性新增/删除的响应式问题,但它们在使用场景实现方式上存在关键差异: --- ### **1. 绑定位置不同**[^1][^2] ```javascript // Vue.set:静态方法,绑定在 Vue 构造函数上 import Vue from 'vue' Vue.set(target, key, value) // this.$set:实例方法,绑定在 Vue 原型上 export default { methods: { updateData() { this.$set(this.obj, 'newProp', value) } } } ``` **差异说明**: - `Vue.set` 是 **全局静态方法**,可在任何位置调用(包括非 Vue 环境) - `this.$set` 是 **实例方法**,只能在 Vue 组件实例内部使用[^1] --- ### **2. 使用场景差异**[^4] | **场景** | `Vue.set` | `this.$set` | |------------------------|---------------------------|---------------------------| | **组件内部** | 可用但冗余 | ✅ 推荐使用 | | **插件/工具函数** | ✅ 无组件上下文时使用 | ❌ 不可用 | | **Vuex 的 mutation** | ✅ 修改 store 状态 | ❌ 无 this 上下文 | | **动态模块注册** | ✅ 添加新模块响应式属性 | ❌ 不适用 | **典型用例**: ```javascript // 在工具函数中使用 Vue.set import Vue from 'vue' function addProp(obj) { Vue.set(obj, 'timestamp', Date.now()) // 无组件上下文时使用[^4] } // 在组件中使用 this.$set export default { methods: { addUserProp() { this.$set(this.user, 'isVerified', true) // 实例上下文中使用[^1] } } } ``` --- ### **3. 实现原理分析**[^2] 两者共享同一核心函数,但挂载位置不同: ```javascript // 源码实现(简化版) import { set } from '../observer/index' // Vue.set 绑定到构造函数 Vue.set = set // this.$set 绑定到原型 Vue.prototype.$set = set ``` **关键流程**: 1. 检测目标对象是否是响应式数据 2. 若为普通对象,直接添加属性并返回 3. 若为响应式对象: - 调用 `defineReactive` 定义新属性的 getter/setter - 手动触发依赖通知(`dep.notify()`) - 更新关联视图[^1][^2] --- ### **4. 使用建议** 1. **组件内优先用 `this.$set`** 更符合 Vue 上下文习惯,避免额外导入 Vue 2. **全局操作使用 `Vue.set`** 适用于: - Vue 插件开发 - 工具函数库 - Vuex store 的 mutation 操作 3. **替代方案参考** ```javascript // 对象替代方案 this.obj = { ...this.obj, newProp: value } // 数组替代方案(Vue 2this.items.splice(index, 1, newValue) ``` > **升级提示**:Vue 3 的 Proxy 响应式系统已移除这两个 API,可直接赋 `obj.newProp = value` 实现响应式更新[^4]。 ---
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

CodingFire

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

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

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

打赏作者

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

抵扣说明:

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

余额充值