vue的响应式2

vue的响应式-2

  • 除了未被声明过和未被渲染的数据外,还有什么数据更改后不会渲染页面?

    1. 利用索引直接设置一个数组项时:

    <!-- 即使向数组中添加了第4项,数组仍然显示3项 -->
    <!-- 咳咳,一家三口,有第4个人也不能摆出来给大家看呀~ -->
    <div id="app">{{ list }}</div>
    
    const vm = new Vue({
      el: '#app'
      data: {
        dengFamily: ['邓哥', '小刘', '王小宝']
      }
    })
    vm.dengFamily[3] = '铁锤妹妹'; // 不是响应式的
    

    2. 修改数组的长度时:

    <!-- 更改了数组长度后,数组仍然显示1项 -->
    <div id="app">{{ list }}</div>
    
    const vm = new Vue({
      el: '#app'
      data: {
        dengWife: ['小刘']
      }
    })
    vm.dengWife.length = 0; // 不是响应式的
    

    3. 添加或删除对象:

    <!-- 身高还是那个身高,媳妇也只有一个,不要痴心妄想 -->
    <div id="app">{{ deng }}</div>
    
    const vm = new Vue({
      el: '#app'
      data: {
        deng: {
          wife: '小刘',
          son: '王小宝',
          weight: '100kg',
          height: '140cm',
          age: 60
        }
      }
    })
    vm.deng.secondWife = '铁锤妹妹'; // 不是响应式的
    delete vm.deng.height; // 不是响应式的
    
  • 问:要如何响应式的更新数组和对象?

    更改数组:
    1. 利用数组变异方法:push、pop、shift、unshift、splice、sort、reverse
    2. 利用vm.$set/Vue.set实例方法
    3. 利用vm.$set或Vue.set删除数组中的某一项

    vm.$set是Vue.set的别名
    使用方法:Vue.set(object, propertyName, value),也就是这个意思:Vue.set(要改谁,改它的什么,改成啥)

    vm.$delete是Vue.delete的别名
    使用方法:Vue.delete(object, target),也就是这个意思:Vue.delete(要删除谁的值,删除哪个)

    <!-- 从此,一家三口过上了愉快生活 -->
    <div id="app">{{ list }}</div>
    
    const vm = new Vue({
      el: '#app'
      data: {
        dengFamily: ['邓哥', '小刘', '王小宝']
      }
    })
    // 使用数组变异方法
    vm.dengFamily.push('铁锤妹妹');
    // 使用vm.$set
    vm.$set(vm.dengFamily, 3, '铁锤妹妹');
    
    
    <!-- 邓哥的媳妇多了起来~ -->
    <div id="app">{{ list }}</div>
    
    const vm = new Vue({
      el: '#app'
      data: {
        dengWife: ['小刘']
      }
    })
    // 更改长度时,可以用数组的splice方法
    vm.dengWife.splice(100); 
    

    更改对象:
    1. 添加利用vm.$set/Vue.set实例方法
    2. 删除利用vm.$delete/Vue.delete方法

    <div id="app">{{ deng }}</div>
    
    const vm = new Vue({
      el: '#app'
      data: {
        deng: {
          wife: '小刘',
          son: '王小宝',
          weight: '100kg',
          height: '140cm',
          age: 60
        }
      }
    })
    // 添加
    vm.$set(vm.deng, 'secondWife', '铁锤妹妹');
    // 删除
    vm.$delete(vm.deng, 'height')
    
  • 总结:

    更改数组用变异方法,就够了
    更改对象就用vm.$set和vm.$delete

  • 问题解决了,但是为什么会这样呢?

    Object.defineProperty的锅,咱们下节课说~

### 响应式原理对比:Vue 2 vs Vue 3 在 Vue 2Vue 3 中,响应式机制的实现方式存在显著差异,这些差异直接影响了框架的性能、灵活性以及开发者体验。 #### Vue 2响应式机制 Vue 2 使用 `Object.defineProperty` 方法来实现数据的响应式。具体来说,当一个对象被传入 Vue 实例的 `data` 选项时,Vue 会递归遍历该对象的所有属性,并为每个属性定义 `get` 和 `set` 方法。这样,当属性被读取或修改时,Vue 能够捕获这些操作并触发相应的更新逻辑。然而,这种方法存在一些局限性: - **对象响应化**:需要递归遍历每个 key,这可能导致性能问题,尤其是在处理大型对象时。 - **数组响应化**:Vue 2 通过覆盖数组原型方法(如 `push`, `pop`, `shift`, `unshift`, `splice`, `sort`, `reverse`)来实现数组的响应式。这种方法虽然有效,但增加了额外的复杂度。 - **Map/Set/Class 等无法响应式**:由于 `Object.defineProperty` 的限制,Vue 2 无法直接支持 `Map`, `Set`, `Class` 等复杂数据结构的响应式。 - **语法限制**:Vue 2 要求开发者必须在 `data` 中预先声明所有属性,否则新增的属性不会自动成为响应式的。例如,`vm.b = 2;` 不会触发视图更新 [^2]。 ```javascript // Vue 2 示例 let p = {}; Object.defineProperty(p, 'name', { configurable: true, get() { console.log("获取"); return obj.name; }, set(value) { console.log("重新设置了"); obj.name = value; } }); ``` #### Vue 3 的响应式机制 Vue 3 引入了 `Proxy` 和 `Reflect` 来替代 `Object.defineProperty`,从而解决了 Vue 2 中的一些问题。`Proxy` 可以拦截对整个对象的操作,而不仅仅是单个属性。这使得 Vue 3 的响应式机制更加高效和灵活: - **对象响应化**:Vue 3 使用 `Proxy` 来拦截对整个对象的操作,包括读取、写入和删除属性。这避免了 Vue 2 中需要递归遍历每个属性的开销。 - **数组响应化**:由于 `Proxy` 可以直接拦截数组的操作,Vue 3 不再需要覆盖数组原型方法,简化了实现并提高了性能。 - **支持更多数据结构**:Vue 3 的响应式机制不仅支持普通对象,还支持 `Map`, `Set`, `Class` 等复杂数据结构的响应式。 - **动态属性支持**:Vue 3 允许在运行时动态添加和删除属性,而这些操作仍然可以触发响应式更新。 ```javascript // Vue 3 示例 let person = { name: 'psr' }; const p = new Proxy(person, { get(target, propName) { console.log("获取"); return Reflect.get(target, propName); }, set(target, propName, value) { console.log("重新设置了"); Reflect.set(target, propName, value); }, deleteProperty(target, propName) { console.log("删除"); return Reflect.deleteProperty(target, propName); } }); ``` #### 性能与灵活性 Vue 3 的 `Proxy` 实现不仅提高了性能,还增强了框架的灵活性。由于 `Proxy` 可以拦截整个对象的操作,Vue 3 在处理大型对象和复杂数据结构时表现更佳。此外,Vue 3 的响应式系统还引入了 `reactive` 和 `ref` 等新的 API,使得开发者可以更方便地管理响应式数据 [^4]。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小李学软件

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

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

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

打赏作者

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

抵扣说明:

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

余额充值