Vue2剥丝抽茧-响应式系统之watch2

本文详细探讨了Vue2中的watch系统,通过场景分析和实现思路,阐述了如何处理初始值变化以及监听对象内部变化的问题。通过解析watch选项,区分handler和immediate,确保在初始赋值时也能触发回调。同时,通过深度遍历和防死循环机制,实现了监听对象属性变化的功能,使watcher能有效应对对象整体和内部属性的更新。
摘要由CSDN通过智能技术生成

场景1

Vue2剥丝抽茧-响应式系统之watch 中,我们实现了 initWatch ,对于下边的代码

import { observe } from "./reactive";
import { initWatch } from "./state";
const options = {
    data: {
        title: "liang",
    },
    watch: {
        title(newVal, oldVal) {
            console.log("收到变化", newVal, oldVal);
        },
    },
};
observe(options.data);
initWatch(options.data, options.watch);

options.data.title = "changeTitle"; 

我们可以感知到 title 的变化,但 title 赋初始值的时候并不会感知到,Vue 中我们可以通过添加 immediate 属性来达到。

import { observe } from "./reactive";
import { initWatch } from "./state";
const options = {
    data: {
        title: "liang",
    },
    watch: {
        title: {
            handler(newVal, oldVal) {
                console.log("收到变化", newVal, oldVal);
            },
            immediate: true,
        },
    },
};
observe(options.data);
initWatch(options.data, options.watch);

options.data.title = "changeTitle"; 

回调函数是传递一个 handler 方法。

接下来我们来实现一下。

实现思路

其实思路非常简单,实现两点就可以:

  • 解析 handler ,将传入的 handleroptions 分开
  • 如果 immediatetrue ,立即执行一次回调函数

可以直接看代码了:

/**
 * Get the raw type string of a value, e.g., [object Object].
 */
const _toString = Object.prototype.toString;

/**
 * Strict object type check. Only returns tru
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值