返回

Vue3 的响应式模块:构建动态应用程序

前端

了解 Vue3 的响应式模块

引言

Vue3 的响应式模块是框架中至关重要的组成部分,它使开发人员能够轻松创建对数据更改做出反应的动态应用程序。为了深入了解响应式机制的工作原理,本文将深入探讨 reactivity 模块的源代码,从概念到实现。

概念基础

响应式系统允许应用程序在数据更改时自动更新其 UI。Vue3 实现响应式性是通过使用 Proxy 对象来拦截数据的 getter 和 setter。当对响应式属性进行更改时,Proxy 对象会发出通知,Vue3 就会触发更新流程,使应用程序能够反映数据的最新状态。

Reactivity 模块源代码解读

建立代理

reactivity 模块的核心是 createReactivityObject 函数,该函数创建一个 Proxy 对象,代理底层数据对象。代理对象负责拦截数据操作并触发更新。

const createReactivityObject = (target) => {
  return new Proxy(target, {
    get: track,
    set: trigger,
  });
};

跟踪依赖项

当读取响应式属性时,track 函数会被调用。它将当前执行的函数(即依赖项)添加到跟踪器中,以便在数据更改时对其进行通知。

const track = (target, key) => {
  const effect = currentEffect;
  if (effect) {
    let depsMap = targetMap.get(target);
    if (!depsMap) {
      depsMap = new Map();
      targetMap.set(target, depsMap);
    }
    let deps = depsMap.get(key);
    if (!deps) {
      deps = new Set();
      depsMap.set(key, deps);
    }
    deps.add(effect);
  }
};

触发更新

当响应式属性被写入时,trigger 函数会被调用。它将迭代受影响的依赖项,触发它们的更新函数。

const trigger = (target, key, value, receiver) => {
  const depsMap = targetMap.get(target);
  if (!depsMap) return value;
  const effects = depsMap.get(key);
  if (effects) {
    effects.forEach((effect) => {
      if (effect !== currentEffect) {
        effect();
      }
    });
  }
  return value;
};

使用响应式数据

要使用响应式数据,开发人员可以使用 Vue3 提供的 ref 和 reactive API。ref 创建一个引用原始值的响应式包装器,而 reactive 创建一个响应式对象。

import { ref, reactive } from 'vue';

const count = ref(0);
const user = reactive({
  name: 'John',
  age: 30,
});

SEO 优化