Vue学习笔记:理解Vue2如何解决数组和对象的响应式问题

Vue2通过Object.defineProperty实现数据监听,但无法检测数组和对象内部变化。为解决此问题,Vue2对数组使用特殊变异函数,对对象深度遍历设置getter和setter。Vue3改用Proxy提高首屏加载速度。
摘要由CSDN通过智能技术生成

前言

Vue2是通过用Object…defineProperty来设置数据的getter和setter实现对数据和以及视图改变的监听的。对于数组和对象这种引用类型来说,getter和setter无法检测到它们内部的变化。那么Vue2是则么来解决这个问题的呢?
通过一个简单的例子来理解Vue2中是如何解决数组和对象的响应式问题。

基本的代码

<html>

<head>

</head>

<body>
  <script>
    //1. 定义一个data对象来模拟组件中的数据
    var data = {
   
      name: 'xwd',
      sex: 1,
      dog: {
   
        name: 'peter',
        age: 5
      },
      hobby: [
        "pingpang""basktetball"
      ]}
	//2. 对Data做 reactive化
    Observer(data)
	
    function Observer(data) {
   
		// 模拟组件初始化对Data reactive化
      if (typeof data != "object" || data == null) {
   
        return data
      }
      for (let item in data) {
   
        //将数据响应式化
        defineReactive(data, item, data[item])
      }
      return data
    }
	
    function defineReactive(target, key, value) {
   
      Object.defineProperty(target, key, {
   
        enumerable: false,
        configurable: false,
        get() {
   
		//用打印控制台模拟视图发生渲染
          console.log("视图渲染使用了数据")
          return value;
        },
        set(newValue) {
   
          if (newValue !== value) {
   
	
            value = newValue;
		    //用打印控制台模拟数据变更视图更新
            console.log(
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值